如何从命令行获取Linux中的CPU /内核数量?
我有这个脚本,但我不知道如何获得打印输出中的最后一个元素:
cat /proc/cpuinfo | awk '/^processor/{print $3}'
最后一个元素应该是CPU的数量,减1。
cat /proc/cpuinfo | awk '/^processor/{print $3}' | tail -1
或干脆
grep -c ^processor /proc/cpuinfo
这将对在/proc/cpuinfo
以“processor”开头的行数进行计数
处理/proc/cpuinfo
的内容是不必要的巴洛克式的。 使用nproc这是coreutils的一部分,所以它应该在大多数Linux安装中可用。
命令nproc
输出当前进程可用的处理单元数量,可能less于在线处理器数量。
要find所有安装的内核/处理器的数量,请使用nproc --all
在我的8核心机器上:
$ nproc --all 8
我find的最便携的解决scheme是getconf
命令:
getconf _NPROCESSORS_ONLN
这在Linux和Mac OS X上都可以使用。另外一个好处就是getconf已经存在很长时间了。 我必须开发的一些较老的Linux机器没有可用的nproc
或lscpu
命令,但它们具有getconf
。
编者按:虽然getconf
实用程序是POSIX规定的 ,但是具体的_NPROCESSORS_ONLN
和_NPROCESSORS_CONF
值不是。 也就是说,如上所述,他们在Linux平台以及macOS上工作。 在FreeBSD / PC-BSD上,你必须省略前面的_
。
前言:
-
基于
/proc/cpuinfo
的答案的问题是,它们parsing了供人类使用的信息,因此缺乏为机器分析devise的稳定格式 :输出格式可能因平台和运行时间条件而有所不同; 在Linux上使用lscpu -p
(和OSX上的sysctl
)可以绕过这个问题 。 -
getconf _NPROCESSORS_ONLN
/getconf NPROCESSORS_ONLN
不区分逻辑 CPU和物理 CPU。
这里有一个bash
代码片断,它可以在Linux和macOS上运行,以确定在线 – 逻辑或物理 CPU的数量 ; 请参阅评论的细节。
Linux使用lscpu
,macOS使用sysctl
。
术语说明 : CPU指操作系统所见的最小处理单元。 非超线程核心每个对应1个CPU,而超线程核心包含多于1个(通常是2个)逻辑CPU。
Linux使用以下分类法,从最小单元开始: CPU < 核心 < 套接字 < 书 < 节点 ,每个级别包括下一个较低级别的一个或多个实例。
我的知识有些不稳定 – 如果我错了,请告诉我。 有没有人知道在这方面“书”是什么?
# macOS: Use `sysctl -n hw.*cpu_max`, which returns the values of # interest directly. # CAVEAT: Using the "_max" key suffixes means that the *maximum* # available number of CPUs is reported, whereas the # current power-management mode could make *fewer* CPUs # available; dropping the "_max" suffix would report the # number of *currently* available ones; see [1] below. # # Linux: Parse output from `lscpu -p`, where each output line represents # a distinct (logical) CPU. # Note: Newer versions of `lscpu` support more flexible output # formats, but we stick with the parseable legacy format # generated by `-p` to support older distros, too. # `-p` reports *online* CPUs only - ie, on hot-pluggable # systems, currently disabled (offline) CPUs are NOT # reported. # Number of LOGICAL CPUs (includes those reported by hyper-threading cores) # Linux: Simply count the number of (non-comment) output lines from `lscpu -p`, # which tells us the number of *logical* CPUs. logicalCpuCount=$([[ $(uname) = 'Darwin' ]] && sysctl -n hw.logicalcpu_max || lscpu -p | egrep -v '^#' | wc -l) # Number of PHYSICAL CPUs (cores). # Linux: The 2nd column contains the core ID, with each core ID having 1 or # - in the case of hyperthreading - more logical CPUs. # Counting the *unique* cores across lines tells us the # number of *physical* CPUs (cores). physicalCpuCount=$([[ $(uname) = 'Darwin' ]] && sysctl -n hw.physicalcpu_max || lscpu -p | egrep -v '^#' | sort -u -t, -k 2,4 | wc -l)
[1] macOS sysctl (3)
文档
请注意,除macOS以外的BSD派生系统(例如FreeBSD)仅支持sysctl
的hw.ncpu
密钥,这在macOS上已弃用; 我不清楚哪个新密钥hw.npu
对应于: hw.(logical|physical)cpu_[max]
。
帮助纠正物理CPU数量lscpu
命令的帽子提示lscpu
。
注意 : lscpu -p
输出不包括“book”列( man
页提到“books”是分类层次结构中套接字和节点之间的实体)。 如果“books”在给定的Linux系统上运行( 是否有人知道何时以及如何? ),则可能会报告physical-CPU-count命令(这是基于lscpu
报告非唯一跨 ID 更高级的实体 ;例如:来自2个不同套接字的2个不同的核心可以具有相同的ID)。
这对我有效。 tail -nX
允许你只抓取最后的X行。
cat /proc/cpuinfo | awk '/^processor/{print $3}' | tail -1
如果你有超线程,这应该可以用来获取物理内核的数量。
grep "^core id" /proc/cpuinfo | sort -u | wc -l
对于物理核心的总数:
grep '^core id' /proc/cpuinfo |sort -u|wc -l
在多套接字机器上(或总是),将上面的结果乘以套接字的数量:
echo $(($(grep "^physical id" /proc/cpuinfo | awk '{print $4}' | sort -un | tail -1)+1))
@ mklement0在下面使用lscpu有一个很好的答案。 我在评论中写了一个更简洁的版本
使用getconf确实是最可移植的方式,但是variables在BSD和Linux中有不同的名称来获取configuration文件,所以你必须同时testing,正如这个要点所示: https : //gist.github.com/jj1bdx/5746298 (也包括使用ksh的Solaris修复程序)
我个人使用:
$ getconf _NPROCESSORS_ONLN 2>/dev/null || getconf NPROCESSORS_ONLN 2>/dev/null || echo 1
如果你想在python中使用,你可以通过导入os模块来使用syscall的getconf用法:
$ python -c 'import os; print os.sysconf(os.sysconf_names["SC_NPROCESSORS_ONLN"]);'
至于nproc
,它是GNU Coreutils的一部分,所以默认情况下在BSD中不可用。 它使用sysconf()以及其他一些方法。
如果你想这样做,所以它适用于Linux和OS X,你可以这样做:
CORES=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu)
你也可以使用Python! 要获取物理核心的数量:
$ python -c "import psutil; psutil.cpu_count(logical=False)" 4
要获得超线程核心的数量:
$ python -c "import psutil; psutil.cpu_count(logical=True)" 8
以下应该给你超线程和非超线程系统上“真实”内核的数量。 至less它在我所有的testing中都有效。
awk -F: '/^physical/ && !ID[$2] { P++; ID[$2]=1 }; /^cpu cores/ { CORES=$2 }; END { print CORES*P }' /proc/cpuinfo
您可以使用以下方法之一来确定物理 CPU内核的数量。
-
计算唯一核心ID的数量(大致相当于
grep -P '^core id\t' /proc/cpuinfo | sort -u | wc -l
)。awk '/^core id\t/ {cores[$NF]++} END {print length(cores)}' /proc/cpuinfo
-
“每个sockets的芯数”乘以sockets的数量。
lscpu | awk '/^Core\(s\) per socket:/ {cores=$NF}; /^Socket\(s\):/ {sockets=$NF}; END{print cores*sockets}'
-
计算Linux内核使用的唯一逻辑CPU的数量。
-p
选项生成输出以便于parsing,并与早期版本的lscpu
兼容。lscpu -p | awk -F, '$0 !~ /^#/ {cores[$1]++} END {print length(cores)}'
只是重申别人的说法,还有一些相关的属性。
要确定可用的处理器数量:
getconf _NPROCESSORS_ONLN grep -cP '^processor\t' /proc/cpuinfo
确定可用处理单元的数量(不一定与核心数量相同)。 这是超线程意识。
nproc
我不想在兔子洞下太深,但是你也可以通过getconf _NPROCESSORS_CONF
来确定configuration的处理器的数量(而不是简单的可用/在线处理器)。 要确定CPU的总数(离线和在线),您想分析lscpu -ap
的输出。
如果“核心ID”不可用(如覆盆子),则使用awk与“处理器”计数回退计数“每个”物理ID“方法的”核心ID“
echo $(awk '{ if ($0~/^physical id/) { p=$NF }; if ($0~/^core id/) { cores[p$NF]=p$NF }; if ($0~/processor/) { cpu++ } } END { for (key in cores) { n++ } } END { if (n) {print n} else {print cpu} }' /proc/cpuinfo)
不是我的网页,但这个命令从http://www.ixbrian.com/blog/?p=64&cm_mc_uid=89402252817914508279022&cm_mc_sid_50200000=1450827902很适合我在centos上。; 即使启用了超线程,它也会显示实际的cpus。
cat /proc/cpuinfo | egrep "core id|physical id" | tr -d "\n" | sed s/physical/\\nphysical/g | grep -v ^$ | sort | uniq | wc -l