Как получить количество процессоров / ядер в Linux из командной строки?


540

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

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

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


9
Во всяком случае, вам не нужно catраньше awk, просто awk '<script>' /proc/cpuinfoтак awk '/^processor/{n+=1}END{print n}' /proc/cpuinfo. И вы получаете без "минус один".
Томаш Гандор

Чтобы ответить на вопрос напрямую, передайте трубку, на tail -n 1которую занимает последняя строка и печатает ее.
Фабио Сантос

Ответы:


659
grep -c ^processor /proc/cpuinfo     

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

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

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

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


42
Обратите внимание, что оба из них в конечном итоге будут считать вдвое больше ядер, чем реально существует, если вы работаете в системе с гиперпоточностью (например, P4 или Core i7).
duskwuff -неактивный-

24
@duskwuff: это именно то, что вы хотите в большинстве случаев.
Фрэнк Кастерс

8
grep -c '^processor' /proc/cpuinfoна зш.
Стивен Лу

40
cat /proc/cpuinfo | awk '/^processor/{print $3}' | tail -1также вернет неправильный номер, если номера ЦП основаны на 0.
Фазор

3
Первая строка возвращает 1 ядро ​​меньше существующего. Лучше кот / proc / cpuinfo | awk '/ ^ processor / {print $ 3}' | wc -l
Мирко Эберт

650

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

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

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

На моей 8-ядерной машине:

$ nproc --all
8

8
различает ли виртуальное ядро ​​от физического?
Ричард

12
Это не работает с гиперпоточностью, если мне нужно количество физических ядер. Возвращает 8 на моей четырехъядерной коробке i7.
пратнала

1
@pratnala - ответ команды teambob дает вам количество физических ядер.
Ник Чаммас

1
На моем старом Ubuntu (10.10) nproc недоступен. Это должно быть новое дополнение.
Букзор

3
К сожалению, nprocне является частью boot2docker
kgadek

269

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

getconf _NPROCESSORS_ONLN

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

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


11
Это сработало для меня в Red Hat Entreprise Linux 5.4, Centos 6.5 & 7 и Mac OSX 10.9 (Mavericks). Похоже, это наиболее переносимый файл, так как lscpu по умолчанию не установлен в этих системах. Спасибо!
big_gie

1
Согласен. Это довольно портативный.
Букзор

8
Такой портативный - в POSIX :) pubs.opengroup.org/onlinepubs/009604499/utilities/getconf.html
BCran

1
@BCran Я не смог найти _NPROCESSORS_ONLNв POSIX. Можете ли вы дать ссылку на него?
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功

3
@CiroSantilli 视 事件 法轮功 纳米比亚 威 视 С github.com/gstrauss/plasma/blob/master/plasma_sysconf.c похоже, что я ошибался: это только опционально. «sysconf _SC_NPROCESSORS_ONLN и _SC_NPROCESSORS_CONF не требуются стандартами, но предоставляются на многочисленных платформах Unix и документируются как необязательные для Open Group».
BCran

100

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

  • Проблема с /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 "


1
Да, извините, вы правы насчет команды сортировки. Я не могу найти никакой информации о книгах, кроме руководства lscpu. Я думаю, что это связано с NUMA en.wikipedia.org/wiki/Non-uniform_memory_access
teambob

2
Я думаю, что большинство решений здесь игнорируют машины с несколькими сокетами, в отличие от этого. Спасибо!
Dividebyzero

1
С точки зрения linux, существует много контекстов, где lscpu недоступен, например образы установщика. Мне нравится это .. хотелось бы, чтобы это было вездесущим.
Брайан Крисман

43

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

Смотрите также /unix/468766/understanding-output-of-lscpu .


13

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

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

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

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

1
такое «^ core id» для общего количества физических ядер или только p-ядер на одном процессоре?
Ричард

1
в системе имеется одна строка идентификатора ядра для каждого уникального физического ядра. Я не знаю, начнутся ли числа с нуля для второго физического процессора, однако ...
lunixbochs

1
если у вас есть более одного физического процессора, вам также нужно посмотреть на «физический идентификатор».
Анна

Первая строка не работает для меня. Это работает для меня. cat /proc/cpuinfo | awk '/^processor/{print $3}'| wc -lи показывает правильный номер.
jaylweb

11

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

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. Я написал более краткую версию в комментариях


10

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

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

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

$ python -c "import psutil; print(psutil.cpu_count(logical=True))"
8

В python 2.7.15 эти команды ничего не печатают. В REPL они делают.
Витенис Бивайнис

1
@VytenisBivainis Спасибо, я исправил свой ответ!
Острокач

9

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

CORES=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu || echo "$NUMBER_OF_PROCESSORS")

9

Вот способ, которым я использую для подсчета количества физических ядер, которые находятся в сети в Linux:

lscpu --online --parse=Core,Socket | grep --invert-match '^#' | sort --unique | wc --lines

или короче говоря:

lscpu -b -p=Core,Socket | grep -v '^#' | sort -u | wc -l

Пример (1 розетка):

> lscpu
...
CPU(s):                28
Thread(s) per core:    2
Core(s) per socket:    14
Socket(s):             1
....
> lscpu -b -p=Core,Socket | grep -v '^#' | sort -u | wc -l
14

Пример (2 розетки):

> lscpu
...
CPU(s):                56
Thread(s) per core:    2
Core(s) per socket:    14
Socket(s):             2
...
> lscpu -b -p=Core,Socket | grep -v '^#' | sort -u | wc -l
28

Пример (4 розетки):

> lscpu
...
CPU(s):                64
Thread(s) per core:    2
Core(s) per socket:    8
Socket(s):             4
...
> lscpu -b -p=Core,Socket | grep -v '^#' | sort -u | wc -l
32

Работает и обрабатывает несколько сокетов
jbo5112

Это лучший ответ.
Йорма Ребане

7

Использование 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 () после некоторых других методов.


6

Если вы хотите сделать это так, чтобы он работал на Linux и OS X, вы можете сделать:

CORES=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu)

По моему, это возвращает количество гиперпотоков. Мне также нужно знать количество физических ядер и количество сокетов.
user2465201

ОК - та же самая команда с hw.physicalcpu выдает количество ядер. Еще не уверен насчет количества сокетов ... Существует также "логическое" и "активное" количество процессоров, но я не уверен, что это значит.
user2465201

Быстрое обновление - это не кажется таким портативным. Я попробовал это на Linux-боксе, и он, кажется, просто читает каталоги / proc, которые для системы Linux отличаются от Mac - например, нет подкаталога hw. Тем не менее, вы все равно можете разобрать / proc / cpuinfo
user2465201


3

Вы можете использовать один из следующих методов для определения количества физических ядер ЦП.

  • Подсчитайте количество уникальных идентификаторов ядра (примерно эквивалентно grep -P '^core id\t' /proc/cpuinfo | sort -u | wc -l).

    awk '/^core id\t/ {cores[$NF]++} END {print length(cores)}' /proc/cpuinfo

  • Умножьте количество «ядер на сокет» на количество сокетов.

    lscpu | awk '/^Core\(s\) per socket:/ {cores=$NF}; /^Socket\(s\):/ {sockets=$NF}; END{print cores*sockets}'

  • Подсчитайте количество уникальных логических процессоров, используемых ядром Linux. -pВариант генерирует выходной сигнал для легкой разборе и совместим с более ранними версиями lscpu.

    lscpu -p | awk -F, '$0 !~ /^#/ {cores[$1]++} END {print length(cores)}'


Просто чтобы повторить то, что сказали другие, есть ряд связанных свойств.

Чтобы определить количество доступных процессоров:

getconf _NPROCESSORS_ONLN
grep -cP '^processor\t' /proc/cpuinfo

Для определения количества доступных процессорных единиц (не обязательно совпадает с количеством ядер). Это осознает гиперпоточность.

nproc

Я не хочу заходить слишком далеко в кроличью нору, но вы также можете определить количество сконфигурированных процессоров (в отличие от просто доступных / онлайн процессоров) через getconf _NPROCESSORS_CONF. Чтобы определить общее количество процессоров (оффлайн и онлайн), вы хотите проанализировать вывод lscpu -ap.


это правильный ответ, если вы хотите физические ядра.
Динеш

3

Я также думал, cat /proc/cpuinfoчто даст мне правильный ответ, однако недавно я увидел, что моя четырехъядерная система ARM Cortex A53 показала только одно ядро. Кажется, что / proc / cpuinfo показывает только активные ядра, тогда как:

cat /sys/devices/system/cpu/present

это лучшая мера того, что там. Вы также можете

cat /sys/devices/system/cpu/online

чтобы увидеть, какие ядра онлайн, и

cat /sys/devices/system/cpu/offline

чтобы увидеть, какие ядра отключены. В online, offlineи presentsysfs запись возвращает индекс процессоров, поэтому возвращаемое значение 0просто означает , что сердечник 0, в то время как возвращаемое значение 1-3средство ядер 1,2, и 3.

См. Https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-devices-system-cpu.


2

Следующее должно дать вам количество «реальных» ядер как в гиперпоточной, так и в недипертонической системе. По крайней мере, это сработало во всех моих тестах.

awk -F: '/^physical/ && !ID[$2] { P++; ID[$2]=1 }; /^cpu cores/ { CORES=$2 };  END { print CORES*P }' /proc/cpuinfo

-1, это возвращается 0на одно ядро ​​с Opteron 4170 HE, но возвращается 4на восьми ядерную коробку с Opteron 3280. ... часть меня действительно желает, чтобы этот однолинейный работал!
Замнюц

1

Не моя веб-страница, но эта команда из http://www.ixbrian.com/blog/?p=64&cm_mc_uid=89402252817914508279022&cm_mc_sid_50200000=1450827902 прекрасно работает для меня в centos. Он будет отображать фактический процессор даже при включенной гиперпоточности.

cat /proc/cpuinfo | egrep "core id|physical id" | tr -d "\n" | sed s/physical/\\nphysical/g | grep -v ^$ | sort | uniq | wc -l


+1, дольше, чем решение с "lscpu -p = Core, Socket", но работает непосредственно с парсингом / proc / cpuinfo, нет необходимости в lscpu.
Фравадона

1

Подсчитайте «идентификатор ядра» для каждого метода «физического идентификатора», используя awk с отступом на счетчике «процессора», если «идентификатор ядра» недоступны (например, raspberry)

echo $(awk '{ if ($0~/^physical id/) { p=$NF }; if ($0~/^core id/) { cores[p$NF]=p$NF }; if ($0~/processor/) { cpu++ } } END { for (key in cores) { n++ } } END { if (n) {print n} else {print cpu} }' /proc/cpuinfo)

1
cat /proc/cpuinfo | grep processor

Это работало нормально. Когда я попробовал первый ответ, я получил 3 процессора в качестве вывода. Я знаю, что у меня есть 4 процессора в системе, поэтому я просто сделал grepдля процессора, и результат выглядел так:

[root@theservername ~]# cat /proc/cpuinfo | grep processor
processor       : 0
processor       : 1
processor       : 2
processor       : 3

1
 dmidecode  | grep -i cpu | grep Version

дает мне

Версия: Intel (R) Xeon (R) CPU E5-2667 v4 @ 3.20 ГГц

Версия: Intel (R) Xeon (R) CPU E5-2667 v4 @ 3.20 ГГц

Что является правильным количеством сокетов - поиск E5-2667говорит мне, что каждый сокет имеет 8 cores, так что умножьте и в конечном итоге с 16 coresпоперечным 2 sockets.

Где lscpuдать мне 20 CPUs- что совершенно неправильно - не знаю почему. (то же самое касается cat /proc/cpu- заканчивается 20.


1

Быстрее без вилки

Это работа с милостыней всех ,

ncore=0
while read line ;do
    [ "$line" ] && [ -z "${line%processor*}" ] && ncore=$((ncore+1))
  done </proc/cpuinfo
echo $ncore
4

Чтобы оставаться совместимым с , , и другие, я использовал ncore=$((ncore+1))вместо ((ncore++)).

версия

ncore=0
while read -a line ;do
    [ "$line" = "processor" ] && ((ncore++))
  done </proc/cpuinfo
echo $ncore
4


1

Если все в порядке, что вы можете использовать Python, то numexprмодуль имеет функцию для этого:

In [5]: import numexpr as ne

In [6]: ne.detect_number_of_cores()
Out[6]: 8

также это:

In [7]: ne.ncores
Out[7]: 8

Для запроса этой информации из командной строки используйте:

# runs whatever valid Python code given as a string with `-c` option
$ python -c "import numexpr as ne; print(ne.ncores)"
8

Или просто можно получить эту информацию из multiprocessing.cpu_count()функции

$ python -c "import multiprocessing; print(multiprocessing.cpu_count())"

Или еще проще использовать os.cpu_count()

$ python -c "import os; print(os.cpu_count())"

1
Есть ли способ заставить это работать как команда в python? Например, я пробовал python -m Numberxpr.ncores, но это не работает.
MonsieurBeilto

1
@MonsieurBeilto Пожалуйста, посмотрите на обновленный ответ!
kmario23

Отсчет возвращаемый cpu_countнеправильно, он не возвращает количество ядер , но только количество hyperthreads на процессорах Intel
Антти Haapala

1

Если вы просто хотите считать физические ядра, эта команда сделала это для меня.

lscpu -e | tail -n +2 | tr -s " " | cut -d " " -f 4 | sort | uniq | wc -w

Довольно простой, но, кажется, считает реальные физические ядра, игнорируя логический счет


0

Python 3 также предоставляет несколько простых способов получить его:

$ python3 -c "import os; print(os.cpu_count());"

4

$ python3 -c "import multiprocessing; print(multiprocessing.cpu_count())"

4


Это возвращает мне 8, когда у меня есть 4 ядра с 2 потоками на каждом ...
Антти Хаапала

0

Используйте запрос ниже, чтобы получить основные детали

[oracle@orahost](TESTDB)$ grep -c ^processor /proc/cpuinfo
8

0

Резюме: чтобы получить физические процессоры, сделайте это:

grep 'core id' /proc/cpuinfo | sort -u

чтобы физические и логические процессоры сделали это:

grep -c ^processor /proc/cpuinfo

/proc << это золотой источник любой необходимой вам информации о процессах и

/proc/cpuinfo << является золотым источником любой информации о процессоре.


Подсчет физического процессора не работает с компьютерами с несколькими сокетами; для этого вам нужно связать каждый «основной идентификатор» с его «физическим идентификатором».
Фравадона
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.