內(nèi)存性能的正確解讀
一臺服務(wù)器,不管是物理機(jī)還是虛擬機(jī),必不可少的就是內(nèi)存,內(nèi)存的性能又是如何來衡量呢。
1. 內(nèi)存與緩存
現(xiàn)在比較新的CPU一般都有三級緩存,L1 Cache(32KB-256KB),L2 Cache(128KB-2MB),L3 Cache(1M-32M)。緩存逐漸變大,CPU在取數(shù)據(jù)的時候,優(yōu)先從緩存去取數(shù)據(jù),取不到才去內(nèi)存取數(shù)據(jù)。
2. 內(nèi)存與時延
顯然,越靠近CPU,取數(shù)據(jù)的速度越塊,通過LMBench進(jìn)行了讀數(shù)延遲的測試。
從上圖可以看出:
Intel(R) Xeon(R) Platinum 8163 CPU @ 2.50GHz 這款CPU的L1D Cache,L1I Cache為32KB,而L2 Cache為1M,L3為32M;
在對應(yīng)的Cache中,時延是穩(wěn)定的;
不同緩存的時延呈現(xiàn)指數(shù)級增長;
所以我們在寫業(yè)務(wù)代碼的時候,如果想要更快地提高效率,那么使得計(jì)算更加貼近CPU則可以獲取更好的性能。但是從上圖也可以看出,內(nèi)存的時延都是納秒為單位,而實(shí)際業(yè)務(wù)中都是毫秒為單位,優(yōu)化的重點(diǎn)應(yīng)該是那些以毫秒為單位的運(yùn)算,而內(nèi)存時延優(yōu)化這塊則是長尾部分。
3. 內(nèi)存帶寬
內(nèi)存時延與緩存其實(shí)可謂是緊密相關(guān),不理解透徹了,則可能測的是緩存時延。同樣測試內(nèi)存帶寬,如果不是正確的測試,則測的是緩存帶寬了。
為了了解內(nèi)存帶寬,有必要去了解下內(nèi)存與CPU的架構(gòu),早期的CPU與內(nèi)存的架構(gòu)還需要經(jīng)過北橋總線,現(xiàn)在CPU與內(nèi)存直接已經(jīng)不需要北橋,直接通過CPU的內(nèi)存控制器(IMC)進(jìn)行內(nèi)存讀取操作:
那對應(yīng)的內(nèi)存帶寬是怎樣的呢?測試內(nèi)存帶寬有很多很多工具,linux下一般通過stream進(jìn)行測試。簡單介紹下stream的算法:
stream算法的原理從上圖可以看出非常簡單:某個內(nèi)存塊之間的數(shù)據(jù)讀取出來,經(jīng)過簡單的運(yùn)算放入另一個內(nèi)存塊。那所謂的內(nèi)存帶寬:內(nèi)存帶寬=搬運(yùn)的內(nèi)存大小/耗時。通過整機(jī)合理的測試,可以測出來內(nèi)存控制器的帶寬。下圖是某云產(chǎn)品的內(nèi)存帶寬數(shù)據(jù):
- Function Best Rate MB/s Avg time Min time Max time
 - Copy: 128728.5 0.134157 0.133458 0.136076
 - Scale: 128656.4 0.134349 0.133533 0.137638
 - Add: 144763.0 0.178851 0.178014 0.181158
 - Triad: 144779.8 0.178717 0.177993 0.180214
 
內(nèi)存帶寬的重要性自然不言而喻,這意味著操作內(nèi)存的***數(shù)據(jù)吞吐量。但是正確合理的測試非常重要,有幾個注意事項(xiàng)需要關(guān)注:
內(nèi)存數(shù)組大小的設(shè)置,必須要遠(yuǎn)大于L3 Cache的大小,否則就是測試緩存的吞吐性能;
CPU數(shù)目很有關(guān)系,一般來說,一兩個核的計(jì)算能力,是遠(yuǎn)遠(yuǎn)到不了內(nèi)存帶寬的,整機(jī)的CPU全部運(yùn)行起來,才可以有效地測試內(nèi)存帶寬。當(dāng)然跑單核的stream測試也有意義,可以測試內(nèi)存的延時。
4. 其他
內(nèi)存與NUMA的關(guān)系:開啟NUMA,可以有效地提供內(nèi)存的吞吐性能,降低內(nèi)存時延。
stream算法的編譯方法選擇:通過icc編譯,可以有效地提供內(nèi)存帶寬性能分。原因是Intel優(yōu)化了CPU的指令,通過指令向量化和指令Prefetch操作,加速了數(shù)據(jù)的讀寫操作以及指令操作。當(dāng)然其他C代碼都可以通過icc編譯的方法,提供指令的效率。



















 
 
 


 
 
 
 