天天看點

cpu三大架構 numa smp mpp

系統的性能很大程度上依賴于cpu 硬體架構的支援。這裡記錄一下cpu 常見的三大架構的差別

smp

SMP (Symmetric Multiprocessing) , 對稱多處理器. 顧名思義, 在SMP中所有的處理器都是對等的, 它們通過總線連接配接共享同一塊實體記憶體,這也就導緻了系統中所有資源(CPU、記憶體、I/O等)都是共享的,當我們打開伺服器的背闆蓋,如果發現有多個cpu的槽位,但是卻連接配接到同一個記憶體插槽的位置,那一般就是smp架構的伺服器,日常中常見的pc啊,筆記本啊,手機還有一些老的伺服器都是這個架構,其架構簡單,但是拓展性能非常差,從linux 上也能看到:

ls /sys/devices/system/node/# 如果隻看到一個node0 那就是smp架構      

可以看到隻有僅僅一個node,經過大神們的測試發現,2至4個CPU比較适合smp架構。

NUMA

NUMA ( Non-Uniform Memory Access),非均勻通路存儲模型,這種模型的是為了解決smp擴容性很差而提出的技術方案,如果說smp 相當于多個cpu 連接配接一個記憶體池導緻請求經常發生沖突的話,numa 就是将cpu的資源分開,以node 為機關進行切割,每個node 裡有着獨有的core ,memory 等資源,這也就導緻了cpu在性能使用上的提升,但是同樣存在問題就是2個node 之間的資源互動非常慢,當cpu增多的情況下,性能提升的幅度并不是很高。是以可以看到很多明明有很多core的伺服器卻隻有2個node區。

MPP

MPP (Massive Parallel Processing) ,這個其實可以了解為刀片伺服器,每個刀扇裡的都是一台獨立的smp架構伺服器,且每個刀扇之間均有高性能的網絡裝置進行互動,保證了smp伺服器之間的資料傳輸性能。相比numa 來說更适合大規模的計算,唯一不足的是,當其中的smp 節點增多的情況下,與之對應的計算管理系統也需要相對應的提高。

關于幾個基本概念

下面這個指令可以很簡單的看出cpu的架構以及配置

#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 有幾個線程
Core(s) per socket:    4 #每個槽位有4個core 
Socket(s):             2 #伺服器面闆上有2個cpu 槽位
NUMA node(s):          2 #nodes的數量
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 44
Stepping:              2
CPU MHz:               2128.025
BogoMIPS:              4256.03
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              8192K
NUMA node0 CPU(s):     0,2,4,6 #對應的core
NUMA node1 CPU(s):     1,3,5,7      

由于numa 架構經常會有記憶體配置設定不均勻的情況,常常需要手動幹預,除了代碼以外,還有linux指令進行cpu的綁定:

taskset  -cp 1,2  25718 #将程序ID 25718 綁定到cpu的第1和第2個core 裡      

收藏了幾篇非常好的文章,都是大神呀

​​​http://cenalulu.github.io/linux/numa/​​​ #關于numa 記憶體配置設定不平均導緻mysql 阻塞

​​​http://blog.c1gstudio.com/archives/1260​​ #修改numa以及IO排程對mysql的提升

這裡,簡單看下numa:

NUMA簡介

這部分将簡要介紹下NUMA架構的成因和具體原理,已經了解的讀者可以直接跳到第二節。

為什麼要有NUMA

在NUMA架構出現前,CPU歡快的朝着頻率越來越高的方向發展。受到實體極限的挑戰,又轉為核數越來越多的方向發展。如果每個core的工作性質都是share-nothing(類似于map-reduce的node節點的作業屬性),那麼也許就不會有NUMA。由于所有CPU Core都是通過共享一個北橋來讀取記憶體,随着核數如何的發展,北橋在響應時間上的性能瓶頸越來越明顯。于是,聰明的硬體設計師們,先到了把記憶體控制器(原本北橋中讀取記憶體的部分)也做個拆分,平分到了每個die上。于是NUMA就出現了!

NUMA是什麼

NUMA中,雖然記憶體直接attach在CPU上,但是由于記憶體被平均配置設定在了各個die上。隻有當CPU通路自身直接attach記憶體對應的實體位址時,才會有較短的響應時間(後稱​

​Local Access​

​​)。而如果需要通路其他CPU attach的記憶體的資料時,就需要通過inter-connect通道通路,響應時間就相比之前變慢了(後稱​

​Remote Access​

​)。是以NUMA(Non-Uniform Memory Access)就此得名。

我們需要為NUMA做什麼

假設你是Linux教父Linus,對于NUMA架構你會做哪些優化?下面這點是顯而易見的:

既然CPU隻有在Local-Access時響應時間才能有保障,那麼我們就盡量把該CPU所要的資料集中在他local的記憶體中就OK啦~

繼續閱讀