runtime

GOMAXPROCS的取值

3.1 虚拟机和物理机

我们知道可以通过

runtime.GOMAXPROCS()

来了设定P的值

Go 1.5开始, Go的GOMAXPROCS默认值已经设置为 CPU的核数, 这允许我们的Go程序充分使用机器的每一个CPU,最大程度的提高我们程序的并发性能。

但其实对于IO密集型的场景,我们可以把GOMAXPROCS的值超过CPU核数,在笔者维护的某个服务中,将GOMAXPROCS设为CPU核数的2倍,压测结果表明,吞吐能力大概能提升10%

3.2 容器中

在容器中,Golang程序获取的是宿主机的CPU核数导致GOMAXPROCS设置的过大。比如在笔者的服务中,宿主机是48cores,而实际container只有4cores。 线程过多,会增加上线文切换的负担,白白浪费CPU。 uber-go/automaxprocs 可以解决这个问题

package main

import (
    "fmt"
    _ "go.uber.org/automaxprocs"
    "runtime"
)

func main() {
    // Your application logic here.
    fmt.Println("real GOMAXPROCS", runtime.GOMAXPROCS(-1))
}

另外也可以通过设置环境变量GOMAXPROCS来改变Golang程序的GOMAXPROCS默认值

支付宝打赏 微信打赏

来杯咖啡~

文章导航