我有这个脚本,但我不知道如何获得打印输出中的最后一个元素:
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)
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)
msh*_*ldt 249
我找到的最便携的解决方案是getconf命令:
getconf _NPROCESSORS_ONLN
Run Code Online (Sandbox Code Playgroud)
这适用于Linux和Mac OS X.这比其他一些方法的另一个好处是getconf已经存在了很长时间.一些上了年纪的Linux机器我必须做开发上没有nproc或lscpu命令可用,但他们有getconf.
编者注:虽然该getconf 实用程序是POSIX强制的,但具体_NPROCESSORS_ONLN和_NPROCESSORS_CONF 值不是.也就是说,如上所述,它们可以在Linux平台和macOS上运行; 在FreeBSD/PC-BSD上,你必须省略领先_.
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)
请注意,除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)
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)
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)
对于物理核心的总数:
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下面有一个很好的答案.我在评论中写了一个更简洁的版本
适用于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)
如果你想这样做,它适用于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()以及其他一些方法.
上面的答案适用于大多数情况,但是如果你处于docker容器环境中并且你的容器受到限制CpusetCpus,那么你实际上无法通过上述方法获得真实的cpu核心。
在这种情况下,您需要执行以下操作来获取真正的 cpu 核心:
grep -c 'cpu[0-9]' /proc/stat
Run Code Online (Sandbox Code Playgroud)
您可以使用以下方法之一来确定物理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.