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

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

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

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

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


米脂
浏览 151回答 2
2回答

largeQ

CPU 的数量是在运行时评估的,它取决于操作系统。如果你查看 Go 运行时包,你会看到许多带有与操作系统和体系结构名称相关的后缀的文件:FreeBSD达尔文计划9打开BSDLinux谷歌原生客户端视窗NetBSD索拉里斯蜻蜓 BSD构建 Go 程序时,只会包含与当前操作系统和体系结构相对应的正确运行时文件。CPU 的数量将由函数计算getncpu。

慕森卡

GoGOMAXPROCS是 CPU 数量的函数。CPU 的数量是处理器架构的函数:386、amd64、arm、arm64、mips64、ppc64、s390 等,操作系统提供与硬件的接口:Linux、OpenBSD、Mac OS 等。在 Linux 上,我们有SYS_sched_getaffinity。请参阅中的Go 源代码src/runtime。请参阅 Linux 文档命令man sched_getaffinity。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go