如何从命令行获取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