GOMAXPROCS 在不同平台和容器内部是如何确定的?

How is GOMAXPROCS determined on different platforms and inside containers?

我很好奇 Go 运行时如何在 Linux、macOS 和 Windows 等具有截然不同特性的各种平台上确定 runtime.NumCPU()(CPU 的计数)?

例如 Linux:我很好奇它是否使用 sysfs (/sys) 查看 /sys/fs/cgroup/cpu/cpu.cfs_quota_us 之类的路径以确定存在多少 CPU,或者 procfs (/proc/cpuinfo)(在容器环境中,这将是错误的值,在容器环境中,容器可以访问的 CPU 少于此文件中公开的主机 CPU 计数)。

同样在macOS上,这个值是如何确定的?

我知道像 JVM 这样的一些应用程序依赖于暴露在 /sys 上的 cgroups 内存信息来设置它们的内部堆大小等。

Go GOMAXPROCS 是 CPU 数量的函数。 CPU 数量是处理器架构的函数:386、amd64、arm、arm64、mips64、ppc64、s390 等,操作系统提供硬件接口:Linux、OpenBSD、Mac OS,等等。在 Linux,我们有 SYS_sched_getaffinity

参见 src/runtime 中的 Go source code

请参阅 Linux 文档命令 man sched_getaffinity

CPU 数量在 运行 时评估,它是 OS 相关的。如果你看一下 Go 运行时包,你会看到很多文件 与 OS 和架构名称相关的后缀:

构建 Go 程序时,仅包含与当前 OS 和体系结构相对应的正确运行时文件。然后将通过函数 getncpu.

评估 CPU 的数量