如何从命令行获取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机器没有可用的nproclscpu命令,但它们具有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)仅支持sysctlhw.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