命令行中的处理器/核数


Answers:



96

最简单的工具随glibc一起提供,称为getconf

$ getconf _NPROCESSORS_ONLN
4

8
更好的是,它是POSIX实用程序:pubs.opengroup.org/onlinepubs/009604499/utilities/getconf.html
BCran 2014年

2
不像nproc,这在Mac os x上默认起作用。
亚历克·雅各布森

不幸的是,尽管该实用程序在Solaris上可用,但_NPROCESSORS_ONLN其输出中列出了(或任何带有cpu,proc等的东西)。我希望它可以在Linux / Solaris上运行,因为它是posix工具,因此我不必使用分支。
Brian Vandenberg 2015年

39

我认为您提供的方法在Linux上是最可移植的。相反产卵不必要的catwc流程,可以缩短它一下:

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

25

如果要这样做,使其可以在linux和OS X上运行,则可以执行以下操作:

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

漂亮的可移植脚本:)
mircealungu 2014年

2
在Solaris上,您需要使用psrinfo -p代替
MEMS

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)。我认为这是更好的界面。
东武2015年

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"

在具有2个型号Xeon X5650物理处理器的计算机上的结果,每个物理处理器具有6个还支持超线程的物理核心:

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个不支持超线程的物理内核

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

这是给我所需信息的最彻底的答案。
woodenToaster

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 grepegrep没有-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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.