我正在运行以下命令来获取Linux中的处理器/核心数量:
cat /proc/cpuinfo | grep processor | wc -l
它有效,但看起来并不优雅。你会怎么建议改进它?
答案 0 :(得分:137)
nproc
正是您要找的。 p>
更多信息:http://www.cyberciti.biz/faq/linux-get-number-of-cpus-core-command/
答案 1 :(得分:95)
最简单的工具是glibc,名为getconf
:
$ getconf _NPROCESSORS_ONLN
4
答案 2 :(得分:39)
我认为你给出的方法在Linux上是最便携的。您可以稍微缩短它,而不是产生不必要的cat
和wc
进程:
$ grep --count ^processor /proc/cpuinfo
2
答案 3 :(得分:23)
如果你想这样做,它适用于linux和OS X,你可以这样做:
CORES=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu)
答案 4 :(得分: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。
答案 5 :(得分: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
答案 6 :(得分: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
答案 7 :(得分: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
。
答案 8 :(得分:1)
另一个单行,没有计算超线程核心:
lscpu | awk -F ":" '/Core/ { c=$2; }; /Socket/ { print c*$2 }'
答案 9 :(得分:0)
如果您需要独立于操作系统的方法,则可以在Windows和Linux上运行。使用python
$ python -c 'import multiprocessing as m; print m.cpu_count()'
16