Я виконую наступну команду, щоб отримати кількість процесорів / ядер в 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 VM, але не на моїй машині на базі RedHat 5.5.
nproc --all
для всіх встановлених одиниць обробки. Без --all
, nproc
показує лише опрацювальні блоки, доступні для поточного процесу. Прочитайте сторінку чоловіка для отримання більш детальної інформації. MMV.
Найпростіший інструмент постачається з glibc і називається getconf
:
$ getconf _NPROCESSORS_ONLN
4
nproc
цього, це працює (за замовчуванням) на mac os x.
_NPROCESSORS_ONLN
(або що-небудь з процесором, процесором тощо) зазначено у її результатах. Я сподівався, оскільки це інструмент 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"
Результат на машині з двома модельними фізичними процесорами 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
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
не мають -o
можливості, тому sed
використовується замість цього.