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

cat /proc/cpuinfo | awk '/^processor/{print $3}'

最后一个元素应该是cpu数量减1。


当前回答

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

在这种情况下,你需要这样做来获得真正的cpu内核:

grep -c 'cpu[0-9]' /proc/stat

其他回答

Linux、MacOS、Windows跨平台解决方案:

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

如果您只想计算物理内核,这个命令可以满足我的需要。

lscpu -e | tail -n +2 | tr -s " " | cut -d " " -f 4 | sort | uniq | wc -w

非常基本,但似乎是计算实际的物理内核,忽略了逻辑计数

在之前的众多答案中又多了一个。当cgroup可用时,可以使用它们。cpuset子系统提供活动cpu的列表。它可以被列在/sys/fs/cgroup的顶层cgroup中。例如:

$ cat /sys/fs/cgroup/cpuset/cpuset.effective_cpus
0-3

然后,需要对后者进行解析,以获得活动cpu的数量。该文件的内容是一个以逗号分隔的CPU集列表。

下面是一个示例,使用tr将列表分解为单个表达式,并使用sed将间隔转换为传递给expr的算术操作:

#!/bin/sh

# For test purposes, the CPU sets are passed as parameters
#cpuset=`cat /sys/fs/cgroup/cpuset/cpuset.effective_cpus`
cpuset=$1

ncpu=0
for e in `echo $cpuset | tr ',' ' '`
do
  case $e in

    # CPU interval ==> Make an arithmetic operation
    *-*) op=`echo $e | sed -E 's/([0-9]+)-([0-9]+)/\2 - \1 + 1/'`;;

    # Single CPU number
    *) op=1;;

  esac

  ncpu=`expr $ncpu + $op`

done

echo $ncpu

下面是一些使用不同CPU集执行的例子:

$ for cpuset in "0" "0,3" "0-3" "0-3,67" "0-3,67,70-75" "0,1-3,67,70-75"
> do
>   ncpu.sh $cpuset
> done
1
2
4
5
11
11

考虑到打印可用CPU内核信息的特定示例代码片段,例如:

$ cat /proc/cpuinfo | awk '/^processor/{print $3}'

两种方法

根据最高的cpu核心id值得出总价值

利用一个事实,即CPU核心有一个连续的编号附加到它们,并存储在处理器字段下。由于proc文件中存储的每个CPU核心的信息是在一个由处理器字段升序排列的列表中,您可以简单地获取该序列的最后一个条目并观察处理器字段中的数值。

$ cat /proc/cpuinfo | awk '/^processor/{print $3}' | tail -n 1

注意:由于/proc/cpuinfo保存了一些对应于cpu计数的条目,处理器字段的初始值为0,不要忘记将最后一个cpu核心的值增加1。

$ last_cpu_core_id=$(/proc/cpuinfo | awk '/^processor/{print $3}' | tail -n 1)
$ echo $((last_cpu_core_id + 1))

计算输出的行数

这种方法与第一种方法相反,我们并不真正关心cpu核心id的特定值,我们只是计算输出行数。当涉及到计数时,这个过程通常从1开始,这简化了我们的解决方案。

使用grep

$ cat /proc/cpuinfo | grep processor | wc -l

或者,我们不需要记住处理器字段本身,而是利用描述单个cpu核心细节的每个条目由换行符分隔的事实。

cat /proc/cpuinfo | grep -v '^\w' | wc -l

使用awk

cat /proc/cpuinfo | awk '($1 == "processor") {count++ } END { print count }'
 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。