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

109

Я запускаю следующую команду, чтобы узнать количество процессоров / ядер в Linux:

cat /proc/cpuinfo | grep processor | wc -l

Это работает, но не выглядит элегантно. Как бы вы посоветовали его улучшить?

Майкл
источник
возможный дубликат получения количества процессоров / ядер в Linux
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Ответы:

138

nproc это то, что вы ищете.

Подробнее здесь: http://www.cyberciti.biz/faq/linux-get-number-of-cpus-core-command/

pax162
источник
11
Красиво, но не так широко, как / proc / cpuinfo. nprocесть на моей виртуальной машине ubuntu, но не на моей машине с RedHat 5.5.
Digital Trauma
8
Убедитесь, что nproc --allдля всех установленных процессорных блоков. Без --all, nprocпоказывает только единицы обработки, доступные для текущего процесса. Прочтите страницу руководства для получения более подробной информации. MMV.
JamesThomasMoon1979
96

Самый простой инструмент поставляется с glibc и называется getconf:

$ getconf _NPROCESSORS_ONLN
4
Харальд Хойер
источник
8
Еще лучше, это утилита POSIX: pubs.opengroup.org/onlinepubs/009604499/utilities/getconf.html .
BCran
2
в отличие от nprocэтого, это работает (по умолчанию) на Mac OS X.
Алек Джейкобсон
К сожалению, хотя эта утилита доступна в Solaris _NPROCESSORS_ONLN(или что-то еще с cpu, proc и т. Д.), Она отображается в ее выводе. Я надеялся, так как это инструмент posix, он будет работать в Linux / Solaris, поэтому мне не пришлось использовать ветвление.
Брайан Ванденберг
39

Я думаю, что предложенный вами метод является наиболее переносимым в Linux. Вместо того , порождая ненужные catи wcпроцессы, вы можете сократить его немного:

$ grep --count ^processor /proc/cpuinfo
2
Цифровая травма
источник
25

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

CORES=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu)
tim_yates
источник
хороший портативный скрипт :)
mircealungu
2
На Solaris вам нужно использовать psrinfo -pвместо этого
mems
14

В новых ядрах вы также можете использовать /sys/devices/system/cpu/интерфейс для получения дополнительной информации:

$ ls /sys/devices/system/cpu/
cpu0  cpufreq  kernel_max  offline  possible  present  release
cpu1  cpuidle  modalias    online   power     probe    uevent
$ cat /sys/devices/system/cpu/kernel_max 
255
$ cat /sys/devices/system/cpu/offline 
2-63
$ cat /sys/devices/system/cpu/possible 
0-63
$ cat /sys/devices/system/cpu/present 
0-1
$ cat /sys/devices/system/cpu/online 
0-1

См. Официальную документацию для получения дополнительной информации о том, что все это означает.

Цифровая травма
источник
2
nproc в основном использует это ($ OMP_NUM_THREADS, затем readdir sysfs). Я думаю, что этот интерфейс лучше.
Тобу,
2
И getconf также полагается на этот интерфейс ( onlineфайл, более простой, чем то, что делает nproc)
Тобу,
6

Когда кто-то спрашивает «количество процессоров / ядер», запрашиваются 2 ответа. Число «процессоров» будет физическим числом, установленным в сокетах на машине.

Количество «ядер» будет физическим. Гиперпоточные (виртуальные) ядра не будут включены (по крайней мере, на мой взгляд). Как тому, кто пишет много программ с пулами потоков, вам действительно нужно знать количество физических ядер по сравнению с ядрами / гиперпотоками. Тем не менее, вы можете изменить следующий сценарий, чтобы получить нужные вам ответы.

#!/bin/bash

MODEL=`cat /cpu/procinfo | grep "model name" | sort | uniq`
ALL=`cat /proc/cpuinfo | grep "bogo" | wc -l`
PHYSICAL=`cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l`
CORES=`cat /proc/cpuinfo | grep "cpu cores" | sort | uniq | cut -d':' -f2`
PHY_CORES=$(($PHYSICAL * $CORES))
echo "Type $MODEL"
echo "Processors $PHYSICAL"
echo "Physical cores $PHY_CORES"
echo "Including hyperthreading cores $ALL"

Результат на машине с 2 физическими процессорами модели Xeon X5650, каждый с 6 физическими ядрами, которые также поддерживают гиперпоточность:

Type model name : Intel(R) Xeon(R) CPU           X5650  @ 2.67GHz
Processors 2
Physical cores 12
Including hyperthreading cores 24

На машине с 2 процессорами mdeol Xeon E5472, каждый с 4 физическими ядрами, которые не поддерживают гиперпоточность

Type model name : Intel(R) Xeon(R) CPU           E5472  @ 3.00GHz
Processors 2
Physical cores 8
Including hyperthreading cores 8
Rabinnh
источник
Это наиболее подробный ответ, который дал мне информацию, которую я искал.
WoodenToaster
4

Также может быть полезна lscpu(1)команда, предоставленная проектом util-linux :

$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    2
Core(s) per socket:    2
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 58
Model name:            Intel(R) Core(TM) i7-3520M CPU @ 2.90GHz
Stepping:              9
CPU MHz:               3406.253
CPU max MHz:           3600.0000
CPU min MHz:           1200.0000
BogoMIPS:              5787.10
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              4096K
NUMA node0 CPU(s):     0-3
холодный морской тропический воздух
источник
1

Это для тех, кто хочет портативного способа подсчета ядер процессора на * bsd, * nix или solaris (не тестировал на aix и hp-ux, но должен работать). У меня это всегда срабатывало.

dmesg | \
egrep 'cpu[. ]?[0-9]+' | \
sed 's/^.*\(cpu[. ]*[0-9]*\).*$/\1/g' | \
sort -u | \
wc -l | \
tr -d ' '

solaris grep& egrepnot have -ooption, поэтому sedвместо этого используется.

Гвилли
источник
1

Еще один однострочник, без учета гиперпоточных ядер :

lscpu | awk -F ":" '/Core/ { c=$2; }; /Socket/ { print c*$2 }' 
Марко
источник
0

Если вам нужен метод, независимый от ОС, работает в Windows и Linux. Использовать питон

$ python -c 'import multiprocessing as m; print m.cpu_count()'
16
Meitham
источник