一台服务器,不管是物理机还是虚拟机,必不可少的就是内存,内存的性能又是如何来衡量呢。

1. 内存与缓存

现在比较新的 CPU 一般都有三级缓存,L1 Cache(32KB-256KB),L2 Cache(128KB-2MB),L3 Cache(1M-32M)。缓存逐渐变大,CPU 在取数据的时候,优先从缓存去取数据,取不到才去内存取数据。
CPU_jpeg

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)进行内存读取操作:
CPU_

那对应的内存带宽是怎样的呢?测试内存带宽有很多很多工具,linux 下一般通过 stream 进行测试。简单介绍下 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 编译的方法,提供指令的效率。
  • 区块链

    区块链就是一条信息多方确认并存储于多个地方。 学习区块链,拥抱未来吧!

    63 引用 • 8 回帖 • 1 关注
  • 智能合约

    智能合约(英语:Smart contract )是一种旨在以信息化方式传播、验证或执行合同的计算机协议。

    20 引用 • 9 回帖
  • EOS

    第三代区块链到来了?赶紧学习 EOS 智能合约吧

    3 引用 • 3 回帖
感谢    赞同    分享    收藏    关注    反对    举报    ...