重塑云上的 Java 语言( 六 )
FDO 双十一正零点相对后面几分钟会有一个明显的 CPU 峰值 , 根据数据分析 , 主要原因是双十一零点触发了 JIT 编译 。 举个例子 , 程序里有逻辑: if (is1111(LocalDate.now())) { branch1 else { branch2 假设预热时一直在走 branch2 , 那么 JIT 有理由相信后续基本也都会走 branch2 , 而不会对 branch1编译 。 在零点时 , 我们进入 branch1 , 此时就需要触发退优化重新编译方法 。 我们来看 AJDK 如何通过 profiling 解决这个问题 。 退优化原理及其危害 JDK 运行代码的时候 , 采用分层编译的方式对 Java 方法进行动态编译 。 在最高等级(峰值性能最好)的编译中 , 出于性能的考虑 , 编译的时候会根据收集的信息做一些比较乐观的假设 , 一旦这些假设条件不满足了 , 就会出现退优化的现象 。 比如某个热点方法中某段代码仅会在双十一中执行 , 那么在预热过程中这段代码不会被编译 , 双十一到来时这段代码一旦被执行 , 就会触发整个方法的退优化 。 发生退优化有两个方面的负面影响 , 一是需要运行的方法由高效率的编译执行变成了解释执行 , 运行速度降低百倍以上;二是流量高峰期退优化的方法会很快被重新编译 , 编译线程会消耗 CPU 。 因此在双十一这种流量短时间剧增且与预热流量不太一样的场景下 , 退优化的危害会特别明显 。 通过 FDO 减少退优化 FDO 是 feedback directed optimization 的缩写 , 即参考以往 JVM 运行时的编译信息 , 指导本次运行时进行更好的编译 。 具体的 , 我们采用了两个层面的方法来减少退优化 。 将每次运行时的退优化信息记录到文件中 , 下次运行时读取这个文件 , 在决定是否做乐观假设的时候参考文件中的信息做判断 , 从而减少退优化的概率 。 信息显示出现最多的退优化与 if-else 相关 , 占总数量的一半以上 。 我们提供了一个方法根据以往出现 if-else 退优化的信息 , 关闭某个路径上所有相关的乐观假设 。 双十一中 FDO 的效果 FDO 今年双十一上线 , 目标解决两个问题: 1、双十一 0 点流量高峰和退优化/编译高峰叠加造成的 CPU 使用率脉冲过高 。 2、预热效率低 , 压测经过前长时间预热后 , 增大流量时仍然伴随着大量的编译及退优化 。 针对第一个问题 , 我们收集了双十一高峰第一分钟的退优化/C2 编译次数以及 CPU 数据 。 可见开启 FDO 后高峰期 C2 编译数目减少约 45% , 退优化数目减少约 70% 。 CPU 数据上 , 高峰期第一分钟内开启 FDO 后 CPU 由约 67.5 降低到 63.1 , 降低约 7.0% 。 第二个目标可以通过压测第一分钟的 CPU 数据验证 。 开启 FDO , 压测第一分钟 CPU 使用率由 66.19 降低到 60.33% , 降低约 10% 。 Grace ZProfiler 一直是全集团排查 Java 应用各类问题的利器 , 而 Grace 作为其平台化的版本 , 对其实施了一系列的优化 , 从原来的单机版本到现在的 Master/Worker 架构 , 同时引入了任务排队机制 , 在高压力情况下对用户的任务进行排队从而解决 Worker 不堪重负的问题 。 在可维护性、拓展性、以及用户体验上得到了质的提升 , 为后续工具平台的上云、开源事项打下了夯实的基础 。 目前已经集成了 Heap Dump 功能 , 在继承 ZProfiler 功能的基础上做了一定的优化 , 提升了解析引擎的版本 , 支持更全面的 OQL 语法等等 。 JDK11 JDK8 作为一个经典版本 , 正被大规模使用 , 虽然从 JDK6 和 7 迁移上来有一定的阵痛 , 但是升级后普遍的反馈是:“真香” 。 OpenJDK 8的下一个稳定版本是 OpenJDK 11 。 JVM 团队自然会在这个方向上积极跟进 , 目前 AJDK11 支持了 AJDK8 的 Wisp2 、多租户特性 。 本次双十一的部分集群已经上线到 JDK11 , 表现稳定 。 升级 JDK11 是否会和升级 JDK8 一样给我们带来同样的的惊喜呢?在 JDK11 上我们可以体验到最新的 ZGC 。 ZGC JDK11 引入了一个重要特性:ZGC 内存垃圾回收器 。 这个垃圾回收器号称能够在几十 GB 至若干 TB 的堆上把暂停时间保持在 10ms 以内 。 许多 Java 开发者苦于过去的垃圾回收器的暂停时间带来延迟 , ZGC 短暂停的特性未来无疑会成为 Java 开发者的新宠 。 目前 ZGC 在 OpenJDK 中仍然处于实验特性 , 而且 JDK11 尚未在产业界完全普及 , JDK11 只支持 Linux 上的 ZGC( MacOS 和 Windows 的 ZGC 预计在 2020 年 3 月发布的 JDK14 版本才会支持) , 许多 Java 开发者仍然只能垂涎欲滴 , 处于观望状态 。 向来敢于吃螃蟹的我们岂能望而却步?阿里 JVM 团队和数据库团队已经开始让数据库应用运行在 ZGC 上 , 并根据运行的效果对 ZGC 进行了相应的改进工作 , 包括 ZGC 的页缓存机制优化、ZGC的触发时机优化等等 。 从 9 月开始 , 两个团队推动线上数据库应用在 ZGC 上运行 , 目前已经稳定运行两个月 , 并顺利通过双十一大考 。 线上反馈的效果可喜可贺: 1、 JVM 暂停时间保持在官方的 10ms 以内; 2、 ZGC 大大改善了线上运行集群的平均 RT 与毛刺指标 。 小结 从上述的功能特性可以看到 AJDK 已经从一个传统的 Managed Runtime 脱胎换骨 。 今后 AJDK 将继续致力于提高云上的应用的开发体验 , 通过底层的创新为上层应用提供更多的可能 。 声明:本文为作者投稿 , 版权归作者个人所有 。
推荐阅读
- |MT 正在让游戏本地化质量变得更差?
- 伊隆·马斯克|EDG夺冠翻译小姐姐火了!穿印花旗袍大秀中国美,三门语言切换超牛
- edg战队|EDG赛后美女翻译上热搜!精通4国语言为国争光,网红学霸颜值高!
- 孙悟空|28号1限定3返场仅开胃菜,孙悟空美猴王重塑帅哭,新增6传说1典藏才是重头戏
- 传奇|美服传奇:克服了语言不通,还带着新手玩的风生水起!
- 狄仁杰|狄仁杰星传说巨帅来袭,六周年返场皮肤5选3,宫本重塑迎来最新消息
- 地下城与勇士|DNF:异界装备属性复活!105级能融合镶嵌SS,重塑职业多样性
- 奕星|新版奕星机制太复杂?那我尽量说人话
- 我的世界|我的世界:世界上最难的语言是什么?MC玩家默默打开了附魔台
- 二次元|4年前谁能料到,这款二次元游戏能成为玩家的「共同语言」