Предисловие:
Проблема с /proc/cpuinfo
-На ответов является то , что они синтаксическая анализ информации , которая была предназначена для человеческого потребления и , следовательно , не имеет формата , предназначенный для стабильной машины разбора : выходной формат может отличаться на разных платформы и условиях среды выполнения; использование lscpu -p
в Linux (и sysctl
в macOS) позволяет обойти эту проблему .
getconf _NPROCESSORS_ONLN
/ getconf NPROCESSORS_ONLN
не различает логические и физические процессоры.
Вот sh
(POSIX-совместимый) фрагмент кода, который работает в Linux и macOS для определения количества оперативных логических или физических процессоров ; смотрите комментарии для деталей.
Использует lscpu
для Linux, иsysctl
для macOS.
Примечание по терминологии : ЦП относится к наименьшей единице обработки, видимой ОС. Ядра без гиперпоточности соответствуют одному ЦП, тогда как ядра с многопоточностью содержат более 1 (обычно 2) - логического - ЦП.
Linux использует следующую таксономию [1] , начиная с самого маленького блока:
CPU < ядро < сокет < книга < узел
с каждым уровнем , содержащим 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] документация macOSsysctl (3)
Обратите внимание, что производные от BSD системы, отличные от macOS, например, FreeBSD, поддерживают только тот hw.ncpu
ключ sysctl
, который не рекомендуется использовать в macOS; Мне неясно, какой из новых ключей hw.npu
соответствует:hw.(logical|physical)cpu_[max]
.
Совет от @teambob за помощь в исправлении команды физического подсчета CPU lscpu
.
Предостережение : lscpu -p
вывод НЕ включает столбец «книга» ( man
страница упоминает «книги» как объект между сокетом и узлом в таксономической иерархии). Если «книги» находятся в игре в данной системе Linux ( кто-нибудь знает, когда и как? ), Команда физического-CPU-count может быть ниже -report (это основано на предположении, что lscpu
идентификаторы отчетов не являются уникальными для более высоких -уровневые объекты , например: 2 разных ядра из 2 разных сокетов могут иметь одинаковый идентификатор).
Если вы сохраните приведенный выше код, скажем, как сценарий оболочкиcpus
, сделаете его исполняемым chmod +x cpus
и поместите его в папку в вашей папке $PATH
, вы увидите вывод, подобный следующему:
$ cpus
logical 4
physical 4
[1] Xaekai проливает свет на то, что такое книга : « книга - это модуль, в котором размещена печатная плата с гнездами ЦП, ОЗУ, соединениями ввода-вывода по краю и крюком для интеграции системы охлаждения. Они используются в мэйнфреймах IBM Дополнительная информация: http://ewh.ieee.org/soc/cpmt/presentations/cpmt0810a.pdf "
cat
раньшеawk
, простоawk '<script>' /proc/cpuinfo
такawk '/^processor/{n+=1}END{print n}' /proc/cpuinfo
. И вы получаете без "минус один".