Как определяется GOMAXPROCS на разных платформах и внутри контейнеров? - PullRequest
0 голосов
/ 15 января 2019

Мне любопытно, как среда выполнения Go определяет runtime.NumCPU() (количество процессоров) на различных платформах с совершенно разными характеристиками, такими как Linux, macOS и Windows?

Например, для Linux: мне любопытно, использует ли он sysfs (/ sys) для просмотра путей типа /sys/fs/cgroup/cpu/cpu.cfs_quota_us, чтобы определить, сколько процессоров существует, или procfs (/proc/cpuinfo) (это неправильное значение в среда контейнера, в которой контейнер может иметь доступ к меньшему количеству процессоров, чем число процессоров хоста, указанное в этом файле).

Аналогично в macOS, как определяется это значение?

Я знаю, что некоторые приложения, такие как JVM, полагаются на информацию о памяти cgroups, предоставляемую в / sys, для установки размера внутренней кучи и т. Д.

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Количество процессоров оценивается во время работы и зависит от ОС. Если вы загляните внутрь пакета среды выполнения Go, вы увидите много файлов с постфиксы, связанные с именами ОС и архитектуры:

При сборке программы Go включается только правильный исполняемый файл, соответствующий текущей ОС и архитектуре. Количество процессоров будет оцениваться функцией getncpu.

0 голосов
/ 15 января 2019

Go GOMAXPROCS является функцией количества процессоров. Количество процессоров зависит от архитектуры процессора: 386, amd64, arm, arm64, mips64, ppc64, s390 и т. Д. Операционная система обеспечивает интерфейс с аппаратным обеспечением: Linux, OpenBSD, Mac OS и т. Д. В Linux, у нас есть SYS_sched_getaffinity.

См. Перейти исходный код в src/runtime.

См. Команду документации Linux man sched_getaffinity.

...