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

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

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

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

Ответы [ 25 ]

6 голосов
/ 29 ноября 2013

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

CORES=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu)
3 голосов
/ 27 июля 2015

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

  • Подсчитать количество уникальных идентификаторов ядра (примерно эквивалентно 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 голосов
/ 15 марта 2019

Я также думал, что 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

чтобы узнать, какие ядра отключены. Записи sysfs online, offline и present возвращают индекс CPUS, поэтому возвращаемое значение 0 означает только ядро ​​0, тогда как возвращаемое значение 1-3 означает ядро ​​1,2, и 3.

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

3 голосов
/ 22 ноября 2017

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

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

или коротко:

lscpu -b -p=Core,Socket | grep -v '^#' | sort -u | wc -l
2 голосов
/ 04 мая 2013

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

awk -F: '/^physical/ && !ID[$2] { P++; ID[$2]=1 }; /^cpu cores/ { CORES=$2 };  END { print CORES*P }' /proc/cpuinfo
1 голос
/ 12 февраля 2018

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

Эта работа почти для всех .

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 голос
/ 25 января 2018
cat /proc/cpuinfo | grep processor

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

[root@theservername ~]# cat /proc/cpuinfo | grep processor
processor       : 0
processor       : 1
processor       : 2
processor       : 3
1 голос
/ 26 мая 2018

Если все в порядке, что вы можете использовать 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() function

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

Или еще проще: os.cpu_count()

$ python -c "import os; print(os.cpu_count())"
1 голос
/ 20 января 2014

Не моя веб-страница, но эта команда из 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 голос
/ 21 августа 2017

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

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...