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

24 | 跨层案例:如何优化程序、OS和存储系统的交互?

如何让JVM把GC日志写到内存去?
面对复杂性能问题需要不怕困难,不惧浪深沙沉
深入下去进行彻底的根因分析
性能优化需要通晓多个层面的知识
结果表明性能得到提高,验证了方案的有效性
验证第三种方案:将GC日志记录与其他IO分开
将GC日志记录与其他IO分开:将GC日志文件放在SSD文件系统上
减少后台IO:降低后台IO的强度
修改JVM:将GC日志记录活动与关键JVM GC进程分开
非阻塞IO也会被阻塞的原因:页面写入稳定和文件系统日志提交
深入分析GC日志和write()系统调用的延迟
GC日志记录的缓冲写入被阻塞
主要性能指标:STW暂停时间和较大的STW暂停计数
测试了两种场景:有后台IO和没有后台IO
实验室环境中重现性能问题
JVM卡顿(STW)问题
Java应用程序偶尔遇到很大的响应延迟
生产环境中出现非常大的响应延迟
思考题
总结
解决方案的验证
解决方案
响应延迟的根本原因
搭建测试环境重现问题
性能问题表象
性能优化案例分析

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

你好,我是庄振运。
我们前面几讲介绍了性能优化的原则和策略,并且集中探讨了 CPU、内存和存储三个最关键的领域。
今天我们来讲一个比较复杂的 JVM 场景和超大延迟的性能问题;这是本模块,也就是性能优化模块的最后一讲。
我们会一步步地探讨这个性能问题的表象、问题的重现、性能分析的过程和解决方案。这个性能问题的复杂性,表现在它牵扯了计算机技术的很多层次——从最上层的应用程序,到中间层 JVM 的机制,再到操作系统和文件系统的特性,最后还涉及到硬件存储的特点。
更重要的是,这几个层次互相影响,最后导致了平时我们不容易看到的严重性能问题——非常大的 JVM 卡顿。
今天我会把问题的核心和分析过程阐述清楚,而对于其他的一些背景和更多的性能数据,你可以参考我发表在IEEE Cloud上的论文。

生产环境下偶尔很大的响应延迟是怎么回事?

我们先来看看这个性能问题的表象:就是在生产环境中,偶尔会出现非常大的响应延迟。
由于大多数互联网业务都是面向在线客户的(例如在线游戏和在线聊天),所以,确保客户相应的低延迟非常重要。各种研究也都表明,200 毫秒延迟,是多数在线用户可以忍受的最大延迟。因此,确保低于 200 毫秒(甚至更短)的延迟,已经成为定义的 SLA(服务水平协议)的一部分。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了程序、操作系统和存储系统之间的交互优化,重点关注了JVM场景和超大延迟的性能问题。作者描述了生产环境中偶尔出现的非常大的响应延迟,强调了低延迟对于在线客户服务的重要性。通过实验数据清晰地展示了问题的复杂性和影响,为读者提供了深入了解程序、操作系统和存储系统交互优化的实际案例和分析过程。文章提出了三种解决方案,包括修改JVM、减少后台IO和将GC日志记录与其他IO分开,并详细阐述了这些方案的优缺点。最后,通过将GC日志文件放在SSD文件系统上的实验验证了将GC日志记录与其他IO分开的有效性。这篇文章对于需要深入了解程序性能优化和解决延迟问题的技术人员具有重要参考价值。文章内容涉及跨层的性能分析和优化案例,通过合理的性能测试和性能分析,最终提出了解决方案,为读者提供了深入了解程序、操作系统和存储系统交互优化的实际案例和分析过程。

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

全部留言(7)

  • 最新
  • 精选
  • 岁月神偷
    这个性能优化案例非常有代入感,讲解的十分详细,感谢庄老师的分享

    作者回复: 谢谢!

    2020-02-03
    4
  • 黄海峰
    听的过程打算问怎么把gc日志和其他io分开,看到最后发现这是个思考题。。。老师后面会搞个思考题汇总解答吗

    作者回复: 哦,这个问题的答案其实就是JVM的一个参数 -Xloggc:<gc-log-file-path>。 也不奇怪,如果没有使用过这个参数,的确不知道它的存在。 思考题汇总解答也是个好主意,我们考虑一下。谢谢建议。

    2020-01-20
    2
  • 张翠山
    gc 日志不能异步刷盘么?

    作者回复: GC日志的写入操作的确是异步调用的,但是有意思的地方就是这里。特殊情况下,异步写入还是会被block。

    2020-04-25
    2
  • 肖飞码字
    那是不是不设置这个 -Xloggc jvm参数就不会有这个io导致的问题?

    作者回复: 是的。如果不设置这个参数,就不会有log,自然就不会有这个IO的问题了。

    2020-04-09
  • 这个案例分享好,同时也表明了计算机基础知识不牢固,确实干不了,需要从上往下一直深入的找原因。
    2020-03-11
    4
  • 明宝
    延迟的根本原因是JVM,把JVM干掉就好
    2021-06-14
    1
  • 罗辑思维
    平常:「JVM 写入 GC 日志文件--->文件缓存页面--->硬盘文件」 但是:「文件缓存页面处于 OS 回写状态,则对该页面的 write() 必须等待回写完成。」 然后:「可以在JVM,OS,硬件层面进行优化。」
    2020-03-07
收起评论
显示
设置
留言
7
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部