Jumlah prosesor / inti di baris perintah

109

Saya menjalankan perintah berikut untuk mendapatkan jumlah prosesor / inti di Linux:

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

Ini berfungsi tetapi tidak terlihat elegan. Bagaimana saran Anda untuk memperbaikinya?

Michael
sumber
kemungkinan duplikat. Dapatkan jumlah CPU / inti di Linux
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Jawaban:

138

nproc adalah apa yang Anda cari.

Lebih lanjut di sini: http://www.cyberciti.biz/faq/linux-get-number-of-cpus-core-command/

pax162
sumber
11
Bagus - tapi tidak ada di mana-mana seperti / proc / cpuinfo. nprocapakah ada di VM ubuntu saya, tetapi tidak di mesin berbasis RedHat 5.5 saya.
Digital Trauma
8
Pastikan nproc --alluntuk semua Unit Pemrosesan yang diinstal. Tanpa --all, nprochanya memperlihatkan Unit Pemrosesan yang tersedia untuk proses saat ini. Baca halaman manual untuk lebih jelasnya. MMV.
JamesThomasMoon1979
96

Alat paling sederhana hadir dengan glibc dan disebut getconf:

$ getconf _NPROCESSORS_ONLN
4
Harald Hoyer
sumber
8
Lebih baik lagi, ini adalah utilitas POSIX: pubs.opengroup.org/onlinepubs/009604499/utilities/getconf.html .
BCran
2
tidak seperti nproc, ini berfungsi (secara default) di mac os x.
Alec Jacobson
Sayangnya, meskipun utilitas ini tersedia di Solaris, _NPROCESSORS_ONLN(atau apa pun dengan cpu, proc, dll) tercantum dalam outputnya. Saya berharap karena ini adalah alat posix yang berfungsi di Linux / Solaris jadi saya tidak perlu menggunakan percabangan.
Brian Vandenberg
39

Saya pikir metode yang Anda berikan adalah yang paling portabel di Linux. Alih-alih memijah catdan wcmemproses yang tidak perlu , Anda dapat mempersingkatnya sedikit:

$ grep --count ^processor /proc/cpuinfo
2
Trauma Digital
sumber
25

Jika Anda ingin melakukannya agar berfungsi di linux dan OS X, Anda dapat melakukan:

CORES=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu)
tim_yates
sumber
skrip portabel yang bagus :)
mircealungu
2
Di Solaris Anda perlu menggunakan psrinfo -psebagai gantinya
mems
14

Pada kernel yang lebih baru, Anda juga dapat menggunakan /sys/devices/system/cpu/antarmuka untuk mendapatkan lebih banyak informasi:

$ 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

Lihat dokumen resmi untuk informasi lebih lanjut tentang apa arti semua ini.

Trauma Digital
sumber
2
nproc menggunakan ini, kebanyakan ($ OMP_NUM_THREADS lalu readdir sysfs). Saya pikir yang ini adalah antarmuka yang lebih baik.
Tobu
2
Dan getconf juga mengandalkan antarmuka ini ( onlinefilenya, lebih sederhana daripada yang dilakukan nproc)
Tobu
6

Ketika seseorang menanyakan "jumlah prosesor / inti" ada 2 jawaban yang diminta. Jumlah "prosesor" akan menjadi nomor fisik yang dipasang di soket pada mesin.

Jumlah "inti" akan menjadi inti fisik. Core hyperthreaded (virtual) tidak akan disertakan (setidaknya menurut saya). Sebagai seseorang yang menulis banyak program dengan kumpulan utas, Anda benar-benar perlu mengetahui jumlah inti fisik vs inti / hyperthreads. Karena itu, Anda dapat memodifikasi skrip berikut untuk mendapatkan jawaban yang Anda butuhkan.

#!/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"

Hasil pada mesin dengan 2 model prosesor fisik Xeon X5650 masing-masing dengan 6 inti fisik yang juga mendukung hyperthreading:

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

Pada mesin dengan prosesor 2 mdeol Xeon E5472 masing-masing dengan 4 inti fisik yang tidak mendukung hyperthreading

Type model name : Intel(R) Xeon(R) CPU           E5472  @ 3.00GHz
Processors 2
Physical cores 8
Including hyperthreading cores 8
rabinnh
sumber
Ini adalah jawaban paling menyeluruh yang memberi saya informasi yang saya cari.
woodenToaster
4

The lscpu(1)perintah yang disediakan oleh util-linux proyek juga mungkin berguna:

$ 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
mtk
sumber
1

Ini untuk mereka yang menginginkan cara portabel untuk menghitung inti cpu di * bsd, * nix atau solaris (belum diuji di aix dan hp-ux tetapi seharusnya berfungsi). Itu selalu berhasil untuk saya.

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

solaris grep& egreptidak memiliki -oopsi jadi seddigunakan sebagai gantinya.

gwillie
sumber
1

Satu baris lainnya, tanpa menghitung inti hyper-threaded :

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

Jika Anda membutuhkan metode os independen, bekerja di Windows dan Linux. Gunakan python

$ python -c 'import multiprocessing as m; print m.cpu_count()'
16
Meitham
sumber