go - 在 Kubernetes 中,当另一个容器正在使用内核时,Go 容器是否会使用所有内核
问题描述
场景:在一个 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。为此,您可以使用此
看起来你想要的是超额认购。在第一个容器上将请求设置为非常低并限制为 4 个核心。将请求设置得非常低,但在第二个时限制为 16 个核心(或根本不设置限制)。这样,第二个容器将能够利用所有 CPU。
推荐阅读
- javascript - 面临 CORS 政策问题
- angular - 如何在 ABP.io 框架中将 Angular UI 主题更改为 ngx-admin
- jestjs - 如何在某些条件下退出玩笑测试 beforeAll 签入?
- taxonomy - 如何删除属于特定分类的序列?
- javascript - img 设置 flex-grow 填充 flex 容器剩余空间,导致 flex 内部溢出 flex 容器
- javascript - 反应脚本的问题。不启动应用程序。(依赖问题)
- swift - P-Asserted-Identity liblinphone iOS SDK
- java - 如何在springboot中为我的pojo类设置DTO请求、响应、控制器和服务
- scala - 澄清 Scala 中函数与方法语法的奇怪情况
- maven - Maven - 如何部署一个 .properties 文件