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 的数量
我很好奇 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
.