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

时间:2019-01-15 00:15:01

标签: docker go cgroups

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

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

类似地在macOS上,如何确定该值?

我知道某些应用程序(例如JVM)依赖/ sys上公开的cgroup内存信息来设置其内部堆大小等。

2 个答案:

答案 0 :(得分:2)

在运行时评估CPU的数量,它取决于操作系统。如果您查看Go运行时包中的内容,将会看到许多文件 与操作系统和架构名称相关的后缀:

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

答案 1 :(得分:1)

转到django.apps是CPU数量的函数。 CPU的数量取决于处理器体系结构:386,amd64,arm,arm64,mips64,ppc64,s390等。操作系统提供了到硬件接口:Linux,OpenBSD,Mac OS等。在Linux上,我们有GOMAXPROCS

请参见SYS_sched_getaffinity中的Go source code

请参阅Linux文档命令src/runtime