我有这个脚本,但我不知道如何获得打印输出中的最后一个元素:
cat /proc/cpuinfo | awk '/^processor/{print $3}'
最后一个元素应该是cpu数量减1。
我有这个脚本,但我不知道如何获得打印输出中的最后一个元素:
cat /proc/cpuinfo | awk '/^processor/{print $3}'
最后一个元素应该是cpu数量减1。
当前回答
我发现的最可移植的解决方案是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的答案的问题是,它们解析的是供人类使用的信息,因此缺乏为机器解析设计的稳定格式:输出格式可能因平台和运行时条件而不同;在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”
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。
使用下面的查询获取核心细节
[oracle@orahost](TESTDB)$ grep -c ^processor /proc/cpuinfo
8
cat /proc/cpuinfo | grep processor
这工作得很好。当我尝试第一个答案时,我得到了3个CPU的输出。我知道我在系统上有4个cpu,所以我只是为处理器做了一个grep,输出看起来像这样:
[root@theservername ~]# cat /proc/cpuinfo | grep processor
processor : 0
processor : 1
processor : 2
processor : 3
如果你想这样做,让它在linux和OS X上工作,你可以这样做:
CORES=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu)