内存性能的正确解读

一台服务器,无论是物理机仍是虚拟机,必不可少的就是内存,内存的性能又是如何来衡量呢。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

相关文章
相关标签/搜索