【发布时间】:2020-05-06 19:36:23
【问题描述】:
UNIX 命令下:
$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 2
Core(s) per socket: 2
Socket(s): 1
表演,
CPU(s): 4
Thread(s) per core: 2
即 4 X 2 = 8 个逻辑处理器。纠正我。
下面是另一个 Linux 命令:
$ cat /proc/cpuinfo
processor : 0
....
cpu cores : 2
.....
processor : 1
.....
cpu cores : 2
.....
processor : 2
.....
cpu cores : 2
.....
processor : 3
.....
cpu cores : 2
.....
$
但下面的程序只显示了 4 个逻辑处理器:
package main
import (
"fmt"
"runtime"
)
func main() {
fmt.Println(runtime.GOMAXPROCS(0)) // gives 4
fmt.Println(runtime.NumCPU()) // gives 4
}
输出:
$ go install github.com/myhub/cs61a
$ bin/cs61a
4
4
code$
更多细节:
$ go version
go version go1.14.1 linux/amd64
$ uname -a
Linux mohet01-ubuntu 4.15.0-99-generic #100-Ubuntu SMP Wed Apr 22 20:32:56 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
NumCPU 返回当前进程可用的逻辑 CPU 数量。
我的理解是,
Go 调度程序创建操作系统线程(M),这将相当于逻辑处理器的数量。
为什么运行时 api 没有给出 8 的值?
【问题讨论】:
-
这是什么版本的 Go?看起来这可能是运行时中的缺陷。
-
@Adrian
1.14我用go version输出编辑了查询。 -
lscpu 输出中的“CPU(s): 4”行是逻辑 CPU 的数量。您还可以在“On-line CPU(s) list: 0-3”行中看到这一点,它表示逻辑内核 0、1、2 和 3 当前在线(当前可用)。您也可以尝试在 shell 中运行以下命令来获取物理内核的数量:
grep 'cpu cores' /proc/cpuinfo | uniq -
@nussjustin 使用所需命令输出编辑查询
标签: multithreading go