根据 2021 年对 Go 开发人员的调查,使用 Go 编写服务是最常见的用途。同时,Kubernetes 是部署这些服务的最广泛使用的平台。了解在 Docker 和 Kubernets 中运行 Go 的含义非常重要,可防止出现 CPU 节流等常见情况。
GOMAXPROCS 变量定义了负责同时执行用户级代码的操作系统线程的限制。在默认情况下,它被设置为 CPU 的逻辑核心数。这在 Docker 和 Kubernetes 的上下文中意味着什么 ?
假设我们的Kubernetes 集群由 8 个核心节点组成。当一个容器被部署在 Kubernetes 中时,我们可以定义一个CPU限制来确何一个应用程序不会耗尽宿主机的所有资源。例如,以下配置将 CPU 的使用限制为 4000 资源单位 (或毫核),因此有4 个 CPU 内核:
spec:
containers:
- name: myapp
image: myapp
resources:
limits:
cpu: 4000m
我们可以假设,当应用程序被部署时,GOMAXPROCS 将基于这些限制,因此值为 4。但事实并非如此;它被设置为主机上的逻辑核心数: 8。那么,这有什么影响呢?
Kubernetes 使用完全公平调度程序(CFS) 作为进程调度程序。CFS 还用于对 Pod 资源实施CPU 限制。在管理 Kubernetes 集群时,管理员可以配置以下这两个参数:
- cpu.cfs_period_us (全局设置)
- cpu.cfs_quota_us (每个