性能工程高手课
庄振运
Facebook 性能优化和容量管理高级专家
24631 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 40 讲
性能工程高手课
15
15
1.0x
00:00/00:00
登录|注册

21 | CPU案例:如何提高LLC(最后一级缓存)的命中率?

解决方案:让每个元素单独占用一个缓存行
伪共享缓存问题
有效和有害的例子
硬件指令预取的基本原理
去除伪共享缓存
用软件预取数据
缩小数据结构
使用Perf工具测量LLC的不命中率
影响:CPU速度受影响;内存带宽使用率增加
缓存的命中率是CPU性能的关键指标
思考题
如何降低LLC的不命中率
LLC不命中率的测量
性能问题:最后一级缓存(LLC)不命中率太高
如何提高LLC(最后一级缓存)的命中率

该思维导图由 AI 生成,仅供参考

你好,我是庄振运。
前面两讲中,我介绍了性能优化的六大原则和十大策略。从今天开始,我们来通过具体案例的解决方案讲解,了解这些原则和策略是如何应用的。
首先,我们要来探讨的是一个 CPU 相关的性能优化案例。
这个性能案例,是关于CPU 的最后一级缓存的。你应该知道,最后一级缓存(一般也就是 L3),如果命中率不高的话,对系统性能会有极坏的影响(相关基础知识建议回顾第 15 讲)。所以对这一问题,我们要及时准确地监测、暴露出来。
至于具体解决方案,我这里建议采取三种性能优化策略,来提高最后一级缓存的命中率。分别是:紧凑化数据结构软件预取数据去除伪共享缓存。它们分别适用于不同的情况。

性能问题:最后一级缓存(LLC)不命中率太高

一切问题的解决都要从性能问题开始入手,我们首先来看看最后一级缓存不命中率太高这个性能问题本身。
缓存的命中率,是 CPU 性能的一个关键性能指标。我们知道,CPU 里面有好几级缓存(Cache),每一级缓存都比后面一级缓存访问速度快。最后一级缓存叫 LLC(Last Level Cache);LLC 的后面就是内存。
当 CPU 需要访问一块数据或者指令时,它会首先查看最靠近的一级缓存(L1);如果数据存在,那么就是缓存命中(Cache Hit),否则就是不命中(Cache Miss),需要继续查询下一级缓存。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了针对CPU最后一级缓存不命中率过高的性能问题的解决方案。作者首先解释了缓存命中率对CPU性能的重要性,特别是最后一级缓存的不命中对性能的严重影响。然后介绍了三种性能优化策略:紧凑化数据结构、软件预取数据和去除伪共享缓存。其中,软件预取数据是通过合理预测,将可能要读取的数据提前取出,放入缓存中,以减少缓存不命中率。作者还分享了软件预取的实践经验,强调了预取操作的代价和应用场景。最后,重点讨论了如何降低LLC的缓存不命中率,提出了去除伪共享缓存的解决方案,解释了伪共享缓存的问题及解决方法。整体而言,本文提供了针对LLC不命中率高的问题的解决方案,为读者提供了实用的性能优化策略。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《性能工程高手课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(10)

  • 最新
  • 精选
  • 三件事
    硬件指令预取是利用局部性原理 Locality。局部性原理在处理连续内存时是非常有效的,但是在实际情况下内存是不一定连续的,所以会预取到一些无效的 item,以至于会进一步导致有效缓存失效。最终造成性能问题。 有效的话,最典型的例子应该就是 loop 循环访问 data array 了吧。 无效的话,比如说两个矩阵按列相乘。 不知道这个例子对不对,感觉自己现在是刚懂了一些概念,但还做不到举一反三的地步。

    作者回复: 你的这个例子其实很好,一般Loop循环就是连续取数组的数据,这些数组数据就有很好的Locality。

    2020-03-31
    2
  • LindaWang
    庄老师,您了解的业界有没有用AI做性能调优的工具呢?

    作者回复: AI范围很广,用在性能调优上面也是比较有挑战性的; 我个人感觉主流的性能相关的系统,都或多或少的有点“智能”。但是具体的实现和有效性,就见仁见智了。

    2020-03-26
    2
    1
  • benny
    去除伪共享缓存 这个如何发现有这样的问题呢?

    作者回复: Linux 下的Perf可以帮忙。你用Google搜一下,有很多相关资料,比如https://joemario.github.io/blog/2016/09/01/c2c-blog/

    2020-03-22
    1
  • 海华(海菜)
    采集了下我们的大数据类型机器的cache miss率,采样3台机器,10分钟均在25% ~ 30%左右,请教老师: 一个是25% ~ 30%这个值算比较高了吧? 二是都是hadoop类应用,应该从哪里着手排查问题呢?

    作者回复: Cache Miss Ratio多高是正常得看具体的Workload。如果是Hadoop,我的理解是Miss Ratio高点也很正常,因为Hadoop的Worload的Locality一般不太好(尤其是数据量大的话)。

    2020-02-09
    1
  • LindaWang
    请教下,庄老师。您了解有没有流程级(函数级)Cache行为诊断机制呢?perf测的是进程级别的,粒度太大了

    作者回复: 函数级的我还真不知道。。

    2020-07-07
  • 蚂蚁内推+v
    老师您好,我有两个问题: 1.怎么判断什么时候该使用cpu? 缓存优化呢?cache的miss率达到多少就认为应该优化了? 2.CPU从内存中加载数据,会影响CPU使用率吗?比如CPU cache的miss率是10%,是不是一定比miss率是40%的cpu使用率更高?(假设都是cpu密集型的,都没有额外的io操作)。

    作者回复: 具体多少cashe miss比较正常,还得看应用程序的特点。有人说如果高于5%就算很高了。 会影响CPU util的,因为CPU只能干等着数据返回,也不能干别的。

    2020-04-29
  • LLC命中率低导致的性能问题? 这个对我有些高级,基本没处理过这种问题,另外,请教一下,LLC命中率低导致的性能问题表现是怎么样的?可能刚开始不会意识到去查LLC的命中率?再者LLC的命中率多大算是OK,这个问题不同的组件标准估计也上是不同的,具体怎么判断呢? 能否认为CPU使用率较高但性能一般,可能就是LLC命中率较低造成的?

    作者回复: 刚开始的确不会想到去查LLC命中率,一般来讲,一个系统只要运行正常,绝大多数时候,就是能用就行。只有当需要大规模优化的时候(比如几千台服务器运行同一个程序),大家才会去努力查找可以优化的地方,从而做各种测试分析。 很多时候是根据经验。像你说的:CPU使用很多,但是性能一般,基本就是某个地方出问题了。LLC方面的问题是一个可能。

    2020-03-05
  • 安排
    原本我们想让不同线程各自访问不同的数据,也就是不让他们共享,可以并发操作。但是每个cache line长度并对齐的内存是核间共享的,对他们的访问需要原子进行,从而导致了伪共享。
    2020-04-11
    1
  • 森屿时光
    作者,您好,按照您的分析,最后一级缓存的未命中数=(LLC-load-miss+LLC-store-miss)/(LLC-load+LLC-store)[我也这么认为的],但是还有一个指标LLC-miss,这个指标测出的数据又代表什么呢? 通过实验我发现: 当执行命令:perf stat -e LLC-miss,LLC-load-miss时,二者数值上相等(不知道为什么会相等) 当执行命令:perf stat -e LLC-miss,LLC-load-miss,LLC-load,LLC-store时,四者数值上均不相等,添加后两个指标后,LLC-miss 和 LLC-load-miss 就不等了【不知道为什么】 还有为什么 LLC-miss != LLC-load-miss+LLC-store-miss 【我也没看到有相关的解释】 另外,是否LLC-load-miss,LLC-store-miss就分别代表对内存的读-写次数 谢谢回复!
    2022-10-08归属地:江苏
  • 外套
    2020-01-14
收起评论
显示
设置
留言
10
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部