在 Go 容器里设置 GOMAXPROCS 的正确姿势

GOMAXPROCS 是 Go 提供的非常重要的一个环境变量。通过设定 GOMAXPROCS,用户可以调整调度器中 Processor(简称P)的数量。由于每个系统线程必须要绑定 P ,P 才能把 G 交给 M 执行。如下图所示

43b3d328caa6fc20b36847291d945b67.png所以 P 的数量会很大程度上影响 Go Runtime 的并发表现。GOMAXPROCS 在 Go 1.5 版本后的默认值是机器的 CPU 核数 (runtime.NumCPU)。通过下面的代码片段可以获取当前机器的核心数和给 GOMAXPROCS 设置的值。

package main

import (
 "fmt"
 "runtime"
)

func getGOMAXPROCS() int {
 _ :=  runtime.NumCPU() // 获取机器的CPU核心数
 return runtime.GOMAXPROCS(0) // 参数为零时用于获取给GOMAXPROCS设置的值
}

func main() {
 fmt.Printf("GOMAXPROCS: %d\n", getGOMAXPROCS())
}

而以 Docker 为代表的容器虚拟化技术,会通过 cgroup 等技术对 CPU 资源进行隔离。以 Kubernetes 为代表的基于容器虚拟化实现的资源管理系统,也支持这样的特性,比如下面这个 PodTemplate 的容器的定义里 limits.cpu = 1000m 就代表给这个容器分配1个核心的使用时间。

c8050db94e2f83a83c96df761478cf18.png

这类技术对 CPU 的隔离限制,导致 runtime.NumCPU() 无法正确获取到容器被分配的 CPU 资源数。runtime.NumCPU()获取的是宿主机的核心数。

设置 GOMAXPROCS 高于真正可使用的核心数后会导致Go调度器不停地进行OS线程切换,从而给调度器增加很多不必要的工作。

目前 Go 官方并无好的方式来规避在容器里获取不到真正可使用的核心数这一问题,而 Uber 提出了一种 Workaround 方法,利用  uber-go/automaxprocs 这一个包,可以在运行时根据 cgroup 为容器分配的CPU资源限制数来修改 GOMAXPROCS。

import _ "go.uber.org/automaxprocs"

func main() {
  // Your application logic here.
}

参考资料:

https://gaocegege.com/Blog/maxprocs-cpu

https://stackoverflow.com/questions/36492356/parallel-programming-in-go-using-gomaxprocs/36492517#36492517

VS Code 是一款功能强大的集成开发环境 (IDE),可与容器开发相结合,为使用者提供便利、高效的开发环境。当使用 VS Code 进行容器开发时,可以使用如下步骤来开发 Go 语言程序。 首先,需要安装 Docker 工具,并在其中创建一个用于开发的容器。可以使用 Dockerfile 来定义容器的配置,包括基础镜像、软件依赖项和运行环境等。 在容器内部,可以安装 Go 语言的相关工具和扩展。这些工具和扩展可以通过 VS Code 的插件市场进行安装。一旦安装完毕,就可以在容器内部使用它们提供的功能。 接下来,需要在 VS Code 中配置容器选项。在编辑器的底部状态栏中,可以找到一个“远程-容器”按钮。通过它,可以连接到已创建的容器,使 VS Code 成为容器中的“远程”开发环境。 一旦连接成功,就可以在 VS Code 中编辑和调试 Go 语言程序了。VS Code 提供了丰富的编辑器功能,包括代码高亮、智能补全和语法检查等。此外,还可以使用内置的终端来运行 Go 语言命令和程序。 如果需要调试程序,可以使用 VS Code 的调试功能。通过在容器内部设置断点,并使用 VS Code 的调试工具,可以查看程序运行时的变量和状态,并以逐步方式进行调试。 总之,VS Code 提供了强大的容器开发支持,可以使开发人员更加便捷和高效地进行 Go 语言开发。通过配置容器选项和安装相关工具,可以将 VS Code 连接到容器中,在其中进行代码编辑、编译和调试,提供了更加一体化的开发环境。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值