我有这个脚本,但我不知道如何获得打印输出中的最后一个元素:
cat /proc/cpuinfo | awk '/^processor/{print $3}'
最后一个元素应该是cpu数量减1。
我有这个脚本,但我不知道如何获得打印输出中的最后一个元素:
cat /proc/cpuinfo | awk '/^processor/{print $3}'
最后一个元素应该是cpu数量减1。
当前回答
可以通过以下两种方式确定CPU的物理核数。
Count the number of unique core ids (roughly equivalent to grep -P '^core id\t' /proc/cpuinfo | sort -u | wc -l). awk '/^core id\t/ {cores[$NF]++} END {print length(cores)}' /proc/cpuinfo Multiply the number of 'cores per socket' by the number of sockets. lscpu | awk '/^Core\(s\) per socket:/ {cores=$NF}; /^Socket\(s\):/ {sockets=$NF}; END{print cores*sockets}' Count the number of unique logical CPU's as used by the Linux kernel. The -p option generates output for easy parsing and is compatible with earlier versions of lscpu. lscpu -p | awk -F, '$0 !~ /^#/ {cores[$1]++} END {print length(cores)}'
重申一下其他人所说的,有一些相关的属性。
要确定可用的处理器数量:
getconf _NPROCESSORS_ONLN
grep -cP '^processor\t' /proc/cpuinfo
确定可用的处理单元数量(不一定与内核数量相同)。这是超线程感知的。
nproc
我不想太深入,但是您还可以通过getconf _NPROCESSORS_CONF确定已配置处理器的数量(而不是简单的可用/在线处理器)。要确定CPU的总数(离线和在线),您需要解析lscpu -ap的输出。
其他回答
处理/proc/cpuinfo的内容是不必要的繁复。使用nproc,它是coreutils的一部分,所以它应该在大多数Linux安装中可用。
命令nproc打印当前进程可用的处理单元的数量,该数量可能小于在线处理器的数量。
使用nproc——all查找所有已安装的内核/处理器的数量
在我的8核机器上:
$ nproc --all
8
不是我的网页,但是来自http://www.ixbrian.com/blog/?p=64&cm_mc_uid=89402252817914508279022&cm_mc_sid_50200000=1450827902的这个命令在centos上很适合我。即使启用了超线程,它也会显示实际的cpu。
Cat /proc/cpuinfo | egrep "core id|physical id" | tr -d "\n" | sed s/physical/\\nphysical/g | grep -v ^$ | sort | uniq | wc -l
在之前的众多答案中又多了一个。当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
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
参见https://unix.stackexchange.com/questions/468766/understanding-output-of-lscpu。
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