返回Golang中的CPU插槽数、核心数和线程数。

huangapple go评论69阅读模式
英文:

Return number of CPU sockets, Cores, and Threads in Golang

问题

使用Golang,我正在尝试找到/编写一个函数,该函数将返回Linux系统的CPU插槽数、每个插槽的核心数和每个核心的线程数。例如,一个服务器可能有2个CPU,每个CPU有4个核心,并且支持超线程,每个CPU可以处理8个线程。

示例输出:

{
"CPUSockets": "2",
"CoresPerSocket": "4",
"ThreadsPerCore": "2"
}

问题:你知道有哪些Go包或伪代码可以提供这些信息吗?

注意:我已经查看了各种Go实现的psutil,但我找不到一个返回插槽数或区分核心和线程的实现。我想要的数据可以通过运行lscpu命令轻松获取,但我不知道如何使用Go访问它。

英文:

Using Golang I'm trying to find/write a function that would return the number of CPU Sockets, Cores per socket, and Threads per core a Linux system. For example, a server might have 2 CPUs each with 4 cores, with hyperthreading, it could handle 8 threads per CPU.

Sample Output:

{
  "CPUSockets": "2",
  "CoresPerSocket": "4",
  "ThreadsPerCore": "2"
}

Question: Do you know of any Go Package or pseudo code that could provide this information?

Note: I've looked at various go implementations of psutil but I can't find one that returns the number of sockets or distinguishes between Cores and Threads. The data I want is very easily accessible by running lscpu but I don't know how to access that using Go.

答案1

得分: 3

我已经弄清楚了,下面是翻译好的代码部分:

package main

import (
	"encoding/json"
	"fmt"
	"os/exec"
	"strconv"
	"strings"
)

type CPUInfo struct {
	Sockets        int32 `json:"sockets"`
	CoresPerSocket int32 `json:"cores_per_socket"`
	ThreadsPerCore int32 `json:"threads_per_core"`
}

func main() {
	out, _ := exec.Command("lscpu").Output()
	outstring := strings.TrimSpace(string(out))
	lines := strings.Split(outstring, "\n")
	c := CPUInfo{}

	for _, line := range lines {
		fields := strings.Split(line, ":")
		if len(fields) < 2 {
			continue
		}
		key := strings.TrimSpace(fields[0])
		value := strings.TrimSpace(fields[1])

		switch key {
		case "Socket(s)":
			t, _ := strconv.Atoi(value)
			c.Sockets = int32(t)
		case "Core(s) per socket":
			t, _ := strconv.Atoi(value)
			c.CoresPerSocket = int32(t)
		case "Thread(s) per core":
			t, _ := strconv.Atoi(value)
			c.ThreadsPerCore = int32(t)
		}
	}

	CPUInfoJSON, _ := json.MarshalIndent(c, "", "  ")
	fmt.Println(string(CPUInfoJSON))
}

输出结果:

tbenz9@ubuntu-dev: go run socket.go 
{
  "sockets": 1,
  "cores_per_socket": 2,
  "threads_per_core": 2
}
英文:

I ended up figuring it out, see below:

package main

import (
	&quot;encoding/json&quot;
	&quot;fmt&quot;
	&quot;os/exec&quot;
	&quot;strconv&quot;
	&quot;strings&quot;
)

type CPUInfo struct {
	Sockets        int32 `json:&quot;sockets&quot;`
	CoresPerSocket int32 `json:&quot;cores_per_socket&quot;`
	ThreadsPerCore int32 `json:&quot;threads_per_core&quot;`
}

func main() {
	out, _ := exec.Command(&quot;lscpu&quot;).Output()
	outstring := strings.TrimSpace(string(out))
	lines := strings.Split(outstring, &quot;\n&quot;)
	c := CPUInfo{}

	for _, line := range lines {
		fields := strings.Split(line, &quot;:&quot;)
		if len(fields) &lt; 2 {
			continue
		}
		key := strings.TrimSpace(fields[0])
		value := strings.TrimSpace(fields[1])

		switch key {
		case &quot;Socket(s)&quot;:
			t, _ := strconv.Atoi(value)
			c.Sockets = int32(t)
		case &quot;Core(s) per socket&quot;:
			t, _ := strconv.Atoi(value)
			c.CoresPerSocket = int32(t)
		case &quot;Thread(s) per core&quot;:
			t, _ := strconv.Atoi(value)
			c.ThreadsPerCore = int32(t)
		}
	}

	CPUInfoJSON, _ := json.MarshalIndent(c, &quot;&quot;, &quot;  &quot;)
	fmt.Println(string(CPUInfoJSON))
}

Output:

tbenz9@ubuntu-dev: go run socket.go 
{
  &quot;sockets&quot;: 1,
  &quot;cores_per_socket&quot;: 2,
  &quot;threads_per_core&quot;: 2
}

huangapple
  • 本文由 发表于 2016年2月24日 08:36:21
  • 转载请务必保留本文链接:https://go.coder-hub.com/35591107.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定