我有这个脚本,但我不知道如何获得打印输出中的最后一个元素:
cat /proc/cpuinfo | awk '/^processor/{print $3}'
最后一个元素应该是cpu数量减1。
我有这个脚本,但我不知道如何获得打印输出中的最后一个元素:
cat /proc/cpuinfo | awk '/^processor/{print $3}'
最后一个元素应该是cpu数量减1。
当前回答
更快,不用叉子
这适用于几乎所有的shell。
ncore=0
while read line ;do
[ "$line" ] && [ -z "${line%processor*}" ] && ncore=$((ncore+1))
done </proc/cpuinfo
echo $ncore
4
为了与shell、dash、busybox等保持兼容,我使用了ncore=$((ncore+1))而不是((ncore++))。
bash的版本
ncore=0
while read -a line ;do
[ "$line" = "processor" ] && ((ncore++))
done </proc/cpuinfo
echo $ncore
4
其他回答
使用awk计算每个“物理id”方法的“核心id”,如果“核心id”不可用,则返回“处理器”计数(如覆盆子)
echo $(awk '{ if ($0~/^physical id/) { p=$NF }; if ($0~/^core id/) { cores[p$NF]=p$NF }; if ($0~/processor/) { cpu++ } } END { for (key in cores) { n++ } } END { if (n) {print n} else {print cpu} }' /proc/cpuinfo)
在之前的众多答案中又多了一个。当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
上述答案适用于大多数情况,但如果您处于docker容器环境中,并且容器受到CpusetCpus的限制,那么您实际上无法通过上述方法获得真正的cpu内核。
在这种情况下,你需要这样做来获得真正的cpu内核:
grep -c 'cpu[0-9]' /proc/stat
下面是我用来计算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
我还认为cat /proc/cpuinfo会给我正确的答案,但是我最近看到我的ARM四核Cortex A53系统只显示了一个单核。似乎/proc/cpuinfo只显示活动的内核,而:
猫/ sys /设备/系统/ cpu /礼物
能更好地衡量那里有什么。你也可以
cat /sys/devices/system/cpu/online
查看哪些内核在线,以及
猫姐姐/设备/系统cpu -离线
查看哪些核心处于脱机状态。在线、离线和当前sysfs条目返回cpu的索引,因此返回值为0表示核心0,而返回值为1-3表示核心1、2和3。
参见https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-devices-system-cpu