Go语言 如何修改进程使用的逻辑CPU数量?

ryhaxcpt  于 2023-04-27  发布在  Go
关注(0)|答案(2)|浏览(174)

GOMAXPROCS设置可以同时执行的CPU的最大数量,并返回之前的设置。它的默认值为runtime.NumCPU。
NumCPU返回当前进程可用的逻辑CPU数。
下面的代码不会更改进程使用的逻辑CPU数量:

package main

import (
    "fmt"
    "runtime"
)

func main() {
    runtime.GOMAXPROCS(1)
    fmt.Println(runtime.NumCPU()) // Expected: 1  Actual: 8
}

在我的笔记本电脑里:

$ lscpu # shows eight virtual cores corresponding to eight OS threads
...
    Thread(s) per core:  2
    Core(s) per socket:  4
    Socket(s):           1

$ go version
go version go1.20.2 linux/amd64

如何修改程序使用的逻辑CPU?

zzoitvuj

zzoitvuj1#

如果你阅读了关于runtime.GOMAXPROCS和runtime.NumCPU()的文档,你会看到:
func NumCPU [...]
可用CPU集通过在进程启动时查询操作系统进行检查。进程启动后操作系统CPU分配的更改不会反映出来
“进程启动后对操作系统CPU分配的更改不会反映出来”,这就是为什么您看不到此值更改的原因。
现在让我们看看GOMAXPROCS的文档
func GOMAXPROCS [...]
GOMAXPROCS设置可以同时执行的CPU的最大数量,返回之前的设置,默认为runtime.NumCPU.如果n〈1,则不改变当前的设置,当调度器改进时,此调用将消失。
因此,您可以通过运行以下命令来检查当前设置的值:

fmt.Println(runtime.GOMAXPROCS(0))
brccelvz

brccelvz2#

没有矛盾。
GOMAXPROCS影响Go运行时将使用的进程/线程的数量。它们将在哪些CPU核心上执行将根据系统上的其他负载而变化。
NumCPU返回可用内核的数量。即使Go运行时配置为不利用所有内核,它也不会改变。
NumCPU将反映通过操作系统机制设置的限制,例如

user@host:~$ go run test.go
4

user@host:~$ taskset -c 0 go run test.go
1

相关问题