CPU使用率到了100%,先別慌!


最近,一位同事急匆匆跑過來跟我說:糟糕了,服務器CPU的使用率達100%了。

我心想不可能啊,CPU有那么多核,怎會跑滿?於是看了一眼,結果虛驚一場。

這位同事看到的100%,並非指整個CPU使用率到了100%,而是指CPU某些核的使用率到了100%.

趁此機會,我來聊聊與CPU相關的概念,對很多軟件開發和運維人員來說,這些概念是必須要掌握的:

  • CPU主頻

  • 多個CPU

  • 多核CPU

  • 邏輯核(超線程)

  • 大小端

 

以一款CPU為例,看下具體參數:

      

CPU主頻(時鍾頻率) 

在上面這些參數中,人們最熟知的是CPU主頻(時鍾頻率)。買電腦時,肯定需要看CPU主頻是多少。

我們知道:CPU時鍾越快,產生上升沿/下降沿的速度就越快,就能更快地迫使其它器件做相應工作。

CPU的時鍾,就像龍舟比賽的擊鼓人,擊鼓頻率越快,就迫使划船的人跟上節奏,結果龍舟也越快。

從CPU參數可以看到,該CPU有12個物理核,每個物理核對應2個邏輯核(超線程技術)。所以,從外部看,該CPU有24個核(邏輯核)。

也就是說,該CPU有12個物理上的運算器&控制器,有24個邏輯上的運算器&控制器。

 

多個CPU

我們看linux命令lscpu給出的信息:

 

Socket(s): 2

 

可以看到,在這台服務器上,總共插了2個CPU,  這2個CPU是物理上的CPU, 人眼可以看到,手也可以觸摸到:

 

多核CPU

 

我們看linux命令lscpu給出的信息:

Core(s) per socket: 12

可以看到,針對每一個物理CPU而言,內部有12個物理核。也就是說,在一個物理CPU內,有12個物理層面的運算器&控制器,它們是實實在在存在的。很霸氣的感覺,12個物理核如下圖所示:

 

邏輯核(超線程)

 

我們看linux命令lscpu給出的信息:

Thread(s) per core: 2

由於Intel采用了超線程技術,所以每個物理核對應2個邏輯核:
要注意,在物理上看來,只有一個核,但采用了超線程技術,在使用時,實際效果是2個核在同時並行(不是同步並發)工作,也即有2個邏輯核,如下圖所示:

那么,在上面這台服務器中,有多少個邏輯核呢?
服務器中插有2個物理CPU, 每個物理CPU有12個物理核,每個物理核有2個邏輯核,故總共48個邏輯核。因此,當操作系統俯視CPU硬件時,它看到的是,在計算機中,有48個核,即有48個運算器&控制器。
對於操作系統而言,它可以認為有48個CPU核在同時並行(不是同步並發)為它提供服務,lscpu查出的信息如下:

CPU(s): 48

這里的48個CPU(s), 其實就是48個邏輯核。有時,我們也可以說,這台服務器有48個核。
這台服務器有2個CPU, 針對其中一個CPU,我們也可以說,它是"12核24線程"。

 

操作系統對核的分配 

 

需要注意的是,如上的服務器有2個CPU,  每個CPU有12物理核,每個物理核有2個邏輯核,這僅僅是針對特定服務器和CPU的。其他計算機或者CPU, 就不一定如此了。來看我的另外一台服務器,配置略微寒酸:總共只有1個CPU, 1個物理核,1個邏輯核:

ubuntu@VM--15-ubuntu:~$ lscpuArchitecture: x86_64CPU op-mode(s): 32-bit, 64-bitByte Order: Little EndianCPU(s): 1On-line CPU(s) list: Thread(s) per core: 1Core(s) per socket: 1Socket(s): 1NUMA node(s): 1Vendor ID: GenuineIntelCPU family: 6Model: 79Model name: Intel(R) Xeon(R) CPU E5-26xx v4Stepping: 1CPU MHz: 2394.446BogoMIPS: 4788.89Hypervisor vendor: KVMVirtualization type: fullL1d cache: 32KL1i cache: 32KL2 cache: 4096KNUMA node0 CPU(s): Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx lm constant_tsc rep_good nopl eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch bmi1 avx2 bmi2 rdseed adx xsaveoptubuntu@VM--15-ubuntu:~$


如果在這個單核服務器上,運行如下的死循環程序,會如何呢?

#include <stdio.h>int main(){ while(1); // 死循環 return 0;}

觀察top命令給出的結果,可以看到,1個進程就消耗了大約99.0%的CPU,整個CPU的使用率達到99.7%:        那么,如果開啟2個進程並發執行呢?可以看到,每個進程幾乎都是占用49.x%的CPU,整個CPU的使用率達到99.7%:
那么,如果開啟3個進程並發執行呢?可以看到,每個進程幾乎都是占用32.x%的CPU,整個CPU的使用率達到98.7%:
可以看到,整個CPU幾乎被瓜分殆盡。這種調度和分配,是由操作系統完成的。

再來看多核CPU的情況,我找了另一台服務器,有32個邏輯核,簡稱32個核。運行一下死循環進程,用top命令來分析。可以看到,1個進程占滿1個核,使用率100%, 而服務器32個核的使用率是3.6%:
運行2個進程,可以看到,2個進程都占用99.7%的核,而服務器32個核的使用率是6.5%:

運行3個進程,可以看到,3個進程都占用100%的核,而服務器32個核的使用率是9.8%:
看到使用率為100%時,不要緊張,不要以為CPU就用完了,QQ號交易平台地圖這台服務器有32個核呢(擁有3200%的能力)。來看下3個進程時,每個核的具體使用情況(3個進程,總共大概占用300%的核):
這些值會動態地變化,而且不一定是消耗在某些固定的核上。核的調度和資源分配,由操作系統來完成:

 

CPU大小端

 

最后,來看一個大小端的問題,看lscpu命令的信息:

Byte Order: Little Endian

它的含義是: CPU是小端模式。相信幾乎所有的程序員都聽說過這個概念,我們具體來測試一下。
下面是在Intel CPU + Windows + VC++6.0上的測試結果,可以看到:低位的0x78存儲在地址較小的位置(端模式):
下面是對8051單片機進行的仿真測試,可以看到:高位的0x12存儲在地址較小的位置(大端模式):至此為止,我們對CPU的基本參數有了大致了解,這也是linux相關的開發、運維人員必須掌握的。以后也可以談笑風生地聊多個CPU、多核CPU、邏輯核和大小端了,而不是一如既往地一知半解。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM