提到CPU核數,相信絕大部分的同學想到的都是top命令,直接到自己的服務器上看一下是多少個核。看到的核越多,貌似笑的越開心。比如說說我的CPU,用top命令展開以后,看到了有24核。那么事實真是你想象的這么美好嗎?
# top
top - 17:04:51 up 882 days, 1:16, 1 user, load average: 0.05, 0.05, 0.00
Tasks: 596 total, 1 running, 595 sleeping, 0 stopped, 0 zombie
Cpu0 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu1 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu2 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu3 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu4 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
......
Cpu23 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
那么是否就說明我的機器安裝的CPU真的有24核?其實不是的,我們通過top命令看到的CPU核也叫做邏輯核。 說到這里我們先來普及一下基本概念:
-
物理CPU:主板上真正安裝的CPU的個數,通過physical id可以查查看 -
物理核:一個CPU會集成多個物理核心,通過core id可以查看到物理核的序號 -
邏輯核: intel運用了超線程技術,一個物理核可以被虛擬出來多個邏輯核,processor是邏輯核序號
好了,我們了解完cpu的基本概念后,來找一臺機器真正看一下。在linux系統下,通過 cat /proc/cpuinfo可以看到CPU更為詳細的信息,在操作系統的視角看來是有24個邏輯核,但是在物理上很有可能多個邏輯核對應的是同一個物理核。如下所示例子:
實際查看你的CPU
-
查看物理CPU
#cat /proc/cpuinfo | grep "physical id" | sort | uniq
physical id : 0
physical id : 1
可以看出,該實機有兩個物理CPU。
-
查看物理核
#cat /proc/cpuinfo| grep "cpu cores"| uniq
cpu cores : 6
cpu cores表示每個cpu有6個物理核心,因為有2個物理CPU,所以該機器總共只有12個物理核。而不是top命令里看到的24個,整整少了一半。 Intel是通過超線程技術把一個物理核虛擬出來了多個,故而操作系統層面看到的比實際的物理核要多。我們尋找一下證據
-
查看邏輯CPU
#cat /proc/cpuinfo | grep -E "core id|process|physical id"
processor : 0
physical id : 0
core id : 0
......
processor : 12
physical id : 0
core id : 0
......
processor : 23
physical id : 1
core id : 10
processor就是邏輯核的序號,可以看出該機器總共有24個邏輯核。大家注意看processor 0和processor 12的physical id、core id都是一樣的,也就說他們他們也處在同一個物理核上。但是他們的processor編號卻不一樣,一個是0,一個是12。這就是說,這兩個核實際上是一個核,只是通過虛擬技術虛擬出來的而已。
超線程作用
超線程里的2個邏輯核實際上是在一個物理核上運行的,模擬雙核心運作,共享該物理核的L1和L2緩存。物理計算能力并沒有增加,超線程技術只有在多任務的時候才能提升機器核整體的吞吐量。而且據Intel官方介紹,相比實核,平均性能提升只有20-30%左右。也就是說,在我剛才的機器上看到的24核的處理能力,整體上只比不開超線程的12核性能高30%。讓我們再用開發者使用的進程來看,由于你的進程被其它進程分享了L1、L2,這就導致cache miss變多,性能會比不開超線程要差。
所以說,操作系統看到的24核只是一個“假象”。