场景:在16核节点上,Go服务/容器在带有另一个容器的容器中运行,其中另一个容器分配了4核,并且go容器设置为使用GOMAXPROCS
。
在使用goroutine的请求中,Go程序将利用它可用的所有CPU。我认为这取决于GOMAXPROCS
,但不确定是否仅看到Pod启动时使用的1核全部在计算机上。
理想情况下,我希望CPU密集型请求使用所有可用的CPU,但是很难衡量运行时(GKE)实际发生的情况。
kube top
显示空闲时的预期内容:
POD NAME CPU(cores) MEMORY(bytes)
pod-go-py go-service 1m 862Mi
pod-go-py py-service 4m 489Mi
fmt.Println(runtime.NumCPU())
显示16个可用内核。因此,我可以相信Go程序会在请求中充分利用它们吗?我还可以想象,在节点上扩展Pod时,Ill必须注意节流。
答案是否
容器将看到计算机上的所有内核。 Kubernetes的限制是设置cgroup,它告诉内核容器可以消耗多少CPU。这意味着,尽管Go将看到所有内核,但是当他尝试超过限制时,内核将对其进行限制。这实际上是一件坏事。您希望Go知道cgroup并适当扩展GOMAXPROCS。为此,您可以使用this