Я запускаю следующую команду, чтобы узнать количество процессоров / ядер в Linux:
cat /proc/cpuinfo | grep processor | wc -l
Это работает, но не выглядит элегантно. Как бы вы посоветовали его улучшить?
Я запускаю следующую команду, чтобы узнать количество процессоров / ядер в Linux:
cat /proc/cpuinfo | grep processor | wc -l
Это работает, но не выглядит элегантно. Как бы вы посоветовали его улучшить?
Ответы:
nproc
это то, что вы ищете.
Подробнее здесь: http://www.cyberciti.biz/faq/linux-get-number-of-cpus-core-command/
nproc
есть на моей виртуальной машине ubuntu, но не на моей машине с RedHat 5.5.
nproc --all
для всех установленных процессорных блоков. Без --all
, nproc
показывает только единицы обработки, доступные для текущего процесса. Прочтите страницу руководства для получения более подробной информации. MMV.
Самый простой инструмент поставляется с glibc и называется getconf
:
$ getconf _NPROCESSORS_ONLN
4
nproc
этого, это работает (по умолчанию) на Mac OS X.
_NPROCESSORS_ONLN
(или что-то еще с cpu, proc и т. Д.), Она отображается в ее выводе. Я надеялся, так как это инструмент posix, он будет работать в Linux / Solaris, поэтому мне не пришлось использовать ветвление.
Я думаю, что предложенный вами метод является наиболее переносимым в Linux. Вместо того , порождая ненужные cat
и wc
процессы, вы можете сократить его немного:
$ grep --count ^processor /proc/cpuinfo
2
Если вы хотите, чтобы это работало в Linux и OS X, вы можете:
CORES=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu)
psrinfo -p
вместо этого
В новых ядрах вы также можете использовать /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
См. Официальную документацию для получения дополнительной информации о том, что все это означает.
online
файл, более простой, чем то, что делает nproc)
Когда кто-то спрашивает «количество процессоров / ядер», запрашиваются 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
Также может быть полезна 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
Это для тех, кто хочет портативного способа подсчета ядер процессора на * 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
& egrep
not have -o
option, поэтому sed
вместо этого используется.