存儲系統(tǒng)性能 - 帶寬計算
遇到過很多同行、客戶問我:“xxx存儲系統(tǒng)究竟***支持多少【IOPS】?”,這真不好說,因為手里確實沒有測試數(shù)據(jù)。更何況,IOPS與i/o size、random/sequential、read/write ratio、App threading-model、response time baseline等諸多因素相關(guān),這些因素組合起來便可以描述一種類型的I/O,我們稱之為【I/O profile】。不同的因素組合得到的IOPS都不一樣,通常我們看到的【標(biāo)稱IOPS】都是在某一個固定組合下測得的,拿到你自己的生產(chǎn)環(huán)境中,未必能達(dá)到標(biāo)稱值。這也是為什么要做前期的performance analysis/sizing的緣故。
直到有人這樣問我:“xxx存儲系統(tǒng)究竟***支持多少【帶寬】?"我愣了下,仔細(xì)想想,硬件性能極限就擺在那,基于bandwidth = Frequency * bit-width,而且很多需要的數(shù)據(jù)都是公開的,東拼西湊應(yīng)該可以算出個大概。
我并不是Performance專家,從未做過Performance Consulting/Sizing方面的工作,最多也只是做過性能方面的分析/排錯,所以這篇文章的準(zhǔn)確性多半存在不靠譜的地方,讀者斟酌著看吧。
在讀文章之前,建議先看一下如下計算公式和名詞。
計算公式:
- Real-world result = nominal * 70% -> 我所標(biāo)稱的數(shù)據(jù)都是*70%以盡可能接近實際數(shù)據(jù),但如果另外提供了由資料獲得的更為準(zhǔn)確的數(shù)據(jù),則以其為準(zhǔn)。
- Bandwidth = frequency * bit-width
QPI帶寬:假設(shè)QPI頻率==2.8 Ghz
× 2 bits/Hz (double data rate)
× 20 (QPI link width)
× (64/80) (data bits/flit bits)
× 2 (unidirectional send and receive operating simultaneously)
÷ 8 (bits/byte)
= 22.4 GB/s
術(shù)語:
- Westmere -> Intel CPU微架構(gòu)的名稱
- GB/s -> 每秒傳輸?shù)腷yte數(shù)量
- Gb/s -> 每秒傳輸?shù)腷it數(shù)量
- GHz -> 依據(jù)具體操作而言,可以是單位時間內(nèi)運(yùn)算的次數(shù)、單位時間內(nèi)傳輸?shù)拇螖?shù) (也可以是GT/s)
- 1byte = 8bits
- IOH -> I/O Hub,處于傳統(tǒng)北橋的位置,是一顆橋接芯片。
- QPI -> QuickPathInterconnect,Intel前端總線(FSB)的替代者,可以認(rèn)為是AMD Hypertransport的競爭對手
- MCH -> Memory Controller Hub,內(nèi)置于CPU中的內(nèi)存控制器,與CPU直接通信,無需走系統(tǒng)總線
- PCI Express(Peripheral Component InteconnectExpress, PCIe) - 一種計算機(jī)擴(kuò)展總線(Expansion bus),實現(xiàn)外圍設(shè)備與計算機(jī)系統(tǒng)內(nèi)部硬件(包括CPU和RAM)之間的數(shù)據(jù)傳輸。
- Overprovisioning - 比如 48*1Gbps access port交換機(jī),通常只有4*1Gbps uplink,那么overprovisioning比 = 12:1
- PCI-E 2.0每條lane的理論帶寬是500MB/s
- X58 – 相當(dāng)于傳統(tǒng)的北橋,只不過不再帶有內(nèi)存控制器,Code name = Tylersburg
- Lane - 一條lane由一對發(fā)送/接收差分線(differential line)組成,共4根線,全雙工雙向字節(jié)傳輸。一個PCIe slot可以有1-32條lane,以x前綴標(biāo)識,通常***是x16。
- Interconnect - PCIe設(shè)備通過一條邏輯連接(interconnect)進(jìn)行通信,該連接也稱為Link。兩個PCIe設(shè)備之間的link是一條點到點的通道,用于收發(fā)PCI請求。從物理層面看,一個link由一條或多條Lane組成。低速設(shè)備使用single-lane link,高速設(shè)備使用更寬的16-lane link。
相關(guān)術(shù)語:
- address/data/control line
- 資源共享 ->資源仲裁
- 時鐘方案(Clock Scheme)
- Serial Bus
PCI-E Capacity:
Per lane (each direction):
- v1.x: 250 MB/s (2.5 GT/s)
- v2.x: 500 MB/s (5 GT/s)
- v3.0: 1 GB/s (8 GT/s)
- v4.0: 2 GB/s (16 GT/s)
16 lane slot (each direction):
- v1.x: 4 GB/s (40 GT/s)
- v2.x: 8 GB/s (80 GT/s)
- v3.0: 16 GB/s (128 GT/s)
性能是【端到端】的,中間任何一個環(huán)節(jié)都有自己的性能極限,它并不像一根均勻水管,端到端性能一致。存儲系統(tǒng)顯然是不均衡的 ->overprovisioning。我將以中端存儲系統(tǒng)為例,高端存儲過于復(fù)雜,硬件結(jié)構(gòu)可能都是私有的,而中端系統(tǒng)相對簡單,就以一種雙控制器、SAS后端、x86架構(gòu)的存儲系統(tǒng)為例。為了方便名稱引用,我們就稱他為Mr.Block_SAN吧。
控制器上看得見摸得著,又可以讓我們算一算的東西也就是CPU、內(nèi)存、I/O模塊,不過我今天會帶上一些極為重要但卻容易忽略的組件。先上一張簡圖(字難看了點,見諒),這是極為簡化的計算機(jī)系統(tǒng)構(gòu)成,許多中端存儲控制器也就這么回事兒。
CPU - 假設(shè)控制器采用Intel Xeon-5600系列處理器(Westmere Microarchiecture ),例如Xeon 5660,支持DDR3-1333。CPU Bandwidth = 2.8GHz * 64bits / 8 =22.4 GB/s。
內(nèi)存 – Mr.Block_SAN系統(tǒng)通過DMA (Direct Memory Access) 直接在Front End,內(nèi)存以及Back end之間傳輸數(shù)據(jù)。因此需要知道內(nèi)存是否提供了足夠的帶寬。3* DDR3,1333MHz帶寬==29GB/s(通常內(nèi)存帶寬都是足夠的),那么bit width應(yīng)該是64bits。Westmere集成了內(nèi)存控制器,因此極大的降低了CPU與內(nèi)存通信的延遲。Mr.Block_SAN采用【X58 IOH】替代原始的北橋芯片,X58 chipset提供36 lane PCIe2.0 = 17.578GB/s bandwidth(后面會有更多解釋)。
I/O模塊 (SLIC)- SLIC是很多人關(guān)心的,因為它直接收/發(fā)送I/O。需要注意的是一個SLIC所能提供的帶寬并不等于其所有端口帶寬之和,還要看控制芯片和總線帶寬。以SAS SLIC為例,一個SAS SLIC可能由兩個SAS Controller組成,假設(shè)每個SAS Controller帶寬大約2200MB/s realworld,一個SAS port = 4 * 6Gbps /8 * 70% =2100MB/s;一個SAS Controller控制2*SAS port,可見單個SAS Controller無法處理兩個同時滿負(fù)荷運(yùn)轉(zhuǎn)的SAS port(2200MB/s < 4200MB/s),這里SAS Controller是個瓶頸-> Overprovisioning!整個SAS SLIC又是通過【x8 PCI-E 2.0】 外圍總線與【IOH】連接。x8 PCIe bandwidth = 8 * 500MB/s * 70% = 2800MB/s。如果兩個SAS Controller滿負(fù)荷運(yùn)作的話,即4400MB/s > 2800MB/s,此時x8 PCIe總線是個瓶頸 -> Overprovisioning!
其實還可以計算后端磁盤的帶寬和,假設(shè)一個Bus最多能連250塊盤,若是SAS 15K RPM則提供大約12MB/s的帶寬(非順序隨機(jī)64KB,讀寫未知),12 * 250 = 3000MB/s > 2100MB/s -> Overprovisioning!
Tip:一個SAS Controller控制兩個SAS Port,所以如果只需要用到兩根bus,可以錯開連接端口,從而使的得兩個SAS Controller都能得到利用。
同理,對任何類型的SLIC,只要能夠獲得其端口速率、控制器帶寬、PCIe帶寬,即可知道瓶頸的位置。我選擇算后端帶寬的原因在于,前端你可以把容量設(shè)計的很大,但問題是流量過來【后端】能否吃下來?Cache Full導(dǎo)致的Flush后端能否擋???對后端帶寬是個考驗,所以以SAS為例或許可以讓讀者聯(lián)想到更多。
PCI-Express – PCIe是著名的外圍設(shè)備總線,用于連接高帶寬設(shè)備與CPU通信,比如存儲系統(tǒng)的I/O模塊。X58提供了36 lane PCIe 2.0,因此36*500/1024 = 17.578125GB/s帶寬。
QPI & IOH – QPI通道帶寬可以通過計算公式獲得,我從手中資料直接獲得的結(jié)果是19-24GB/s(運(yùn)行在不同頻率下的值)。IOH芯片總線頻率是12.8GB/s (List of Intel chipsets這里獲得,但不確定總線頻率是否就是指IOH本身的運(yùn)行頻率)< 17.578GB/s(36 Lane) -> Overprovisioning!
OK,算完了,能回答Mr.Block_SAN***能提供多少帶寬了嗎?看下來CPU、RAM、QPI的帶寬都上20GB/s,留給前后端的PCIe總線總共也只有18GB/s不到,即便這樣也已經(jīng)overload了IOH(12GB/s)。所以看來整個系統(tǒng)的瓶頸在IOH,只有12GB/s。當(dāng)然,你還得算一下Mr.Block_SAN是否支持足夠多的外圍設(shè)備(eg. I/O模塊)來完全填充這12GB/s,如果本身就不支持那么多外圍設(shè)備,那IOH也算不上是瓶頸了。另外,我看到已經(jīng)有網(wǎng)友提出我的計算存在8b/10b編碼換算錯誤,由于個人對硬件系統(tǒng)編碼尚未透徹研究,理解這部分的讀者可以自己對相應(yīng)組件再乘以80%(我記得應(yīng)該是)去掉編碼轉(zhuǎn)換的開銷。
這篇文章更多的是一種舉例式的說明,其中的數(shù)字和組件存在假設(shè)的情況。大家在計算的時候,可以參考這個思路將自己系統(tǒng)的參數(shù)和組件套用上去,從而計算出自己系統(tǒng)的帶寬瓶頸。
注意下圖有點舊了,我把PCIe 36 Lane框成了MAX Bandwidth,因為那個時候以為IOH應(yīng)該有足夠的帶寬,但后來發(fā)現(xiàn)可能不是這樣,但圖已經(jīng)被我擦了,所以就不改了。