110

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

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

它有效,但看起来并不优雅。你会如何建议改进它?

4

11 回答 11

143

nproc就是你要找的。

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

于 2013-10-27T15:12:17.183 回答
100

最简单的工具是 glibc 自带的,叫做getconf

$ getconf _NPROCESSORS_ONLN
4
于 2014-08-29T09:11:35.907 回答
40

我认为您提供的方法在 Linux 上是最便携的。您可以将其缩短一点,而不是产生不必要的cat进程:wc

$ grep --count ^processor /proc/cpuinfo
2
于 2013-10-27T15:40:06.957 回答
25

如果你想这样做以便它在 linux 和 OS X 上工作,你可以这样做:

CORES=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu)
于 2013-11-29T10:50:25.090 回答
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

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

于 2013-10-27T21:10:58.737 回答
8

当有人询问“处理器/内核的数量”时,需要 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
于 2016-10-18T12:29:10.650 回答
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
于 2015-04-21T16:23:18.183 回答
1

This is for those who want to a portable way to count cpu cores on *bsd, *nix or solaris (haven't tested on aix and hp-ux but should work). It has always worked for me.

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

solaris grep & egrep don't have -o option so sed is used instead.

于 2015-07-31T06:38:09.940 回答
1

另一个单线,计算超线程内核

lscpu | awk -F ":" '/Core/ { c=$2; }; /Socket/ { print c*$2 }' 
于 2015-10-30T09:27:47.120 回答
1

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

$ python -c 'import multiprocessing as m; print m.cpu_count()'
16
于 2016-07-27T13:26:15.377 回答
0

另一种便携的方法是

node -p 'os.cpus().length'
于 2021-12-08T13:06:32.767 回答