如何从命令行获取Linux中的CPU /核心数?

Ric*_*ard 510 linux bash cpu

我有这个脚本,但我不知道如何获得打印输出中的最后一个元素:

cat /proc/cpuinfo | awk '/^processor/{print $3}'
Run Code Online (Sandbox Code Playgroud)

最后一个元素应该是CPU的数量减去1.

uck*_*man 615

处理内容/proc/cpuinfo是不必要的巴洛克式.使用作为coreutils一部分的nproc,因此它应该可以在大多数Linux安装中使用.

命令nproc打印当前进程可用的处理单元数,可能少于在线处理器的数量.

要查找所有已安装的核心/处理器的使用数量 nproc --all

在我的8核机器上:

$ nproc --all
8
Run Code Online (Sandbox Code Playgroud)

  • 如果我需要物理内核的数量,这不适用于超线程.在我的四核i7盒子上返回8. (10认同)
  • 它区分虚拟核心和物理核心吗? (6认同)
  • 不幸的是,`nproc`不是boot2docker的一部分 (3认同)

unb*_*eli 613

grep -c ^processor /proc/cpuinfo     
Run Code Online (Sandbox Code Playgroud)

或者干脆

grep ^cpu\\scores /proc/cpuinfo | uniq |  awk '{print $4}' 
Run Code Online (Sandbox Code Playgroud)

这将计算以"处理器"开头的行数 /proc/cpuinfo

对于具有超线程的系统,您可以使用

grep -c ^processor /proc/cpuinfo     
Run Code Online (Sandbox Code Playgroud)

应返回(例如)8(而上面的命令将返回16)

  • 请注意,如果您使用的是超线程系统(例如,P4或Core i7),这两个核心最终将计算实际存在的核心数量的两倍. (41认同)
  • `cat/proc/cpuinfo | awk'/ ^ processor/{print $ 3}'| 如果CPU编号为0,则tail -1`也将返回错误的编号. (39认同)
  • @duskwuff:在大多数情况下,这正是你想要的. (22认同)
  • zsh上的`grep -c'^ processor'/ proc/cpuinfo`. (7认同)
  • 第一行返回1 Core少于现有.更好的cat/proc/cpuinfo | awk'/ ^ processor/{print $ 3}'| wc -l (3认同)
  • 答案更新了超线程选项 (2认同)
  • 第一行不起作用.第二行更好.是不是有工具来查询实际的处理器本身而不是grep一些文本文件? (2认同)
  • 这两个答案给出了一个对我不同的答案. (2认同)
  • 只是做`grep'^ processor'/ proc / cpuinfo | wc -l`将给出以“处理器”开头的行数的计数,而不是依赖于基于0的编号系统。另外,`grep -c'^ processor'/ proc / cpuinfo`可以得到相同的结果命令。 (2认同)

msh*_*ldt 249

我找到的最便携的解决方案是getconf命令:

getconf _NPROCESSORS_ONLN
Run Code Online (Sandbox Code Playgroud)

这适用于Linux和Mac OS X.这比其他一些方法的另一个好处是getconf已经存在了很长时间.一些上了年纪的Linux机器我必须做开发上没有nproclscpu命令可用,但他们有getconf.

编者注:虽然getconf 实用程序是POSIX强制的,但具体_NPROCESSORS_ONLN_NPROCESSORS_CONF 不是.也就是说,如上所述,它们可以在Linux平台和macOS上运行; 在FreeBSD/PC-BSD上,你必须省略领先_.

  • 这对我来说适用于Red Hat Entreprise Linux 5.4,Centos 6.5和7以及Mac OSX 10.9(Mavericks).它似乎是最便携的,因为默认情况下不会在这些系统上安装lscpu.谢谢! (11认同)
  • 便携式它在POSIX :) http://pubs.opengroup.org/onlinepubs/009604499/utilities/getconf.html (8认同)
  • 这是正确的答案.适用于OSX和Ubuntu. (6认同)
  • @CiroSantilli六四事件法轮功纳米比亚威视来自https://github.com/gstrauss/plasma/blob/master/plasma_sysconf.c看起来我错了:它只是可选的."标准不要求sysconf _SC_NPROCESSORS_ONLN和_SC_NPROCESSORS_CONF,但是在许多unix平台上提供,并由Open Group记录为可选." (3认同)

mkl*_*nt0 90

前言:

  • 这个问题/proc/cpuinfo为基础的答案是,他们分析认为是为那些信息人类消费,从而缺乏专为机解析一个稳定的格式:输出格式可以跨平台和运行时的条件不同; 使用lscpu -p在Linux(和sysctl在MacOS)绕过这个问题.

  • getconf _NPROCESSORS_ONLN/ getconf NPROCESSORS_ONLN不区分逻辑 CPU 和物理 CPU.


这是一个sh(POSIX兼容的)代码片段,适用于Linux和macOS,用于确定- 在线 - 逻辑物理 CPU的数量 ; 请参阅评论了解详情.

用途lscpu用于Linux和sysctlMacOS的.

术语说明:CPU是指操作系统看到的最小处理单元.非超线程内核每个对应1个CPU,而超线程内核包含多于1个(通常为2个)逻辑CPU.
Linux使用以下分类法,从最小单位开始:CPU < core < socket < book < node,每个级别包含下一个较低级别的1个或多个实例.
我的知识在这里有些不稳定 - 如果我错了,请告诉我. 在这种情况下,有谁知道"书"是什么?

#!/bin/sh

# 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 - i.e., 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)

# Print the values.
cat <<EOF
# of logical CPUs:  $logicalCpuCount
# of physical CPUS: $physicalCpuCount
EOF
Run Code Online (Sandbox Code Playgroud)

[1] macOS sysctl (3)文档

请注意,除macOS之外的BSD派生系统(例如,FreeBSD)仅支持hw.ncpu密钥sysctl,在macOS上不推荐使用; 我不清楚哪个新键hw.npu对应:hw.(logical|physical)cpu_[max].

向@teambob提供帮助纠正physical-CPU-count lscpu命令的提示.

警告:lscpu -p输出不包括"book"列(man页面提到"books"作为分类层次结构中socket和node之间的实体).如果给定的Linux系统上有"书籍"(有人知道何时以及如何?),则物理CPU计数命令可能报告不足(这是基于lscpu报告在非常高的位置上具有非唯一性的ID 的假设级别实体 ;例如:来自2个不同套接字的2个不同核心可以具有相同的ID).


如果您将上面的代码保存为shell脚本cpus,使其可执行chmod +x cpus并将其放在您的文件夹中$PATH,您将看到如下输出:

$ cpus
logical  4
physical 4
Run Code Online (Sandbox Code Playgroud)

  • 我认为这里的大多数解决方案都忽略了多插槽机器,不像这个。谢谢! (2认同)

Sh4*_*msi 38

lscpu 以人类可读格式收集CPU架构信息表/ proc/cpuinfon:

# lscpu


Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    1
Core(s) per socket:    4
CPU socket(s):         2
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 15
Stepping:              7
CPU MHz:               1866.669
BogoMIPS:              3732.83
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              4096K
NUMA node0 CPU(s):     0-7
Run Code Online (Sandbox Code Playgroud)

另见https://unix.stackexchange.com/questions/468766/understanding-output-of-lscpu.


Fra*_*ona 15

下面是我用来计算 Linux 上在线物理内核数量的方法:

lscpu --online --parse=Core,Socket | grep --invert-match '^#' | sort --unique | wc --lines
Run Code Online (Sandbox Code Playgroud)

或简而言之:

lscpu -b -p=Core,Socket | grep -v '^#' | sort -u | wc -l
Run Code Online (Sandbox Code Playgroud)

示例(1 个插座):

> lscpu
...
CPU(s):                28
Thread(s) per core:    2
Core(s) per socket:    14
Socket(s):             1
....
> lscpu -b -p=Core,Socket | grep -v '^#' | sort -u | wc -l
14
Run Code Online (Sandbox Code Playgroud)

示例(2 个插座):

> lscpu
...
CPU(s):                56
Thread(s) per core:    2
Core(s) per socket:    14
Socket(s):             2
...
> lscpu -b -p=Core,Socket | grep -v '^#' | sort -u | wc -l
28
Run Code Online (Sandbox Code Playgroud)

示例(4 个插座):

> lscpu
...
CPU(s):                64
Thread(s) per core:    2
Core(s) per socket:    8
Socket(s):             4
...
> lscpu -b -p=Core,Socket | grep -v '^#' | sort -u | wc -l
32
Run Code Online (Sandbox Code Playgroud)

  • 工作并处理多个套接字 (2认同)
  • 这是最好的答案。 (2认同)

lun*_*chs 13

这对我有用.tail -nX允许您仅抓取最后的X行.

cat /proc/cpuinfo | awk '/^processor/{print $3}' | tail -1
Run Code Online (Sandbox Code Playgroud)

如果您有超线程,那么这应该可以用于获取物理内核的数量.

grep "^core id" /proc/cpuinfo | sort -u | wc -l
Run Code Online (Sandbox Code Playgroud)


ost*_*ach 10

你也可以使用Python!要获取物理核心数:

$ python -c "import psutil; print(psutil.cpu_count(logical=False))"
4
Run Code Online (Sandbox Code Playgroud)

要获得超线程核心的数量:

$ python -c "import psutil; print(psutil.cpu_count(logical=True))"
8
Run Code Online (Sandbox Code Playgroud)


tea*_*bob 9

对于物理核心的总数:

grep '^core id' /proc/cpuinfo |sort -u|wc -l
Run Code Online (Sandbox Code Playgroud)

在多插槽机器上(或总是),将上面的结果乘以套接字的数量:

echo $(($(grep "^physical id" /proc/cpuinfo | awk '{print $4}' | sort -un | tail -1)+1))
Run Code Online (Sandbox Code Playgroud)

使用lscpu,@ mklement0下面有一个很好的答案.我在评论中写了一个更简洁的版本


Ser*_*gey 9

适用于Linux,MacOS,Windows的跨平台解决方案:

CORES=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu || echo "$NUMBER_OF_PROCESSORS")
Run Code Online (Sandbox Code Playgroud)


tim*_*tes 6

如果你想这样做,它适用于Linux和OS X,你可以这样做:

CORES=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu)
Run Code Online (Sandbox Code Playgroud)


小智 6

使用getconf确实是最便携的方式,但是变量在BSD和Linux中有不同的名称来getconf,所以你必须测试两者,正如这个要点所暗示的那样:https: //gist.github.com/jj1bdx/5746298 (还包括使用ksh进行Solaris修复)

我个人使用:

$ getconf _NPROCESSORS_ONLN 2>/dev/null || getconf NPROCESSORS_ONLN 2>/dev/null || echo 1
Run Code Online (Sandbox Code Playgroud)

如果你想在python中使用它,你可以通过导入os模块使用syscall getconf使用:

$ python -c 'import os; print os.sysconf(os.sysconf_names["SC_NPROCESSORS_ONLN"]);'
Run Code Online (Sandbox Code Playgroud)

至于nproc它是GNU Coreutils的一部分,默认情况下在BSD中不可用.它使用sysconf()以及其他一些方法.


小智 6

这很简单。只需使用此命令:

lscpu
Run Code Online (Sandbox Code Playgroud)


aka*_*ecc 6

上面的答案适用于大多数情况,但是如果你处于docker容器环境中并且你的容器受到限制CpusetCpus,那么你实际上无法通过上述方法获得真实的cpu核心

在这种情况下,您需要执行以下操作来获取真正的 cpu 核心:

grep -c 'cpu[0-9]' /proc/stat
Run Code Online (Sandbox Code Playgroud)


Six*_*Six 5

您可以使用以下方法之一来确定物理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

  • 将“每个插槽的核心数”乘以插槽数。

    lscpu | awk '/^Core\(s\) per socket:/ {cores=$NF}; /^Socket\(s\):/ {sockets=$NF}; END{print cores*sockets}'

  • 计算 Linux 内核使用的唯一逻辑 CPU 的数量。该-p选项生成输出以便于解析,并且与早期版本的lscpu.

    lscpu -p | awk -F, '$0 !~ /^#/ {cores[$1]++} END {print length(cores)}'


只是重申其他人所说的话,有许多相关的属性。

要确定可用的处理器数量:

getconf _NPROCESSORS_ONLN
grep -cP '^processor\t' /proc/cpuinfo
Run Code Online (Sandbox Code Playgroud)

确定可用的处理单元数量(不一定与内核数量相同)。这是超线程感知的。

nproc
Run Code Online (Sandbox Code Playgroud)

我不想走得太远,但您也可以通过getconf _NPROCESSORS_CONF. 要确定 CPU 的总数(离线和在线),您需要解析lscpu -ap.