JIT耗时优化

优质博文:IT-BLOG-CN

一、背景

业务流量突增,机器直接接入大量流量QPS2000JITGC会消耗太多CPU资源,导致1-2分钟时间内的请求超时导致异常,因此采用流量预热的方式,让机器逐步接入流量,需要预热时长3min。目前服务接入HPA,通过HPA自动扩缩容应用流量变化,当流量激增时,对机器的启动速度带来了挑战,之前通过Swift优化点火时间,已经将机器从容器创建到可接入流量优化到2分钟左右,但3min的预热时长成为了应对流量激增的瓶颈,因此优化机器从接入流量到能稳定服务的时长,目标缩减到2min以内。

什么是服务预热: Java应用在刚启动的时候处理相应速度会很慢,只有当热点代码执行了一定次数以后,相应速度才会达到一个稳定状态。由于Java慢启动现象的存在,多数情况下我们有必要对Java应用进行预热,以防止客户端在调用过程中,因为服务器重启或发布事件,而出现大量慢请求。

流量接入后younggc耗时:峰值900ms左右,最大次数18次

二、优化思路

名词解释

JIT(Just In Time) 即时编译器: java程序是解释执行的,即运行时将字节码解释为机器码来执行,因此性能差;为了优化Java性能,jvm引入的编译器,随着程序的执行,编译器会将热点代码编译优化为本地代码,来获取更高的执行效率

jvm中集成了两种编译器:
【1】Client Compiler:如C1编译器,注重启动速度和局部的优化,C1的启动速度开,但是峰值性能比C2要差;
【2】Server Compiler:如C2编译器、Graal编译器,关注全局的优化,性能会更好,但由于会进行更多的全局分析,所以启动速度会变慢;
【3】分层编译:为了综合Client ComplierServer Compiler的特性,在启动速度和峰值性能之间取得平衡,java7开始引入分层编译,分为5层:
  ■ 解释执行。
  ■ 执行不带profilingC1代码。
  ■ 执行仅带方法调用次数以及循环回边执行次数profilingC1代码。
  ■ 执行带所有profilingC1代码。
  ■ 执行C2代码。

方法内联: 编译过程中遇到方法调用时,将目标方法的方法体纳入编译范围之中,并取代原方法调用的优化手段,JIT大部分的优化都是在内联的基础上进行的;

逃逸分析: 编译器,根据新建对象是否被存入堆中以及是否传入未知代码(未内联代码)中,判断对象是否逃逸,对未逃逸对象进行锁消除、栈上分配优化;

更多内容参考:JIT & AOP

优化思路

【1】通过调整JVM参数,提高JIT效率;
  ● 增加JIT线程;
  ● 调整内联参数,减少内联失败;
  ● 关闭分层编辑,直接进行C2编译;
  ● 关闭逃逸分析,让出资源做其他优化;

【2】更换更新的Server Compiler:Graal编译器使用Java编写,对于Java而言,尤其是新特性,比如Lambda/Stream等更优化。
【3】使用AOT:提前编译,在运行时将Java方法动态编译为本地AOT代码,并将它们存储在共享类缓存中,以此提升启动速度,如:DragonWall/openJ9
【4】业务代码层优化:减少代码量,针对目前基础策略灰度体检,代码体谅大,灰度结束后,代码量减少,JIT应当有所好转。

三、优化过程

优化前机器参数:JIT耗时1.7minGC峰值600ms

调整 JVM参数

【1】采用GraalVM编译器: 有效果,但效果没有关闭分层编译好。

-XX:+UnlockExperimentalVMOptions
-XX:+UseJVMCICompiler

【2】增加JIT线程数: 默认15个线程

-XX:+CICompilerCountPerCPU=false
-XX:CICompilerCount=16

【3】增加内联机器码大小阈值,减少内联失败。同时,增加内联调用次数阈值,延迟内联: 无效果,短暂延迟了JIT耗时峰值;

-XX:+UnlockExperimentalVMOptions
-XX:InlineSmallCode=4000
-XX:InlineFrequencyCount=1000

【4】关闭分层编译: 镜像效果明显

-XX:+UnlockExperimentalVMOptions
-XX:-TieredCompilation

【5】关闭逃逸分析: 效果不明显,有持续耗时高峰,不可用

-XX:+UnlockExperimentalVMOptions
-XX:-DoEscapeAnalysis

AOT

【1】通过openj9AOT替换JIT 启动性能要好一些,但是稳定后吞吐量和延迟都要差一点,然后启动时会有部分超过100ms(大概是首分钟的95线)
【2】使用DragonWall11 不支持JWarmup不可用。

JWarmup:让JVM提前知道哪些方法热的,在处理请求之前就让这些方法提前被编译掉,从而避免了前面边解释,边编译的开销。

代码优化

减少代码量: JIT耗时明显下降。

JVM参数符合使用

【1】采用GraalVM & 关闭分层编译: JIT峰值没有改善,且点火时异常增高。最终项目启动成功的成本100288ms不可用

-XX:+UnlockExperimentalVMOptions
-XX:+UseJVMCICompiler
-XX:-TieredCompilation

【2】采用GraalVM & 增加内联机器码大小阈值,减少内联失败 & 增加内联调用次数阈值,延迟内联 JTI峰值没有改善,且点火时长异常高。不可用

-XX:+UnlockExperimentalVMOptions
-XX:+UseJVMCICompiler
-XX:+UnlockDiagnosticVMOptions
-XX:InlineSmallCode=4000
-XX:InlineFrequencyCount=1000

【3】关闭分层编译 & 增加内联机器码大小阈值,减少内联失败 & 增加内联调用次数阈值,延迟内联JTI峰值没有改善,且GC耗时过高。不可用

-XX:+UnlockExperimentalVMOptions
-XX:-TieredCompilation
-XX:+UnlockDiagnosticVMOptions
-XX:InlineSmallCode=4000
-XX:InlineFrequencyCount=1000

四、优化结果

【1】JIT-MAXJIT点火耗时Max,从1.9min左右,2月1日关闭分层编译后减少到1.6min左右,代码优化后降到55s左右

【2】JIT-AVGJIT平均耗时,从原来的10S,2月1日关闭分层编译后减少到7.5s左右,代码优化后降到5s左右

五、结论

【1】分层编译对JIT耗时有增益效果,但是由于机器差异,对最大耗时的优化不是很明显,从平均耗时看差异较大;
【2】代码重构后,代码量减少,对最大JIT编译耗时优化效果比较明显,平均耗时也有所下降;
【3】优化QPM数据采集准确性,减少由于数据采集延迟带来频繁扩缩容,减少JIT高峰数量;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/166691.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

go语言Array 与 Slice

有的语言会把数组用作常用的基本的数据结构,比如 JavaScript,而 Golang 中的数组(Array),更倾向定位于一种底层的数据结构,记录的是一段连续的内存空间数据。但是在 Go 语言中平时直接用数组的时候不多,大多数场景下我…

【Lua语法】字符串

Lua语言中的字符串是不可变值。不能像在C语言中那样直接改变某个字符串中的某个字符,但是可以通过创建一个新字符串的方式来达到修改的目的 print(add2(1 , 2 ,15,3))a "no one"b string.gsub(a , "no" , "on1111")print(a) print…

微软正式发布开源应用平台 Radius平台

“ 10 月 18 日,微软 Azure 孵化团队正式发布开源应用平台 Radius,该平台将应用程序置于每个开发阶段的中心,重新定义应用程序的构建、管理与理解方式。” 简单的概括就是,它和Kubernetes不一样,Radius将应用程序放在每…

C语言--程序环境和预处理

前言 本章就是c语言的最后一个板块了,学完这章节,我们将知道写出的代码如何变成可执行程序的,这是非常重要的一个章节,那让我们一起进入本章的学习吧。 本章重点: 程序的翻译环境程序的执行环境详解:C语言程…

周立功ZCANPRO简介和使用

ZCANPRO目录 周立功ZCANPRO简介一、软件安装ZCANPRO官网链接:驱动官网链接 二、ZCANPRO使用1.设备管理2.选择CAN、CANFD波特率计算器使用方法(可选) 3.新建视图CAN视图DBC视图 4.发送数据普通发送DBC发送 三、高级功能UDS诊断 周立功ZCANPRO简…

【java爬虫】使用selenium获取某交易所公司半年报数据

引言 上市公司的财报数据一般都会进行公开,我们可以在某交易所的官方网站上查看这些数据,由于数据很多,如果只是手动收集的话可能会比较耗时耗力,我们可以采用爬虫的方法进行数据的获取。 本文就介绍采用selenium框架进行公司财…

HTML选项框的设计以及根据不同选项的值对应不同的事件

文章目录 HTML选项框的设计JS根据不同的选项框对应出不同的事件 HTML选项框的设计 在前端页面的设计中&#xff0c;多选框的设计用select标签完成实现 全部选项都显示的选项框 <form><select multiple"multiple"><option></option><opti…

视频怎么压缩?视频过大这样压缩变小

在日常生活中&#xff0c;我们常常会遇到需要压缩视频的情况&#xff0c;视频压缩不仅可以减小文件大小&#xff0c;方便存储和传输&#xff0c;还可以在保证质量的同时&#xff0c;满足不同的使用需求。那么&#xff0c;如何有效地压缩视频呢&#xff1f; 方法一&#xff1a;嗨…

web APIs——第一天(上)

变量声明的时候建议 const优先&#xff0c;尽量使用const 原因&#xff1a; const语义化更好很多变量我们声明的时候就知道他不会被更改了&#xff0c;那为什么不用const呢&#xff1f;实际开发中也是&#xff0c;比如react框架&#xff0c;基本const如果你有纠结的时候&…

python中的yolov5结合PyQt5,使用QT designer设计界面没正确启动的解决方法

python中的yolov5结合PyQt5&#xff0c;使用QT designer设计界面没正确启动的解决方法 一、窗体设计test: 默认你已经设计好了窗体后&#xff1a; 这时你需要的是保存生成的untitle.ui到某个文件夹下&#xff0c;然后在命令行中奖.ui转换为.py&#xff08;&#xff0c;通过​​…

css之Flex弹性布局

文章目录 &#x1f415;前言&#xff1a;&#x1f3e8;定义flex容器 display:flex&#x1f3e8;在flex容器中子组件进行排列&#x1fa82;行排列 flex-direction: row&#x1fa82;将行排列进行翻转排列 flex-direction: row-reverse&#x1f3c5;按列排列 flex-direction: col…

2020年亚太杯APMCM数学建模大赛B题美国总统的经济影响分析求解全过程文档及程序

2020年亚太杯APMCM数学建模大赛 B题 美国总统的经济影响分析 原题再现&#xff1a; 美国总统选举每四年举行一次。 2020年是美国总统大选年&#xff0c;共和党候选人唐纳德特朗普和民主党对手乔拜登竞选总统。 甲乙双方候选人在金融贸易&#xff0c;经济金融治理&#xff0c;…

离散低通滤波方法

低通滤波器允许低频信号通过&#xff0c;并抑制高频信号。其核心思想是在频率域上通过移除高频成分来平滑信号。这在去噪、平滑和提取基本频率成分时非常有用。 离散低通滤波方法通常采用一阶低通滤波器进行处理。一阶低通滤波器是一种常见的数字滤波器&#xff0c;能够将信号…

电脑出现xinput1_3.dll的错误提示怎么办?有什么办法可以解决

电脑如果缺失了xinput1_3.dll还是一件比较复杂的事情&#xff0c;那么电脑出现xinput1_3.dll的错误提示怎么办&#xff0c;又有什么办法可以解决xinput1_3.dll&#xff1f;今天我们就来聊聊xinput1_3.dll丢失的解决办法&#xff0c;来看看都有哪些办法可以解决吧。 一.常见的问…

Leetcode—2331.计算布尔二叉树的值【简单】

2023每日刷题&#xff08;六&#xff09; Leetcode—2331.计算布尔二叉树的值 递归实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ bool evaluateTree(struct TreeNod…

rabbitMQ(3)

RabbitMq 交换机 文章目录 1. 交换机的介绍2. 交换机的类型3. 临时队列4. 绑定 (bindings)5. 扇形交换机&#xff08;Fanout &#xff09; 演示6. 直接交换机 Direct exchange6.1 多重绑定6.2 direct 代码案例 7. 主题交换机7.1 Topic 匹配案例7.2 Topic 代码案例 8. headers 头…

ESXI6.5安装教程

设置从IPMI Virtual Disk 3000启动&#xff0c;出现如下界面&#xff1a; 默认选择第一项&#xff0c;回车安装 安装程序正在检测服务器硬件信息&#xff0c;如果不满足系统安装条件会跳出错误提示。 检测完成之后会出现下面界面 回车 按F11 这里列出了服务器硬盘信息&#…

安防视频监控系统EasyCVR视频汇聚存储平台定制化开发:新增kafka配置

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台可拓展性强、…

Flyway Desktop updated

Flyway Desktop updated 为比较工件序列化和反序列化添加了额外的调试日志记录。 Flyway Desktop现在将记住以前用于创建项目和匹配克隆的位置。 新的脱机许可工作流现在已在Microsoft Windows上启用。 现在&#xff0c;在配置目标数据库列表时&#xff0c;环境ID是可见的。 现…

c++ pcl点云变换骨架枝干添加树叶源码实例

程序示例精选 c pcl点云变换骨架枝干添加树叶源码实例 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《c pcl点云变换骨架枝干添加树叶源码实例》编写代码&#xff0c;代码整洁&#xff0c;…