GOMAXPROC在容器中获取的问题

411 阅读1分钟

根据PMG协程并发模型,golang在运行时会生成Processor,其数量默认等于宿主机cpu核数。但是在云上环境中,通常只会分配给部分宿主机的cpu资源。做如下分析:

一、不同情况下GOMAXPROCS的获取情况

测试环境配置: 本地mac,intel i7 六核
1、直接运行程序,显示GOMAXPROCS为12(原因:intel芯片超线程技术,每个核心支持2个线程,六核芯片可以对外提供12个线程) 企业微信截图_0813c040-89a7-4f9d-8fda-bfbcdf59e96c.png 2、docker镜像直接运行,显示GOMAXPROCS为6(正常) 企业微信截图_eca3399f-b859-41b4-ad4a-7b8b3dd39289.png 3、 将docker镜像运行在k8s集群中,同时配置yaml限制cpu:1,仍显示GOMAXPROCS为6 企业微信截图_6d9ba777-6473-4240-ab4f-4629a342dfd3.png

二、一些结论

1、GOMAXPROCS默认为运行环境的CPU核数,go语言获取系统核数底层原理为:系统调用sched_getaffinity。对于mac电脑来说返回的是虚拟核数,并不是真实核数;

2、对于上云的go服务,go获取的核数为宿主机核数,而不是k8s中的配置。

目前调研到的影响有,在以下两个场景中,该情况会对性能造成较大影响:

① CPU密集型服务(常见web应用为io密集型)

② k8s配置与宿主母机CPU核数相差较大

三、解决办法

在main.go中添加:

 _ "go.uber.org/automaxprocs"