go - 在 Kubernetes 中,Go 容器是否会在另一个容器使用内核时使用所有内核

标签 go kubernetes google-kubernetes-engine cpu-usage

场景:在一个16核的节点上,一个Go服务/容器与另一个容器在一个pod中运行,其中另一个分配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 时,我必须注意节流。

最佳答案

容器将看到机器上的所有核心。 Kubernetes 限制所做的是设置 cgroup,告诉内核容器可以消耗多少 CPU。这意味着虽然 Go 会看到所有内核,但当他试图超过限制时,内核会对其进行限制。这实际上是一件坏事。您希望 Go 了解 cgroups 并适本地扩展 GOMAXPROCS。为此,您可以使用 this

看起来您想要的是超额订阅。将请求设置得非常低,并在第一个容器上限制为 4 个内核。将请求设置得非常低,但第二次限制为 16 个内核(或根本不设置限制)。这样第二个容器将能够利用所有 CPU。

关于go - 在 Kubernetes 中,Go 容器是否会在另一个容器使用内核时使用所有内核,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61091826/

相关文章:

go - 使用 Gtk+ 的 C 接口(interface)构建 Go

GO:导入我的 go 文件时出错

docker - 绒布(网络层)和kubernetes中的ingress有什么区别?

docker - 找不到RPI Kubernetes节点上的Traefik返回404页面

kubernetes - 用于 headless 服务的 GKE 内部 Ingress

google-kubernetes-engine - 我可以在带有 NGINX INGRESS Controller 的 Google Kubernetes 引擎中使用 Google 托管证书吗?

api - 如何将数据从 Controller 传递到 go lang 中的表单?

go - 为什么 fmt.Printf() 会在内存地址等其他包中记录 `const`?

kubernetes - 用于 Pvc 和 StorageClass 故障转移的 GKE 区域磁盘

kubernetes - Google Cloud Build 部署到 GKE 私有(private)集群