当前位置: 首页 > news >正文

JVM参数调优经验

首先既然需要调优那么我们的系统肯定是出现了一些问题。

可能会有现象:Tp99分钟响应时间超过300ms,Tp999的毛刺很多,系统率可用率下降。

先排除应用代码导致,上游接口的问题,中间件的问题

评判 GC 的两个核心指标:

  • 延迟(Latency): 也可以理解为最大停顿时间,即垃圾收集过程中一次 STW 的最长时间,越短越好,一定程度上可以接受频次的增大,GC 技术的主要发展方向。
  • 吞吐量(Throughput): 应用系统的生命周期内,由于 GC 线程会占用 Mutator 当前可用的 CPU 时钟周期,吞吐量即为 Mutator 有效花费的时间占系统总运行时间的百分比,例如系统运行了 100 min,GC 耗时 1 min,则系统吞吐量为 99%,吞吐量优先的收集器可以接受较长的停顿。

目前各大互联网公司的系统基本都更追求低延时,避免一次 GC 停顿的时间过长对用户体验造成损失,衡量指标需要结合一下应用服务的 SLA,主要如下两点来判断:

重点需要关注的几个GC Cause:

  • System.gc(): 手动触发GC操作。
  • CMS: CMS GC 在执行过程中的一些动作,重点关注 CMS Initial Mark 和 CMS Final Remark 两个 STW 阶段。
  • Promotion Failure: Old 区没有足够的空间分配给 Young 区晋升的对象(即使总可用内存足够大)。
  • Concurrent Mode Failure: CMS GC 运行期间,Old 区预留的空间不足以分配给新的对象,此时收集器会发生退化,严重影响 GC 性能,下面的一个案例即为这种场景。
  • GCLocker Initiated GC: 如果线程执行在 JNI 临界区时,刚好需要进行 GC,此时 GC Locker 将会阻止 GC 的发生,同时阻止其他线程进入 JNI 临界区,直到最后一个线程退出临界区时触发一次 GC。

3.2 判断是不是 GC 引发的问题?

到底是结果(现象)还是原因,在一次 GC 问题处理的过程中,如何判断是 GC 导致的故障,还是系统本身引发 GC 问题。这里继续拿在本文开头提到的一个 Case:“GC 耗时增大、线程 Block 增多、慢查询增多、CPU 负载高等四个表象,如何判断哪个是根因?”,笔者这里根据自己的经验大致整理了四种判断方法供参考:

  • 时序分析: 先发生的事件是根因的概率更大,通过监控手段分析各个指标的异常时间点,还原事件时间线,如先观察到 CPU 负载高(要有足够的时间 Gap),那么整个问题影响链就可能是:CPU 负载高 -> 慢查询增多 -> GC 耗时增大 -> 线程Block增多 -> RT 上涨。
  • 概率分析: 使用统计概率学,结合历史问题的经验进行推断,由近到远按类型分析,如过往慢查的问题比较多,那么整个问题影响链就可能是:慢查询增多 -> GC 耗时增大 -> CPU 负载高 -> 线程 Block 增多 -> RT上涨。
  • 实验分析: 通过故障演练等方式对问题现场进行模拟,触发其中部分条件(一个或多个),观察是否会发生问题,如只触发线程 Block 就会发生问题,那么整个问题影响链就可能是:线程Block增多 -> CPU 负载高 -> 慢查询增多 -> GC 耗时增大 -> RT 上涨。
  • 反证分析: 对其中某一表象进行反证分析,即判断表象的发不发生跟结果是否有相关性,例如我们从整个集群的角度观察到某些节点慢查和 CPU 都正常,但也出了问题,那么整个问题影响链就可能是:GC 耗时增大 -> 线程 Block 增多 -> RT 上涨。

不同的根因,后续的分析方法是完全不同的。如果是 CPU 负载高那可能需要用火焰图看下热点、如果是慢查询增多那可能需要看下 DB 情况、如果是线程 Block 引起那可能需要看下锁竞争的情况,最后如果各个表象证明都没有问题,那可能 GC 确实存在问题,可以继续分析 GC 问题了。

比如:

  1. IO 交互型: 互联网上目前大部分的服务都属于该类型,例如分布式 RPC、MQ、HTTP 网关服务等,对内存要求并不大,大部分对象在 TP9999 的时间内都会死亡, Young 区越大越好。
  2. MEM 计算型: 主要是分布式数据计算 Hadoop,分布式存储 HBase、Cassandra,自建的分布式缓存等,对内存要求高,对象存活时间长,Old 区越大越好。

应用soa:年轻代越大越好

后台还有定时任务系统,那么这个old区越大越好

java -XX:+PrintFlagsFinal -version | grep ParallelGCThread

通过命令查看参数:java -XX:+PrintFlagsFinal –version | grep 参数关键字,来查看当前参数是否被使用

明确一点

并发标记线程数字只有在 CMS,G1和zgc有使用

      -XX:ParallelGCThreads={value} 这个参数是指定并行 GC 线程的数量,一般最好和 CPU 核心数量相当。默认情况下,当 CPU 数量小于8, ParallelGCThreads 的值等于 CPU 数量,当 CPU 数量大于 8 时,则使用公式:ParallelGCThreads = 8 + ((N - 8) * 5/8) = 3 +((5*CPU)/ 8);同时这个参数只要是并行 GC 都可以使用,不只是 ParNew。

              由于GC操作会暂停所有的应用程序线程,JVM为了尽量缩短停顿时间就必须尽可能地利用更多的CPU资源。这意味着,默认情况下,JVM会在机器的每个CPU上运行一个线程,最多同时运行8个。一旦达到这个上限,JVM会调整算法,每超出5/8个CPU启动一个新的线程。所以总的线程数就是(这里的N代表CPU的数目):ParallelGCThreads = 8 + ((N - 8) * 5/8)               有时候使用这个算法估算出来的线程数目会偏大。如果应用程序使用一个较小的堆(譬如大小为1 GB)运行在一个八颗CPU的机器上,使用4个线程或者6个线程处理这个堆可能会更高效。在一个128颗CPU的机器上,启动83个垃圾收集线程可能也太多了,除非系统使用的堆已经达到了最大上限。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 自己动手写一个滑动验证码组件(后端为Spring Boot项目)
  • 六、 SpringBoot 配置⽂件 ★ ✔【value的引号注意事项、@ConfigurationProperties 、】
  • 进程间通信(下)
  • 【自学安全防御】二、防火墙NAT智能选路综合实验
  • STO SS1 SS2 SLS 安全释义
  • window下tqdm进度条
  • CloudCone服务器2核1G一年只需15刀
  • 领航Linux UDP:构建高效网络新纪元
  • 总结单例模式的写法
  • 掌握Python异步编程:一步一步迈向高效网络应用开发
  • centos7安装mysql-8.0.38-1.el7.x86_64.rpm-bundle.tar
  • 无人机航电系统技术详解
  • 【人工智能】-- 受限玻尔兹曼机
  • nginx代理gitee
  • 工控主板:搭载海光3300处理器的全国产化工控主板
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • ECMAScript入门(七)--Module语法
  • JavaScript 基本功--面试宝典
  • java中具有继承关系的类及其对象初始化顺序
  • Python_网络编程
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 树莓派用上kodexplorer也能玩成私有网盘
  • # AI产品经理的自我修养:既懂用户,更懂技术!
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (2)从源码角度聊聊Jetpack Navigator的工作流程
  • (C++)八皇后问题
  • (二)斐波那契Fabonacci函数
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (十八)三元表达式和列表解析
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • .Net CoreRabbitMQ消息存储可靠机制
  • .NET开源、简单、实用的数据库文档生成工具
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • @Transactional 参数详解
  • []利用定点式具实现:文件读取,完成不同进制之间的
  • [20180129]bash显示path环境变量.txt
  • [BJDCTF2020]EzPHP1
  • [BZOJ1060][ZJOI2007]时态同步 树形dp
  • [C++]类和对象【下】
  • [CareerCup] 17.8 Contiguous Sequence with Largest Sum 连续子序列之和最大
  • [CLIP-VIT-L + Qwen] 多模态大模型源码阅读 - 视觉模型篇
  • [Cloud Networking] Layer Protocol (continue)
  • [Cloud Networking] Layer3 (Continue)
  • [Eclipse] 详细设置护眼背景色和字体颜色并导出
  • [error] 17755#0: *58522 readv() failed (104: Connection reset by peer) while reading upstream
  • [GXYCTF2019]禁止套娃1
  • [IE6 only]关于Flash/Flex,返回数据产生流错误Error #2032的解决方式
  • [IE编程] WebBrowser控件中设置页面的缩放
  • [Java] 什么是IoC?什么是DI?它们的区别是什么?
  • [Jquery] 实现温度计动画效果