Number of processors/cores in command line
我正在运行以下命令以获取Linux中处理器/核心的数量:
1 | cat /proc/cpuinfo | grep processor | wc -l |
它起作用,但看起来不优雅。你建议如何改进它?
你要找的是
更多信息请访问:http://www.cyberciti.biz/faq/linux-get-number-of-cpus-core-command/
最简单的工具是glibc,称为
1 2 | $ getconf _NPROCESSORS_ONLN 4 |
我认为您提供的方法在Linux上是最可移植的。不必生成不必要的
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) |
在较新的内核上,您还可以使用
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项目提供的
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
如果需要独立于操作系统的方法,可以跨Windows和Linux工作。使用Python
1 2 | $ python -c 'import multiprocessing as m; print m.cpu_count()' 16 |