我有这个脚本,但我不知道如何获得打印输出中的最后一个元素:
cat /proc/cpuinfo | awk '/^processor/{print $3}'
最后一个元素应该是cpu数量减1。
我有这个脚本,但我不知道如何获得打印输出中的最后一个元素:
cat /proc/cpuinfo | awk '/^processor/{print $3}'
最后一个元素应该是cpu数量减1。
当前回答
dmidecode | grep -i cpu | grep Version
给我
版本:Intel(R) Xeon(R) CPU E5-2667 v4 @ 3.20GHz 版本:Intel(R) Xeon(R) CPU E5-2667 v4 @ 3.20GHz
这是正确的插座数量-查找E5-2667告诉我每个插座有8个核心,所以乘以,最终在2个插座上有16个核心。
lscpu给了我20个cpu -这是完全不正确的-不知道为什么。(cat /proc/cpu也一样-结果是20。
其他回答
如果你可以使用Python,那么numexpr模块有一个函数:
In [5]: import numexpr as ne
In [6]: ne.detect_number_of_cores()
Out[6]: 8
也:
In [7]: ne.ncores
Out[7]: 8
从命令提示符中查询该信息使用:
# runs whatever valid Python code given as a string with `-c` option
$ python -c "import numexpr as ne; print(ne.ncores)"
8
或者简单地说,可以从multiprocessing.cpu_count()函数中获得此信息
$ python -c "import multiprocessing; print(multiprocessing.cpu_count())"
或者干脆使用os.cpu_count()
$ python -c "import os; print(os.cpu_count())"
下面是我用来计算Linux上在线物理内核数量的方法:
lscpu --online --parse=Core,Socket | grep --invert-match '^#' | sort --unique | wc --lines
简而言之:
lscpu -b -p=Core,Socket | grep -v '^#' | sort -u | wc -l
示例(1个socket):
> 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
示例(2个socket):
> 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
示例(4个socket):
> 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
你也可以使用Python!获取物理核数:
$ python -c "import psutil; print(psutil.cpu_count(logical=False))"
4
获取超线程核的数量:
$ python -c "import psutil; print(psutil.cpu_count(logical=True))"
8
前言:
基于/proc/cpuinfo的答案的问题是,它们解析的是供人类使用的信息,因此缺乏为机器解析设计的稳定格式:输出格式可能因平台和运行时条件而不同;在Linux上使用lscpu -p(在macOS上使用sysctl)可以绕过这个问题。 getconf _NPROCESSORS_ONLN / getconf NPROCESSORS_ONLN不区分逻辑cpu和物理cpu。
下面是一个sh (posix兼容)代码片段,用于在Linux和macOS上确定在线逻辑或物理cpu的数量;详见评论。
Linux使用lscpu, macOS使用sysctl。
术语注意:CPU是指操作系统中最小的处理单元。非超线程内核每个对应1个CPU,而超线程内核包含多于1(通常为2)-逻辑- CPU。 Linux使用以下分类法[1],从最小的单位开始: CPU < core < socket < book <节点 每一层包含下一层的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
[1] macOS sysctl(3)文档
注意,除了macOS之外的bsd衍生系统——例如FreeBSD——只支持hw。sysctl的ncpu键,macOS上已弃用;我不清楚是哪个新键hw。Npu对应于:hw.(logical|physical)cpu_[max]。
感谢@teambob帮助纠正physical-CPU-count lscpu命令。
注意:lscpu -p输出不包括“book”列(手册页提到“books”是分类层次结构中套接字和节点之间的实体)。如果在给定的Linux系统上“books”正在使用(有人知道什么时候和如何使用吗?),physical-CPU-count命令可能会报告不足(这是基于lscpu报告的id在更高级别实体中不是唯一的假设;例如:来自2个不同插座的2个不同内核可能具有相同的ID)。
如果你将上面的代码保存为shell脚本cpu,使用chmod +x cpu可执行,并将其放在$PATH文件夹中,你会看到如下输出:
$ cpus
logical 4
physical 4
Xaekai解释了什么是书:“书是一个模块,里面有一个带有CPU插座、RAM插座、沿边缘的IO连接的电路板,还有一个用于冷却系统集成的钩子。它们用于IBM大型机。更多信息:http://ewh.ieee.org/soc/cpmt/presentations/cpmt0810a.pdf”
使用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
如果你想在python中使用这个,你可以通过导入os模块来使用getconf使用的syscall:
$ python -c 'import os; print os.sysconf(os.sysconf_names["SC_NPROCESSORS_ONLN"]);'
至于nproc,它是GNU Coreutils的一部分,所以默认情况下在BSD中不可用。它在其他一些方法之后也使用sysconf()。