性能:如何减少延迟提升内存分配效率

内存是如何影响性能的

在这里插入图片描述

缓存命中率

  • 缓存(CPU Cache)是CPU和内存之间的临时数据交换器,是为了解决CPU运行处理速度和内存读写速度不匹配而设计的
  • 随着多核CPU的发展,CPU缓存通常分成了三个级别:L1、L2、L3。级别越小就越接近CPU,速度越快,容量也越小
  • 每一级缓存的命中率都很重要,尤其是L1的命中率。这是因为缓存的命中率对总体的访问时间延迟影响很大,而且下一级缓存的访问延迟往往是上一级延迟的很多倍。

缓存一致性

  • 虽然缓存能够极大地提升运算性能,但是也带来了一些其他的问题,比如“缓存一致性问题”
  • 如果不能保证缓存一致性,就可能造成结果错误。因为每个核都有自己的L1和L2缓存,当在不同核上运行同一个进程的不同线程时,如果这些线程同时操作同一个进程内存,就可能相互冲突,最终产生错误的结果。
  • 为了达到数据访问的一致性,就需要各个处理器和内核,在访问缓存和写回内存时遵循一些协议,即缓存一致性协议。常见协议有MSI、MESI等
  • 缓存一致性协议解决了缓存内容不一致的问题,但同时也造成了缓存性能的下降。

内存带宽

计算机性能方面的一个趋势是,内存越来越变成主要的性能瓶颈。内存对性能的制约包括三个方面:内存大小、内存访问延迟和内存带宽

在这里插入图片描述

  • 第一个方面是内存大小。这个方面的优化方式有很多,包括采用高效的,使用内存少的算法和数据结构
  • 第二个方面是内存访问延迟
    • CPU的各级缓存,就是为了降低内存的直接访问,从而间隔降低内存访问延迟的。
    • 如果我们尽量降低数据和程序的大小,那么各级缓存的命中率也会相应的提高,这是因为缓存可以覆盖的代码和数据比例会增大
  • 第三个方面是内存带宽
    • 内存带宽就是单位时间内,可以并行读取或者写入的数据量,通常以字节/秒为单位表示。
    • 一个CPU的最大内存带宽往往是有限而确定的。并且一般来说,这个最大内存带宽只是个理论最大值,实际上我们的程序使用只能达到最大带宽利用率的60%,如果超出这个百分比,内存的访问延迟就会急剧上升

在这里插入图片描述
图中内存带宽使用是横轴,相对应的,内存访问延迟是纵轴。你可以清楚地看到:

  • 当内存带宽较小时,内存访问延迟很小,而且基本固定,最多缓慢上升。
  • 当内存带宽超过一定值后,访问延迟会快速上升,最终增加到不能接受的程度。

问:处理器的内存总带宽取决于哪些因素。

  • 答案是,有四个因素,内存总带宽的大小就是这些因素的乘积。
  • 这四个因素是:DRAM 时钟频率、每时钟的数据传输次数、内存总线带宽(一般是 64 字节)、内存通道数量。

内存的分配

程序使用的内存大小很关键,是影响一个程序性能的重要因素,所以我们应该尽量对程序的内存使用大小进行调优,从而让程序尽量少的使用内存

  • 如果程序把系统内存耗光了,系统就会被迫杀掉一些进程,并且抛出一个系统错误:OOM(Out Of Memory)

  • 还有,服务器等容量也是公司运营成本的一部分。如果一台服务器的内存资源足够,那么这样一个服务器系统就可以同时运行多个程序或者进程,以最大限度的提高系统利用率。

  • 应用程序向操作系统申请内存时,系统会分配内存,这中间重要花些时间,因为操作系统需要查看可用内存并分配。一个系统的空闲内存越多,应用程序向操作系统申请内存的时候,就越快的拿到所申请的内存。反之,应用程序就有可能经历很大的内存请求分配延迟

    • 比如,在系统空闲内存很少的时候,程序很可能会变得超级慢。因为操作系统对内存请求进行(比如malloc)处理是,如果空闲内存不够,系统需要采取措施回收内存,这个过程可能会阻塞
    • 一般来讲,开发应用程序时,建议使用内存池而不是malloc、new等方式直接申请。这样可以尽量避免内存碎片,提升内存分配效率和系统的总体内存使用效率

NUMA的影响

在这里插入图片描述

NUMA,也就是多处理器对内存使用有什么影响呢?

NUMA系统现在非常普遍,它和CPU以及内存的性能都很相关。简单来说,NUMA包含多处理器(或者节点),它们之间通过高速互联网络连接而成。每个处理器都有自己的本地内存,但所有处理器都可以访问全部内存。

因为访问远端内存的延迟远远大于本地内存访问,操作系统的设计已经将内存分布的特点考虑进去了。比如一个线程运行在一个处理器中,那么为这个线程所分配的内存,一般是该处理器的本地内存,而不是外部内存。但是,在特殊情况下,比如本地内存已经用光,那就只能分配远端内存。

我们部署应用程序时,最好将访问相同数据的多个线程放在相同的处理器上。有时,也需要强制去绑定线程到某个节点或者CPU核上

工具

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值