在 Kubernetes 中,Go 容器是否会在另一个容器使用内核时使用所有内核
In Kubernetes, will Go container use all cores when another is using cores
场景:在一个16核的节点上,一个Go service/container在一个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 程序会在请求中使用它们?我还想象当我在节点上缩放 pods 时,我必须注意节流。
容器将看到机器上的所有内核。 Kubernetes 限制所做的是设置 cgroup,告诉内核容器可以消耗多少 CPU。这意味着虽然 Go 会看到所有内核,但当他试图超过限制时,内核会对其进行限制。这实际上是一件坏事。您希望 Go 了解 cgroups 并适当地扩展 GOMAXPROCS。为此,您可以使用 this
看来你想要的是超额订阅。将请求设置得非常低,并在第一个容器上限制为 4 个内核。将请求设置得非常低,但第二次限制为 16 个内核(或根本不设置限制)。这样第二个容器将能够利用所有 CPU.
场景:在一个16核的节点上,一个Go service/container在一个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 程序会在请求中使用它们?我还想象当我在节点上缩放 pods 时,我必须注意节流。
容器将看到机器上的所有内核。 Kubernetes 限制所做的是设置 cgroup,告诉内核容器可以消耗多少 CPU。这意味着虽然 Go 会看到所有内核,但当他试图超过限制时,内核会对其进行限制。这实际上是一件坏事。您希望 Go 了解 cgroups 并适当地扩展 GOMAXPROCS。为此,您可以使用 this
看来你想要的是超额订阅。将请求设置得非常低,并在第一个容器上限制为 4 个内核。将请求设置得非常低,但第二次限制为 16 个内核(或根本不设置限制)。这样第二个容器将能够利用所有 CPU.