内存性能的正确解读

本文涉及的产品
云服务器 ECS,每月免费额度280元 3个月
云服务器ECS,u1 2核4GB 1个月
简介: 一台服务器,不管是物理机还是虚拟机,必不可少的就是内存,内存的性能又是如何来衡量呢。

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

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编译的方法,提供指令的效率。
目录
相关文章
|
22天前
|
缓存 算法 Java
Java内存管理:优化性能和避免内存泄漏的关键技巧
综上所述,通过合适的数据结构选择、资源释放、对象复用、引用管理等技巧,可以优化Java程序的性能并避免内存泄漏问题。
25 5
|
1月前
|
存储 设计模式 缓存
C++享元模式探索:轻松优化内存使用和性能提升之道
C++享元模式探索:轻松优化内存使用和性能提升之道
41 0
|
1月前
|
存储 缓存 算法
深入探究LRU缓存机制:优化内存利用与提升性能
深入探究LRU缓存机制:优化内存利用与提升性能
128 1
|
1月前
|
监控 Java 编译器
Go语言内存与并发性能综合优化策略
【2月更文挑战第11天】Go语言以其高效的并发处理能力和简洁的内存管理机制成为了现代软件开发中的热门选择。然而,在实际应用中,如何综合优化Go程序的内存使用和并发性能,仍然是一个值得探讨的话题。本文将深入探讨Go语言内存与并发性能的综合优化策略,包括内存布局优化、并发模式设计、资源池化以及性能监控与分析等方面,旨在帮助开发者全面提升Go程序的整体性能。
|
2月前
|
监控 Java 编译器
优化Go语言程序中的内存使用与垃圾回收性能
【2月更文挑战第5天】本文旨在探讨如何优化Go语言程序中的内存使用和垃圾回收性能。我们将深入了解内存分配策略、垃圾回收机制,并提供一系列实用的优化技巧和建议,帮助开发者更有效地管理内存,减少垃圾回收的开销,从而提升Go程序的性能。
|
3月前
|
存储 编译器 Linux
【探讨C++内存管理:有效避免内存泄漏与提高性能的关键】(下)
【探讨C++内存管理:有效避免内存泄漏与提高性能的关键】
|
3月前
|
存储 算法 Java
内存管理探秘:自动化与性能的完美平衡
内存管理探秘:自动化与性能的完美平衡
35 0
|
3月前
|
存储 C语言 C++
【探讨C++内存管理:有效避免内存泄漏与提高性能的关键】(上)
【探讨C++内存管理:有效避免内存泄漏与提高性能的关键】
|
3月前
|
存储 机器学习/深度学习 人工智能
阿里云倚天云服务器计算型c8y、通用型g8y、内存型r8y实例性能介绍及活动价格参考
计算型c8y、通用型g8y、内存型r8y是阿里云推出的基于ARM架构的新一代阿里自研倚天实例,采用阿里自研倚天710处理器,基于最新一代CIPU架构,通过芯片快速路径加速手段实现计算、存储、网络性能的大幅提升。其中计算型c8y实例网站应用、各种类型和规模的企业级应用,通用型g8y实例适用于网站应用、各种类型和规模的企业级应用,内存型r8y实例适用于网站应用、各种类型和规模的企业级应用。本文为大家详细介绍倚天云服务器实例的主要性能和最新活动价格情况。
阿里云倚天云服务器计算型c8y、通用型g8y、内存型r8y实例性能介绍及活动价格参考
|
3月前
|
存储 弹性计算 安全
阿里云七代云服务器计算型c7、通用型g7、内存型r7实例性能介绍及活动价格参考
阿里云第7代云服务器主要实例规格包括计算型c7、通用型g7、内存型r7,其中计算型c7实例适用于计算密集型业务,如Web服务器Apache、Nginx等场景,通用型g7实例适用于通用业务,如网站应用、各类企业级应用、中间件,内存型r7实例适用于内存密集型业务,如数据库系统、缓存、搜索集群。本文为大家详细介绍七代云服务器实例的主要性能和最新活动价格情况。
阿里云七代云服务器计算型c7、通用型g7、内存型r7实例性能介绍及活动价格参考