一、关于 CPU 的几个概念
CPU 的作用
计算机中的中央处理单元(CPU)执行基本的计算工作 -- 运行程序。但是,一个单核的 CPU 同一时间只能一次执行一个任务,为了提高计算机的处理能力,也就出现了多 CPU,超线程(HT)和多核 CPU 的技术。
大多数计算机只有一个物理 CPU。单个 CPU 可能具有多个内核或超线程技术,但是仍然只有一个物理 CPU 插入主板上的单个 CPU 插槽。在超线程和多核 CPU 出现之前,人们试图通过添加额外的 CPU, 为计算机增加额外的处理能力。这需要一个带有多个 CPU 插槽的主板 -- 将多个 CPU 插入不同的插槽。主板还需要额外的硬件将这些 CPU 插槽连接到 RAM 和其他资源。这里有很多开销 -- 如果 CPU 需要相互通信,则会有额外的延迟,具有多个 CPU 的系统将消耗更多的电力,并且主板需要更多的插座和硬件以及电路。
在个人 pc 上,有多颗 cpu 的不多,不过在如今的服务器上,物理 cpu 一般都是 2 颗标配。因为服务器需要更多的处理能力
超线程(Hyper-Threading,简称 "HT")" 技术。超线程技术就是利用特殊的硬件指令,把两个逻辑内核模拟成两个物理芯片,让单个处理器都能使用线程级并行计算,进而兼容多线程操作系统和软件,减少了 CPU 的闲置时间,提高的 CPU 的运行效率。
CPU 之超线程(HT)
超线程技术是在一颗 CPU 同时执行多个程序而共同分享一颗 CPU 内的资源,理论上要像两颗 CPU 一样在同一时间执行两个线程,虽然采用超线程技术能同时执行两个线程,但它并不象两个真正的 CPU 那样,每个 CPU 都具有独立的资源。CPU 仍然是单个 CPU,而操作系统则看到了 2 个 CPU,当两个线程都同时需要某一个资源时,其中一个要暂时停止,并让出资源,直到这些资源闲置后才能继续。因此超线程的性能并不等于两颗 CPU 的性能。
多核 CPU
最初,CPU 只有有一个核心。这意味着物理 CPU 有一个单一的中央处理单元。为了提高性能,制造商添加额外的 "核心" 或中央处理单元。双核 CPU 有两个中央处理单元,所以操作系统看起来是两个 CPU。不同的进程可以同时使用每个核心。这样可以加快系统处理速度,因为这时的计算机可以同时执行多项任务。
与超线程不同,双核 CPU 在 CPU 芯片上实际上有两个中央处理单元,四核 CPU 有四个中央处理单元,八核 CPU 有八个中央处理单元,等等。这有助于显著提高处理的性能,同时保持物理 CPU 单元的小型化,使其更适合单个插槽。只需要单个 CPU 插槽即可插入一个 CPU 单元 --- 而不是四个不同的 CPU 插槽,四个不同的 CPU,每个都需要自己的电源,冷却和其他硬件的连接消耗。因为它们都在同一个芯片上,所有具有更少的延迟,核心可以更快的通信。
二、如何正确查看主机上的 cpu 相关数量呢?
总核心数 = 物理 CPU 颗数 * 每颗 CPU 上核心数
总线程数(逻辑 CPU 数) = 物理 CPU 颗数 * 每颗 CPU 上核心数 * 每颗核心数上的线程 或者 总线程数(逻辑 CPU 数) = 总核心数 * 每颗核心数上的线程
注意:此处的 '线程' 和 '操作系统内的线程' 不是一回事,从 cpu 的角度来看,一个线程("thread of execution" 的简写)只是一个有序的指令序列,告诉计算机该做什么。
第一种方式:
查看主机上物理 cpu 的颗数
- [ ~]# cat /proc/cpuinfo |grep "physical id" | sort -u |wc -l
- 2
查看主机上每颗 cpu 上的核心数
- [ ~]# cat /proc/cpuinfo |grep "cpu cores"|sort -u
- cpu cores : 4
查看主机上总逻辑 CPU 数量(方式 1)
- [ ~]# cat /proc/cpuinfo |grep "core id"|wc -l
- 8
快速查看主机上总逻辑 CPU 数量(方式 2)
- [ ~]# nproc --all
- 8
快速查看主机上总逻辑 CPU 数量(方式 3)
- [ ~]# getconf _NPROCESSORS_ONLN
- 8
快速查看主机上总逻辑 CPU 数量(方式 4)
- [ ~]# cat /sys/devices/system/cpu/online
- 0-7
第二种方式:
使用 lscpu 命令
- [ ~]# lscpu
- ...省略输出
- CPU(s): 8
- On-line CPU(s) list: 0-7
- Thread(s) per core: 1
- Core(s) per socket: 4
- Socket(s): 2
- ...省略输出
- Model name: Intel(R) Xeon(R) CPU E5620 @ 2.40GHz
从上面可以看出以下信息:
所以该机器上最大的线程数(逻辑 CPU 数)就是: 2 CPU * 4 Cores * 1 threads = 8 threads
上面是没有开启超线程技术,如果开启超线程(HT)后,则应该是 2 CPU * 4 Cores * 2 threads = 16 threads
下图是上述处理器的详细信息,如果你也对你的服务器核数不确定时,可以先去官网进行查询:
另外补充下,如何在系统内判断主机是否开启了超线程(HT)技术呢?请继续往下看
第一种方式:
lscpu 命令
- [ ~]# lscpu
- ...省略输出
- CPU(s): 8
- On-line CPU(s) list: 0-7
- Thread(s) per core: 1
- Core(s) per socket: 4
- Socket(s): 2
- ...省略输出
Thread(s) per core 为 1 则表示禁用了超线程或者该 CPU 不支持超线程,如果为 2 则表示启用了 HT
第二种方式
- [ ~]# grep -E "cpu cores|siblings|physical id" /proc/cpuinfo |xargs -n 11 |sort -u
- physical id : 0 siblings : 8 cpu cores : 4
- physical id : 1 siblings : 8 cpu cores : 4
从这里看下, siblings 是 cpu cores 的 2 倍,这说明启用了超线程。如果没启用 HT,则是相同的数字。
本文只是浅谈了 cpu 如何查看核心数、线程数等方法,更深的还有线程 SMP 、NUMA 架构。如果文中有错别观点之处,还请大家及时指出,我会及时改正哈。希望有更深的探讨。文章有些参考内容均在文末有链接。
来源: http://www.bubuko.com/infodetail-1992737.html