內存性能的正確解讀

一臺服務器,無論是物理機仍是虛擬機,必不可少的就是內存,內存的性能又是如何來衡量呢。linux

1. 內存與緩存

如今比較新的CPU通常都有三級緩存,L1 Cache(32KB-256KB),L2 Cache(128KB-2MB),L3 Cache(1M-32M)。緩存逐漸變大,CPU在取數據的時候,優先從緩存去取數據,取不到纔去內存取數據。算法

2. 內存與時延

顯然,越靠近CPU,取數據的速度越塊,經過LMBench進行了讀數延遲的測試。數組

從上圖能夠看出:緩存

  1. Intel(R) Xeon(R) Platinum 8163 CPU @ 2.50GHz 這款CPU的L1D Cache,L1I Cache爲32KB,而L2 Cache爲1M,L3爲32M;
  2. 在對應的Cache中,時延是穩定的;
  3. 不一樣緩存的時延呈現指數級增加;

因此咱們在寫業務代碼的時候,若是想要更快地提升效率,那麼使得計算更加貼近CPU則能夠獲取更好的性能。可是從上圖也能夠看出,內存的時延都是納秒爲單位,而實際業務中都是毫秒爲單位,優化的重點應該是那些以毫秒爲單位的運算,而內存時延優化這塊則是長尾部分。服務器

3. 內存帶寬

內存時延與緩存其實可謂是緊密相關,不理解透徹了,則可能測的是緩存時延。一樣測試內存帶寬,若是不是正確的測試,則測的是緩存帶寬了。
爲了瞭解內存帶寬,有必要去了解下內存與CPU的架構,早期的CPU與內存的架構還須要通過北橋總線,如今CPU與內存直接已經不須要北橋,直接經過CPU的內存控制器(IMC)進行內存讀取操做:架構

那對應的內存帶寬是怎樣的呢?測試內存帶寬有不少不少工具,linux下通常經過stream進行測試。簡單介紹下stream的算法:工具

stream算法的原理從上圖能夠看出很是簡單:某個內存塊之間的數據讀取出來,通過簡單的運算放入另外一個內存塊。那所謂的內存帶寬:內存帶寬=搬運的內存大小/耗時。經過整機合理的測試,能夠測出來內存控制器的帶寬。下圖是某雲產品的內存帶寬數據:性能

-------------------------------------------------------------
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
-------------------------------------------------------------

內存帶寬的重要性天然不言而喻,這意味着操做內存的最大數據吞吐量。可是正確合理的測試很是重要,有幾個注意事項須要關注:測試

  1. 內存數組大小的設置,必需要遠大於L3 Cache的大小,不然就是測試緩存的吞吐性能;
  2. CPU數目頗有關係,通常來講,一兩個核的計算能力,是遠遠到不了內存帶寬的,整機的CPU所有運行起來,才能夠有效地測試內存帶寬。固然跑單核的stream測試也有意義,能夠測試內存的延時。

4. 其餘

  1. 內存與NUMA的關係:開啓NUMA,能夠有效地提供內存的吞吐性能,下降內存時延。
  2. stream算法的編譯方法選擇:經過icc編譯,能夠有效地提供內存帶寬性能分。緣由是Intel優化了CPU的指令,經過指令向量化和指令Prefetch操做,加速了數據的讀寫操做以及指令操做。固然其餘C代碼均可以經過icc編譯的方法,提供指令的效率。

原文連接 fetch

相關文章
相關標籤/搜索