2013-10-27 48 views
103

我運行下面的命令來獲得Linux的處理器/核心數量的處理器數/核:在命令行

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

它的工作原理,但它看起來並不優雅。你會如何改進它?

+0

[在Linux中獲取CPU的數目/核]的可能重複(http://stackoverflow.com/questions/6481005/obtain-the-number-of-cpus-cores -一世n-linux) –

回答

135
+10

不錯 - 但不像普通/ proc/cpuinfo那樣普遍。 'nproc'在我的ubuntu虛擬機上,但不在我的基於RedHat 5.5的機器上。 –

+7

確保所有已安裝的處理單元都有'nproc --all'。如果沒有'--all','nproc'只顯示當前進程可用的處理單元。 閱讀手冊頁以獲取更多詳細信息。 MMV。 – JamesThomasMoon1979

39

我覺得你給的方法是最便攜的Linux操作系統。相反產卵不必要catwc過程,可以縮短這一點:

$ grep --count ^processor /proc/cpuinfo 
2 
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 

the official docs瞭解所有這些含義的更多信息。

+2

nproc使用它,主要是($ OMP_NUM_THREADS,然後是readdir sysfs)。我認爲這是一個更好的界面。 – Tobu

+2

而且getconf也依賴於這個接口('online'文件,比nproc更簡單) – Tobu

22

如果你想這樣做,因此它可以在Linux和OS X,你可以這樣做:

CORES=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu) 
+0

不錯的可移植腳本:) – mircealungu

+1

在Solaris上,你需要使用'psrinfo -p'而不是 – mems

90

用最簡單的工具自帶的glibc,被稱爲getconf

$ getconf _NPROCESSORS_ONLN 
4 
+5

這應該是被接受的答案。發現。 –

+7

更好的是,它是一個POSIX實用程序:http://pubs.opengroup.org/onlinepubs/009604499/utilities/getconf.html。 – BCran

+0

這是唯一一個爲我工作的人。謝謝。 –

4

的由的util-linux的項目提供lscpu(1)命令也可能是有用的:

$ 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上的cpu核心(未在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

如果你需要一個操作系統獨立的方法,可跨Windows和Linux。使用python

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

當有人要求「處理器/內核的數量」時,有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模型至強X5650物理處理器每組6個物理內核也支持超線程:

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

在一臺具有2 mdeol至強E5472處理器,每個有4個物理內核不支持超線程

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

這是給我提供我正在尋找的信息的最徹底的答案。 – woodenToaster