命令行中的处理器/核心数

Mic*_*ael 106 linux bash command-line

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

cat /proc/cpuinfo | grep processor | wc -l
Run Code Online (Sandbox Code Playgroud)

它有效,但看起来并不优雅.你会怎么建议改进它?

pax*_*162 136

nproc 是你在找什么.

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

  • 很好 - 但不像/ proc/cpuinfo那样普遍存在.`nproc`在我的ubuntu VM上,但不在我的基于RedHat 5.5的机器上. (10认同)
  • 确保所有已安装的处理单元都有"nproc --all".没有`--all`,`nproc`只显示当前进程可用的处理单元.阅读手册页以获取更多详细信息.MMV. (7认同)

Har*_*yer 95

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

$ getconf _NPROCESSORS_ONLN
4
Run Code Online (Sandbox Code Playgroud)

  • 更好的是,它是一个POSIX实用程序:http://pubs.opengroup.org/onlinepubs/009604499/utilities/getconf.html. (7认同)
  • 这应该是公认的答案.发现. (5认同)
  • 与 `nproc` 不同,这在 mac os x 上(默认)有效。 (2认同)

Dig*_*uma 39

我认为你提供的方法在Linux上是最便携的.您可以稍微缩短它,而不是产生不必要的catwc进程:

$ grep --count ^processor /proc/cpuinfo
2
Run Code Online (Sandbox Code Playgroud)


tim*_*tes 24

如果你想这样做,它适用于Linux和OS X,你可以这样做:

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

  • 在 Solaris 上,您需要使用 `psrinfo -p` 代替 (2认同)

Dig*_*uma 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
Run Code Online (Sandbox Code Playgroud)

有关所有这些含义的更多信息,请参阅官方文档.

  • nproc主要使用它($ OMP_NUM_THREADS然后是readdir sysfs).我认为这个是更好的界面. (2认同)
  • 并且getconf也依赖于这个接口(`online`文件,比nproc更简单) (2认同)

rab*_*nnh 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"
Run Code Online (Sandbox Code Playgroud)

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

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

在具有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
Run Code Online (Sandbox Code Playgroud)


mtk*_*mtk 5

util-linuxlscpu(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
Run Code Online (Sandbox Code Playgroud)