基本概念
- 物理CPU:物理CPU就是插在主机上的真实的CPU硬件,在Linux下可以数不同的physical id 来确认主机的物理CPU个数。
- 核心数:物理CPU下一层概念就是核心数,我们常常会听说多核处理器,其中的核指的就是核心数。在Linux下可以通过cores来确认主机的物理CPU的核心数。
- 逻辑CPU:核心数下一层的概念是逻辑CPU,逻辑CPU跟超线程技术有联系,假如物理CPU不支持超线程的,那么逻辑CPU的数量等于核心数的数量;
如果物理CPU支持超线程,那么逻辑CPU的数目是核心数数目的两倍。在Linux下可以通过 processors 的数目来确认逻辑CPU的数量。 - 超线程:超线程是英特尔开发出来的一项技术,使得单个处理器可以象两个逻辑处理器那样运行,这样单个处理器以并行执行线程。
这里的单个处理器也可以理解为CPU的一个核心;这样便可以理解为什么开启了超线程技术后,逻辑CPU的数目是核心数的两倍了。
在Linxu下查看物理cpu、核心数、逻辑CPU和是否支持超线程
关于CPU的一些信息可在 /proc/cpuinfo
这个文件中查看cat /proc/cpuinfo
内容是以 processor (也就是逻辑CPU)为基本单元进行划分的,processor
下的 core id
表示这个逻辑CPU属于哪个核心,而physical id则表示这个核心或者说逻辑CPU属于哪个物理CPU。
- 查看物理CPU数量
物理CPU就是不同的phycical id
的个数,可通过下面命令实现:
cat /proc/cpuinfo | grep 'physical id' | uniq |wc -l
或者grep 'physical id' /proc/cpuinfo |sort -u|wc -l
uniq是为了去掉多个逻辑CPU属于同一个物理CPU的重复记录。
- 查看核心数
核心数就是不同core id的个数,可通过下面的命令实现
cat /proc/cpuinfo | grep 'core id' | uniq |wc -l
- 查看逻辑CPU数目
逻辑CPU就是processor的数目
cat /proc/cpuinfo | grep 'processor' | wc -l
或者grep -c processor /proc/cpuinfo
查看逻辑CPU时不需要去重
- 查看是否支持超线程
如果支持超线程就是说同一个core下会有两个processors,这样可以简单地观察/proc/cpuinfo中的内容,
如果两个的processor下的core id相同,那么说明支持超线程。
还有另外一种方法是查看siblings和cpu cores的数值是否一致,评判方法如下
如果”siblings”和”cpu cores”一致,则说明不支持超线程,或者超线程未打开。
如果”siblings”是”cpu cores”的两倍,则说明支持超线程,并且超线程已打开。
另外,top命令中看到的CPU数目是逻辑CPU(输入top后再按1)。
逻辑CPU个数
grep -c processor /proc/cpuinfo
物理CPU个数
grep 'physical id' /proc/cpuinfo |sort -u|wc -l
“siblings”指的是一个物理CPU有几个逻辑CPU
grep 'siblings' /proc/cpuinfo
grep "siblings" /proc/cpuinfo|uniq
后面加个uniq计数的作用
”cpu cores“指的是一个物理CPU有几个核
grep 'cpu cores' /proc/cpuinfo
grep "cpu cores" /proc/cpuinfo|uniq
后面加个uniq计数的作用
例如,如果系统包含两个物理封装,每个封装中又包含两个支持超线程(HT)技术的处理器内核,则 /proc/cpuinfo 文件将包含此数据。(注:数据并不在表格中。)
processor 0 4 2 6 1 5 3 7
physical id 0 0 0 0 1 1 1 1
core id 0 0 1 1 2 2 3 3
siblings 4 4 4 4 4 4 4 4
cpu cores 2 2 2 2 2 2 2 2
此例说明:
1) 系统上有两个物理封装 physical id为0和1
2)一个物理封装有四个内核,即有4个逻辑处理器。
3)一个内核上有2个不同的processer,即系统支持超线程技术(HT)。
值得注意的是physical id和core id的编号可能是也可能不是连续的。系统上有两个物理封装并不罕见,而且physical id可能等于0和3。
检测CPU脚本
!/bin/bash
- physicalNumber=0
- coreNumber=0
- logicalNumber=0
- HTNumber=0
- logicalNumber=$(grep “processor” /proc/cpuinfo|sort -u|wc -l)
- physicalNumber=$(grep “physical id” /proc/cpuinfo|sort -u|wc -l)
- coreNumber=$(grep “cpu cores” /proc/cpuinfo|uniq|awk -F’:’’{print $2}’|xargs)
- HTNumber=$((logicalNumber / (physicalNumber * coreNumber)))
- echo”** CPU Information **“
- echo”Logical CPU Number : ${logicalNumber}”
- echo”Physical CPU Number : ${physicalNumber}”
- echo”CPU Core Number : ${coreNumber}”
- echo”HT Number : ${HTNumber}”