关于linux:命令行中的处理器/核心数

Number of processors/cores in command line

我正在运行以下命令以获取Linux中处理器/核心的数量:

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

它起作用,但看起来不优雅。你建议如何改进它?


你要找的是nproc

更多信息请访问:http://www.cyberciti.biz/faq/linux-get-number-of-cpus-core-command/


最简单的工具是glibc,称为getconf

1
2
$ getconf _NPROCESSORS_ONLN
4


我认为您提供的方法在Linux上是最可移植的。不必生成不必要的catwc进程,您可以将其缩短一点:

1
2
$ grep --count ^processor /proc/cpuinfo
2

如果您想这样做,它可以在Linux和OS X上工作,您可以这样做:

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


在较新的内核上,您还可以使用/sys/devices/system/cpu/接口获取更多信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
$ 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个答案被请求。"处理器"的数量将是安装在机器插座中的物理数量。

"核心"的数量将是物理核心。超线程(虚拟)核心将不包括在内(至少在我看来)。作为一个使用线程池编写大量程序的人,您真的需要知道物理核心与核心/超线程的数量。也就是说,您可以修改以下脚本以获得所需的答案。

1
2
3
4
5
6
7
8
9
10
11
#!/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个物理核心,也支持超线程:

1
2
3
4
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个不支持超线程的物理核心

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


UtilLinux项目提供的lscpu(1)命令也可能有用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$ 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
lscpu | awk -F":" '/Core/ { c=$2; }; /Socket/ { print c*$2 }'

这是为那些想用一种可移植的方式来计算*bsd、*nix或solaris上的CPU核心数的人准备的(还没有在AIX和HP UX上测试过,但应该可以工作)。它一直对我有用。

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

solaris grepegrep没有-o选项,因此使用sed


如果需要独立于操作系统的方法,可以跨Windows和Linux工作。使用Python

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