Как узнать количество процессоров / ядер в Linux из командной строки? - PullRequest
472 голосов
/ 26 июня 2011

У меня есть этот скрипт, но я не знаю, как получить последний элемент в распечатке:

cat /proc/cpuinfo | awk '/^processor/{print $3}'

Последний элемент должен быть числом процессоров, минус 1.

Ответы [ 25 ]

570 голосов
/ 13 июня 2013

Обработка содержимого /proc/cpuinfo без необходимости барокко.Используйте nproc , который входит в состав coreutils, поэтому он должен быть доступен в большинстве установок Linux.

Команда nproc печатает количество блоков обработки, доступных для текущегопроцесс, который может быть меньше, чем количество подключенных процессоров.

Чтобы узнать количество всех установленных ядер / процессоров, используйте nproc --all

На моем 8-ядерном компьютере:

$ nproc --all
8
566 голосов
/ 26 июня 2011
cat /proc/cpuinfo | awk '/^processor/{print $3}' | wc -l

или просто

grep -c ^processor /proc/cpuinfo     

, который будет подсчитывать количество строк, начинающихся с «процессора», в /proc/cpuinfo

Для систем с гиперпоточностью вы можете использовать

grep ^cpu\\scores /proc/cpuinfo | uniq |  awk '{print $4}' 

, который должен возвратить (например) 8 (тогда как приведенная выше команда вернет 16)

235 голосов
/ 09 мая 2014

Самым переносимым решением, которое я нашел, является команда getconf:

getconf _NPROCESSORS_ONLN

Это работает как в Linux, так и в Mac OS X. Другое преимущество этого по сравнению с некоторыми другими подходами состоит в том, что getconf имеетбыл вокруг в течение длительного времени.На некоторых старых Linux-машинах, на которых мне приходится заниматься разработкой, нет команд nproc или lscpu, но у них есть getconf.

Примечание редактора: Хотя getconf утилита имеет мандат POSIX , конкретные значения _NPROCESSORS_ONLN и _NPROCESSORS_CONF не являются.Тем не менее, как уже говорилось, они работают на платформах Linux, а также на MacOS;во FreeBSD / PC-BSD вы должны опустить ведущий _.

82 голосов
/ 30 апреля 2014

Предисловие:

  • Проблема с /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
33 голосов
/ 22 апреля 2018

lscpu собирает информационную форму архитектуры процессора / proc / cpuinfon в удобном для чтения формате:

# lscpu


Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    1
Core(s) per socket:    4
CPU socket(s):         2
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 15
Stepping:              7
CPU MHz:               1866.669
BogoMIPS:              3732.83
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              4096K
NUMA node0 CPU(s):     0-7

См. Также https://unix.stackexchange.com/questions/468766/understanding-output-of-lscpu.

13 голосов
/ 26 июня 2011

Это сработало для меня. tail -nX позволяет захватывать только последние X строк.

cat /proc/cpuinfo | awk '/^processor/{print $3}' | tail -1

Если у вас есть гиперпоточность, это должно работать для получения количества физических ядер.

grep "^core id" /proc/cpuinfo | sort -u | wc -l
9 голосов
/ 05 августа 2013

Для общего количества физических ядер:

grep '^core id' /proc/cpuinfo |sort -u|wc -l

На машинах с несколькими сокетами (или всегда) умножьте приведенный выше результат на количество сокетов:

echo $(($(grep "^physical id" /proc/cpuinfo | awk '{print $4}' | sort -un | tail -1)+1))

@ mklement0 имеет довольно хороший ответ ниже, используя lscpu. Я написал более краткую версию в комментариях

8 голосов
/ 03 июня 2016

Вы также можете использовать Python!Чтобы получить количество физических ядер:

$ python -c "import psutil; print(psutil.cpu_count(logical=False))"
4

Чтобы получить количество ядер с гиперпоточностью:

$ python -c "import psutil; print(psutil.cpu_count(logical=True))"
8
7 голосов
/ 01 декабря 2017

Кроссплатформенное решение для Linux, MacOS, Windows:

CORES=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu || echo "$NUMBER_OF_PROCESSORS")
7 голосов
/ 18 августа 2016

Использование getconf действительно является наиболее переносимым способом, однако переменная имеет разные имена в BSD и Linux для getconf, поэтому вам нужно протестировать оба, как показано в этой сущности: https://gist.github.com/jj1bdx/5746298 (также включает исправление Solaris с использованием ksh)

Я лично использую:

$ getconf _NPROCESSORS_ONLN 2>/dev/null || getconf NPROCESSORS_ONLN 2>/dev/null || echo 1

И если вы хотите это в python, вы можете просто использовать syscall getconf, импортировав модуль os:

$ python -c 'import os; print os.sysconf(os.sysconf_names["SC_NPROCESSORS_ONLN"]);'

Что касается nproc, он является частью GNU Coreutils, поэтому по умолчанию недоступен в BSD. Он также использует sysconf () после некоторых других методов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...