英文:
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 (
"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))
}
Output:
tbenz9@ubuntu-dev: go run socket.go
{
"sockets": 1,
"cores_per_socket": 2,
"threads_per_core": 2
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论