突破硬件瓶頸(一):Intel體系架構的發展與瓶頸挖掘

軟件定義存儲SDS正在從容量型向性能型演進,千萬級IOPS和微秒級低延遲,非常具有挑戰性。3節點標準x86服務器,能否有可能實現1000萬IOPS與200us低延遲?這個可以有。硬件性能並不是瓶頸所在,軟件顛覆纔是關鍵。

 

想要取得如此強的性能,必須要有突破時下存儲軟件對於硬件利用的瓶頸。

而要突破這些瓶頸,就需要對硬件有深入的瞭解,而後利用軟件想方設法突破,或者繞過他們,實現性能的騰飛。

本文是突破硬件瓶頸系列文章的第一篇,分析Intel體系架構帶來的瓶頸。

存儲的性能越高,則對延遲越敏感,當IOPS提高到百萬的時候,納秒(ns)級別的延遲也必須考慮進去。

想達到這種性能,必須着力降低軟硬件體系內的一切延遲,這些延遲往往來自於硬件體系本身,因此,分析硬件體系架構是有必要的。

目前市面上的服務器存世量較高,橫貫多種架構,單一分析某一種架構並沒有很高的實際價值,採用從前到後、從低端到高端的分析方式,不僅能遍歷每代架構的優缺點,也能從Intel的進步過程中,明確瓶頸的所在。

 

Intel體系架構一瞥

在普遍採用的intel體系架構中,CPU早已不僅是服務器的運算核心,他也是控制內存、外部存儲的核心。

集成內存控制器(integratedmemory controller,IMC)早已位於CPU中,它負責調度內存進行讀寫操作。

PCI-E控制器也位於CPU中,它負責控制高速設備(如顯卡、網卡、NVMe等)。

即便是芯片組也是通過DMI總線,間接由CPU控制。

以某塊C612雙路主板爲例,可以看出CPU的核心地位:

因此,想要找到延遲的根源,必須深挖CPU內部的構造。

 

 

01 低端服務器架構設計


曾幾何時,CPU的內部架構非常簡單,如這顆四核心CPU爲例:

最左側的藍色部分是集成顯卡(iGPU),佔據了大量面積(服務器CPU屏蔽這部分)。

四個紅色的計算核心(core)旁邊則是綠色的L3 Cache緩存。

最右方則是前端部分(agent),包含PCI-E、DP等外部控制器。

上方的黃色部分連接了內存。

幾乎所有的部分,都由一條高速通道——Ring總線連接。

Intel絕大多數2-4核心CPU設計都是如此,甚至少數6核心CPU也是這種設計,目前有大量仍在服役的服務器CPU也採用了近似設計。

然而這種設計註定不適合更多核心的CPU,當核心變多,Ring總線勢必拉長,而經過的Core越多,則可能造成更多的中斷。

四核心的內存理想延遲僅爲50ns,而到八核心,延遲就增加到了70ns左右,而且一旦出現IO中斷,延遲可能會翻倍激增。

 

02 中端服務器架構設計

深耕行業多年的Intel深知這種延遲的積累,終究會影響性能,所以Intel後續的CPU使用了環形總線。

單路變環路,吞吐量不僅增加了,還減少了中斷造成的延遲。

 

核心更多,需要緩存的數據也更多,命中率不可避免的降低。

intel將Cache包含關係改變,並且改變緩存配比,使對外速度翻倍(可以理解爲L3做了“鏡像”),同時引入了CMS,用以進一步降低延遲,L3 Cache成爲了環形Ring總線上的“服務區”,不再僅對自己的核心服務,大大提高了緩存利用率。

 

 

緩存利用率和速度的提高,是總線中斷次數和時間減少,再加上總線通道數增加,都大大緩解了多核心下的延遲。

Intel的6-8核心CPU多數採用此種設計方法,現服役的大量中端服務器,均採用這種設計的CPU。

 

03 高端服務器架構設計

但是核心的進一步增加,造成了新的瓶頸:更多的核心,需要搭配更多的iMC,如果我們八核心需要雙通道內存,那麼十六核心就需要四通道內存。

如果iMC都在一側,則遠端的核心內存延遲勢必增大,更嚴重的是Ring的數據分佈也會不平均,近IMC一側延遲增多,造成“前方喫緊,後方緊喫”的結果。

CPU在BroadWell EX中架構採取了笨辦法,如果一個環不夠“串”起來那麼多的核心,那就兩個環吧,每個環連接一個IMC。

這種做法解決了一個問題,卻又創造了另外一個問題,一個IMC體系之中的延遲降低了,但是兩個IMC之間的連接效率低下,簡直是將兩塊CPU塗了“膠水”黏在一起。

 

 

因此,Intel不得不再次改變設計,採取了圖右側中的方法。

如果畫個草圖,就是原來是“串”起來,現在則是“格”起來。

原來每兩個實體之間只有一條路,且單向,現在則是有三條路。

從前intel是左邊的設計,這裏每一個方塊都可能代表了IMC(內存控制器)、CORE等結構。

而右邊的是Intel的新設計,不僅總線數量增加了,也把system agent裏的內存控制器拎了出來,裝上CMS模塊,用於減少延遲。

新的總線被Intel成爲網狀(Mesh)總線,如下圖:

藍色雙向箭頭代表通過針腳與外部聯通的部分,橙色是Mesh總線。

以SKylake-SP HCC SoC die(完整18核)爲例,下圖爲該CPU (Xeon E7 8895-V3以及E5-4669 V3等)DIE的電鏡圖:

 

可以看到,除了四周的外部接口和觸電部分,中央的核心部分被Mesh整齊的分開。

Mesh包含縱向和橫向,如果拆開來看,他們的作用並不相同,這裏不再過多贅述。

 

 

需要指出的是,Mesh架構雖然在高核心數(12核)以上,擁有比Ring低的延遲。

但是即便使用了Mesh,也不可能讓16核心的CPU延遲和4核心一樣低。

Mesh的意義在於,18核心的理想內存延遲爲70ns左右,雖然高於四核心單Ring的50ns,但是平均每核心的延遲遠低於單Ring。

由於走線壓力,Agent仍然處於一端,PCI-E、UPI的延遲在一定程度上被捨棄了。

另一邊,這種設計下,CPU的成本迅速增長,因爲半導體工藝良品率的關係,四倍的核心數(面積),往往能造成十倍以上的成本。

正因爲單CPU堆核心對於成本的提高太快,我們不得不使用多路CPU系統。

截至目前,新品Intel服務器CPU仍採用這種Mesh設計。

這種設計下,大量的CPU尋址少數的IMC,且延遲不一,每個CPU均有權尋址任何IMC下的任何內存。

 

04 服務器架構共性問題

由於Intel本身內存調度不夠智能,容易造成調度混亂,滿載時延遲會爆發性增高。

超線程技術加劇了這一現象,雙倍的邏輯處理器造成更高的延遲。

實際上,超線程技術更多的適合虛擬化,以及低功耗、低負載場景,在滿載情況下,Intel的超線程技術已經被證明無法增加額外的算力。

現代服務器多爲雙路,甚至四路、八路。

多路CPU要協同工作,通過UPI(或QPI)連接,跨過“遙遠”的主機板電路,出現延遲。

在常見的邏輯中, CPU中所有核心數都邏輯平等。

 

 

正因如此,軟件通常會隨機調度CPU,例如在CPU1中拿出一個核心,又從CPU2中拿出一個核心。

在單顆CPU中,這樣延遲並不會太多。

 

 

但是在多顆CPU情況下,延遲就可能劇增,一顆CPU可能會需要頻繁的繞過主機板,並且再向另一顆CPU發送請求,才能調用並不屬於它的IMC,進而調用隸屬這顆IMC的內存。

這好比僅想買一包泡麪,明明門口有小賣鋪,卻跑到了另一條街,再找人幫忙代購一包方便麪。

這種巨大的延遲是高性能存儲服務器所不能容忍的,因此NUMA(Non-Uniform Memory Access)功能應運而生,它標識了內存的跨NUMA節點訪問請求,爲軟件干預調度提供了可能。

至此,我們用實際測試對內存調用產生的延遲做一個總結,下面三行分別是以Xeon E5單路、雙路、以及E7 v四路下,CPU運行時鐘爲3Ghz(時鐘頻率會影響內存延遲),延遲如下表:

 

 

 由表中可見,本地內存訪問延遲爲67ns,而遠端訪問的雙路、四路分別爲125ns、140ns。

同樣,內存性能的增加也遠不是線性的,tot cycles代表每次循環處理事務,可以看到,四路系統的處理速度不到單路的兩倍。

 

05 Intel體系架構瓶頸總結

由以上分析可以得出Intel體系架構目前面臨的四大問題:

1、過多核心、線程導致內存的調用效率低下,延遲提升

2、多路CPU導致內存的延遲進一步增高

3、核心的緩存利用率不夠高,命中率低

4、如果出現上下文切換,過多的CPU核心會導致更嚴重的延遲

 

如果能解決這些問題,就能從CPU和內存調度的角度,提升存儲的性能,打破固有的“瓶頸”。

(TaoCloud團隊原創)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章