根据PMG协程并发模型,golang在运行时会生成Processor,其数量默认等于宿主机cpu核数。但是在云上环境中,通常只会分配给部分宿主机的cpu资源。做如下分析:
一、不同情况下GOMAXPROCS的获取情况
测试环境配置:
本地mac,intel i7 六核
1、直接运行程序,显示GOMAXPROCS为12(原因:intel芯片超线程技术,每个核心支持2个线程,六核芯片可以对外提供12个线程)
2、docker镜像直接运行,显示GOMAXPROCS为6(正常)
3、 将docker镜像运行在k8s集群中,同时配置yaml限制cpu:1,仍显示GOMAXPROCS为6
二、一些结论
1、GOMAXPROCS默认为运行环境的CPU核数,go语言获取系统核数底层原理为:系统调用sched_getaffinity。对于mac电脑来说返回的是虚拟核数,并不是真实核数;
2、对于上云的go服务,go获取的核数为宿主机核数,而不是k8s中的配置。
目前调研到的影响有,在以下两个场景中,该情况会对性能造成较大影响:
① CPU密集型服务(常见web应用为io密集型)
② k8s配置与宿主母机CPU核数相差较大
三、解决办法
在main.go中添加:
_ "go.uber.org/automaxprocs"