Предисловие:
Проблема с /proc/cpuinfo
ответами заключается в том, что они анализируют информацию, предназначенную для потребления человеком , и поэтому не хватает стабильного формата, предназначенного для синтаксический анализ машины : формат вывода может отличаться для разных платформ и условий выполнения; при использовании lscpu -p
в Linux (и sysctl
в macOS) обходит эту проблему .
getconf _NPROCESSORS_ONLN
/ getconf NPROCESSORS_ONLN
не различает логический и физический ЦП.
Вот фрагмент sh
(POSIX-совместимый), который работает на Linux и macOS для определения числа - в сети - логического или физического процессоров ; подробности смотрите в комментариях.
Использует lscpu
для Linux и sysctl
для macOS.
Замечание по терминологии : CPU относится к наименьшей единице обработки, видимой ОС. Ядра без гиперпоточности соответствуют одному ЦП, тогда как ядра с многопоточностью содержат более 1 (обычно 2) - логического - ЦП.
Linux использует следующую таксономию, начиная с наименьшей единицы: CPU <<em> core <<em> socket <<em> book <<em> node , причем каждый уровень содержит 1 или более экземпляров следующего более низкого уровня.
Здесь мои знания несколько шатки - дайте мне знать, если я ошибаюсь.
Кто-нибудь знает, что такое "книга" в этом контексте ?
#!/bin/sh
# macOS: Use `sysctl -n hw.*cpu_max`, which returns the values of
# interest directly.
# CAVEAT: Using the "_max" key suffixes means that the *maximum*
# available number of CPUs is reported, whereas the
# current power-management mode could make *fewer* CPUs
# available; dropping the "_max" suffix would report the
# number of *currently* available ones; see [1] below.
#
# Linux: Parse output from `lscpu -p`, where each output line represents
# a distinct (logical) CPU.
# Note: Newer versions of `lscpu` support more flexible output
# formats, but we stick with the parseable legacy format
# generated by `-p` to support older distros, too.
# `-p` reports *online* CPUs only - i.e., on hot-pluggable
# systems, currently disabled (offline) CPUs are NOT
# reported.
# Number of LOGICAL CPUs (includes those reported by hyper-threading cores)
# Linux: Simply count the number of (non-comment) output lines from `lscpu -p`,
# which tells us the number of *logical* CPUs.
logicalCpuCount=$([ $(uname) = 'Darwin' ] &&
sysctl -n hw.logicalcpu_max ||
lscpu -p | egrep -v '^#' | wc -l)
# Number of PHYSICAL CPUs (cores).
# Linux: The 2nd column contains the core ID, with each core ID having 1 or
# - in the case of hyperthreading - more logical CPUs.
# Counting the *unique* cores across lines tells us the
# number of *physical* CPUs (cores).
physicalCpuCount=$([ $(uname) = 'Darwin' ] &&
sysctl -n hw.physicalcpu_max ||
lscpu -p | egrep -v '^#' | sort -u -t, -k 2,4 | wc -l)
# Print the values.
cat <<EOF
# of logical CPUs: $logicalCpuCount
# of physical CPUS: $physicalCpuCount
EOF
[1] macOS sysctl (3)
документация
Обратите внимание, что производные от BSD системы, кроме macOS, например, FreeBSD, поддерживают только ключ hw.ncpu
для sysctl
, который не рекомендуется использовать в macOS; Мне неясно, какой из новых ключей hw.npu
соответствует: hw.(logical|physical)cpu_[max]
.
Подсказка @teambob для исправления команды физического подсчета ЦП lscpu
.
Caveat : lscpu -p
вывод НЕ включает столбец "book" (страница man
упоминает "books" как объект между сокетом и узлом в таксономической иерархии). Если "книги" находятся в игре в данной системе Linux ( кто-нибудь знает, когда и как? ), команда физического подсчета ЦП может под -report (это основано на предположение, что lscpu
сообщает идентификаторы, которые не являются уникальными для объектов более высокого уровня ; например: 2 разных ядра из 2 разных сокетов могут иметь одинаковый идентификатор).
Если вы сохраните приведенный выше код, скажем, как сценарий оболочки cpus
, сделаете его исполняемым с chmod +x cpus
и поместите его в папку в $PATH
, вы увидите вывод, подобный следующему:
$ cpus
logical 4
physical 4