Кількість процесорів / ядер у командному рядку


108

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

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

Це працює, але це не виглядає елегантно. Як би ви запропонували покращити його?


Відповіді:


138

nproc це те, що ви шукаєте.

Більше тут: http://www.cyberciti.biz/faq/linux-get-number-of-cpus-core-command/


11
Хороший - але не такий всюдисущий, як / proc / cpuinfo. nprocє на моїй машині Ubuntu VM, але не на моїй машині на базі RedHat 5.5.
Цифрова травма

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(або що-небудь з процесором, процесором тощо) зазначено у її результатах. Я сподівався, оскільки це інструмент 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)

приємний портативний сценарій :)
mircealungu

2
На Solaris потрібно використовувати psrinfo -pзамість цього
пам’яті

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)
Tobu

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"

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

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

На машині з двома процесорами Xdeon E5472 2 mdeol, кожен з 4 фізичними ядрами, що не підтримує гіперточування

Type model name : Intel(R) Xeon(R) CPU           E5472  @ 3.00GHz
Processors 2
Physical cores 8
Including hyperthreading cores 8

Це найповніша відповідь, яка дала мені інформацію, яку я шукав.
дерев'янийToaster

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& egrepне мають -oможливості, тому sedвикористовується замість цього.


1

Ще один однолінійний, не рахуючи гіперпотокові сердечники :

lscpu | awk -F ":" '/Core/ { c=$2; }; /Socket/ { print c*$2 }' 

0

Якщо вам потрібен незалежний метод os, працює в Windows та Linux. Використовуйте пітон

$ python -c 'import multiprocessing as m; print m.cpu_count()'
16
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.