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.mzph.cn/news/115135.shtml

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

相关文章

vscode类似GitHub Copilot的插件推荐

由于GitHub Copilot前段时间学生认证的账号掉了很多,某宝激活也是价格翻了几倍,而却,拿来用一天就掉线,可以试试同类免费的插件哦。 例如:TabNine,下载插件后,他会提示你登录,直接登…

spring6-国际化:i18n | 数据校验:Validation

文章目录 1、国际化:i18n1.1、i18n概述1.2、Java国际化1.3、Spring6国际化1.3.1、MessageSource接口1.3.2、使用Spring6国际化 2、数据校验:Validation2.1、Spring Validation概述2.2、实验一:通过Validator接口实现2.3、实验二:B…

关于计算机找不到vcomp140.dll无法继续执行怎么修复

在计算机使用过程中,我们可能会遇到各种问题,其中之一就是vcomp140.dll文件丢失。vcomp140.dll是一个动态链接库文件,它通常用于支持软件运行和系统功能。当这个文件丢失时,可能会导致程序无法正常运行,甚至系统出现错…

分类预测 | MATLAB实现SSA-CNN-BiLSTM麻雀算法优化卷积双向长短期记忆神经网络数据分类预测

分类预测 | MATLAB实现SSA-CNN-BiLSTM麻雀算法优化卷积双向长短期记忆神经网络数据分类预测 目录 分类预测 | MATLAB实现SSA-CNN-BiLSTM麻雀算法优化卷积双向长短期记忆神经网络数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现SSA-CNN-BiLSTM数据…

大厂秋招真题【贪心】大疆20230813秋招T1-矩形田地

题目描述与示例 题目描述 给定一个矩形田地,其高度为 h 且宽度为 w。同时,你将获得两个整数数组 horizontalCutting 和 verticalCutting,其中 horizontalCutting[i] 表示从矩形田地顶部到第 i 个水平切口的距离,verticalCutting…

使用CountdownLatch和线程池批量处理http请求,并处理响应数据

背景和问题 ​ 背景:最近项目的一个接口数据,需要去请求其他多个服务器的数据,然后统一返回; 问题点:如果遍历所有的服务器地址,然后串行请求就会出现请求时间过长,加入需要请求十个服务器&…

解决谷歌学术bib信息不全的问题

在我们撰写学术论文时,经常需要引用参考文献。如果用latex撰写论文,势必会用到文献的bib信息,大部分的教程都会告诉我们去google scholar上去搜索。 一、问题描述 搜索一篇文章,然后选择cite,再选择bib。 很明显&…

Node学习笔记之MySQL基本使用

使用 SQL 管理数据库 其实写接口简单来说就是操作数据库数据,所以我们需要学会数据库的增、删、查、改等基本操作 1. 什么是 SQL SQL(英文全称:Structured Query Language)是结构化查询语言,专门用来访问和处理数据…

(2)Nmap

笔记目录 渗透测试工具(1)wireshark渗透测试工具(2)Nmap渗透测试工具(3)BurpsuiteAWD比赛(1)AWD入门攻略大纲 1.工具简介 (1)定义 ①功能 网络扫描和嗅探工具包,三个主要基本功能: 探测一组主机是否在线 扫描主机端口、嗅探所提供的网络服务 推断出主…

Keil实现Flash升级跳转(STM32/GD32/HC32)

编写BOOT程序,和APP程序。 BOOT程序检查OTA参数,执行OTA升级,然后跳转到APP代码。 记录一下跳转APP需要修改得东西: 1、BOOT程序 修改跳转地址 先检查APP地址是否有效 然后关闭外设 反初始化 设置MSP指针,进行跳转 …

ZooKeeper+HBase分布式集群环境搭建

安装版本:hadoop-2.10.1、zookeeper-3.4.12、hbase-2.3.1 一、zookeeper集群搭建与配置 1.下载zookeeper安装包 2.解压移动zookeeper 3.修改配置文件(创建文件夹) 4.进入conf/ 5.修改zoo.cfg文件 6.进入/usr/local/zookeeper-3.4.12/zkdata…

Vue 模板字符串碰到script无法识别,报错Parsing error: Unterminated template.

需求: 将js代码完整的显示在界面上,包括标签 代码如下: 报错信息如下: 我们在上图中可以看到模板字符串加入了script标签后会报错 原因:运行JS的时候由上至下,先识别模板字符串里面的script标签&#xf…

基于B/S架构,包括PC后台管理端、APP移动端、可视化大屏端的智慧工地源码

智慧工地管理平台充分运用数字化技术,聚焦施工现场岗位一线,依托物联网、互联网、AI等技术,围绕施工现场管理的人、机、料、法、环五大维度,以及施工过程管理的进度、质量、安全三大体系为基础应用,实现全面高效的工程…

计算机网络,网络(OSI)七层模型,三次握手四次挥手,get与post请求区别,网络IO(BIO\NIO\AIO),TCP与UDP区别

1.OSI模型? 开放式系统互联通信参考模型(Open System Interconnection Reference Model) OSI网络七层模型:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层 TCP/IP协议群简化了OSI七层模型:应用层、传输层、网络层、数据链路…

自然语言处理---文本预处理概述

自然语言处理(Natural Language Processing,简称NLP)是计算机科学与语言学中关注于计算机与人类语言间转换的领域。其主要应用于:语音助手、机器翻译、搜索引擎、智能问答等。 文本预处理概述 文本语料在输送给模型前一般需要一…

QSlider 类使用教程

文章目录 1、简介2 、公共类型3、属性4、functions4.1、访问属性相关 function4.2、公共槽4.3、Signal4.4、其他方法 5、设置样式 QT 官方文档参考地址:https://doc.qt.io/qt-5/qslider.html 1、简介 QSlider是垂直或水平滑块条控件,最常见的应用就是视…

MySQL常见面试题

一、存储引擎相关 (1)MySQL 支持哪些存储引擎? MySQL支持多种存储引擎,比如InnoDB,MyISAM, MySQL大于等于5.5之后,默认存储引擎是InnoDB (2)InnoDB 和 MyISAM 有什么区别? InnoD…

【计算机网络】IP协议的相关特性

IP协议:互联网的核心组件 在当今高度数字化的世界中,互联网已成为人们生活、工作不可或缺的一部分。而在这个庞大的网络中,IP协议(Internet Protocol)作为核心的通信协议,发挥着至关重要的作用。本文将详细…

http post协议发送本地压缩数据到服务器

1.客户端程序 import requests import os # 指定服务器的URL url "http://192.168.1.9:8000/upload"# 压缩包文件路径 folder_name "upload" file_name "test.7z" headers {Folder-Name: folder_name,File-Name: file_name } # 发送POST请求…

浏览器从输入url到渲染页面发生了什么?

浏览器从输入url到渲染页面发生了什么? 一、解析URL 首先浏览器做的第一步工作就是要对 URL 进行解析,浏览器会判断这个url的合法性 ,以及是否有可用缓存(如果有缓存即可以不用进行下一步的DNS域名解析),…