作者:京东零售 刘乐

导读:本篇文章聚焦JVM参数GC线程数的合理配置,从ParallelGCThreads参数含义、参数设置,到参数实验以及修改意见进行解析。

1. ParallelGCThreads参数含义

在讲这个参数之前,先谈谈JVM垃圾回收(GC)算法的两个优化标的:吞吐量和停顿时长。JVM会使用特定的GC收集线程,当GC开始的时候,GC线程会和业务线程抢占CPU时间,吞吐量定义为CPU用于业务线程的时间与CPU总消耗时间的比值。为了承接更大的流量,吞吐量越大越好。

为了安全的垃圾回收,在GC或者GC某个阶段,所有业务线程都会被暂停,也就是STW(Stop The World),STW持续时间就是停顿时长,停顿时长影响响应速度,因此越小越好。

这两个优化目标是有冲突的,在一定范围内,参与GC的线程数越多,停顿时长越小,但吞吐量也越小。生产实践中,需要根据业务特点设置一个合理的GC线程数,取得吞吐量和停顿时长的平衡。

目前广泛使用的GC算法,包括PS MarkSweep/PS Scavenge, ConcurrentMarkSweep/ParNew, G1等,都可以通过ParallelGCThreads参数来指定JVM在并行GC时参与垃圾收集的线程数。该值设置过小,GC暂停时间变长影响RT,设置过大则影响吞吐量,从而导致CPU过高。

2. ParallelGCThreads参数设置

GC并发线程数可以通过JVM启动参数: -XX:ParallelGCThreads=来指定。在未明确指定的情况下,JVM会根据逻辑核数ncpus,采用以下公式来计算默认值:

◦当ncpus小于8时,ParallelGCThreads = ncpus

◦否则 ParallelGCThreads = 8 + (ncpus - 8 ) ( 5/8 )

一般来说,在无特殊要求下,ParallelGCThreads参数使用默认值就可以了。但是在JRE版本1.8.0_131之前,JVM无法感知Docker的CPU限制,会使用宿主机的逻辑核数计算默认值。 比如部署在128核物理机上的容器,JVM中默认ParallelGCThreads为83,远超过了容器的核数。过多的GC线程数抢占了业务线程的CPU时间,加上线程切换的开销,较大的降低了吞吐量。因此JRE 1.8.0_131之前的版本,未明确指定ParallelGCThreads会有较大的风险。

3. ParallelGCThreads参数实验

创建 8C12G 容器,宿主机是128C。模拟线上真实流量,采用相同QPS,观察及对比JVM YoungGC,JVM CPU,容器CPU等监控数据。场景如下:

◦场景1: JVM ParallelGCThreads 默认值,QPS = 420,持续5分钟,CPU恒定在70%

◦场景2: JVM ParallelGCThreads=8,QPS = 420,持续5分钟,CPU恒定在65%

◦场景3: JVM ParallelGCThreads 默认值,QPS瞬时发压到420,前1min CPU持续100%

◦场景4: JVM ParallelGCThreads=8,QPS瞬时发压到420,前2s CPU持续100%,后面回落

从监控数据来看,各场景下CPU差距较明显,特别是场景3和场景4的对比。场景3由于GC线程过多,CPU持续100%时长达1分钟。可以得出以下两个结论:

1.修改 ParallelGCThreads = 8后,同等QPS情况下,CPU会降低5%左右

2.修改 ParallelGCThreads = 8后,瞬间发压且CPU打满情况下,CPU恢复较快

图1: 容器CPU对比图:场景3(上)和场景4(下)





图2: JVM Young GC对比图:场景3(上)和场景4(下)

4. ParallelGCThreads修改建议

ParallelGCThreads配置存在风险的应用,修改方式为以下两种方案(任选一种):

◦升级JRE版本到1.8.0_131以上,推荐1.8.0_192

◦在JVM启动参数明确指定 -XX:ParallelGCThreads=,N为下表的推荐值:

容器核数 2 4 8 16 32 64
推荐值 2 4 8 13 23 43
建议上下界 1~2 2~4 4~8 8~16 16~32 32~64

谈JVM参数GC线程数ParallelGCThreads合理性设置的更多相关文章

  1. poptest老李谈jvm的GC

    poptest老李谈jvm的GC   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:90882 ...

  2. 浅谈并发和tomcat线程数

    假设Tomcat每到固定一个时间会有一个高峰,峰值的并发达到了3000以上,最后的结果是Tomcat线程池满了,日志看很多请求超过了1s. 服务器性能很好,Tomcat版本是7.0.54,配置如下 & ...

  3. 180724-统计JVM进程中线程数两种方式小记

    I. 统计进程中的线程数 相关系列博文推荐: 180711-JVM定位分析CPU性能消耗 180704-JDK常用监控参数 jvm调优的工具介绍 1. proc查询 /proc 目录以可读文本文件形式 ...

  4. JAVA之工作线程数究竟要设置多少

    一.需求缘起 Web-Server通常有个配置,最大工作线程数,后端服务一般也有个配置,工作线程池的线程数量,这个线程数的配置不同的业务架构师有不同的经验值,有些业务设置为CPU核数的2倍,有些业务设 ...

  5. Spark学习之路 (十四)SparkCore的调优之资源调优JVM的GC垃圾收集器

    一.概述 垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计数器.虚拟机栈.本 ...

  6. JVM优化-JVM参数配置

    配置方式: java [options] MainClass [arguments] options - JVM启动参数. 配置多个参数的时候,参数之间使用空格分隔. 参数命名: 常见为 -参数名 参 ...

  7. 关键业务系统的JVM参数推荐(2018仲夏版) (强烈推荐 唯品会)

    年更贴,因为两年里遇到的事情,一些想法变了.也补充了不少VJTools的内容,比如为伸手党们准备的jvm-options.sh. 在关键的业务系统里,除了继续追求技术人员最爱的高吞吐与低延时之外,系统 ...

  8. 关键系统的JVM参数推荐

    1. 性能篇 1.1 建议的性能参数 1. 取消偏向锁: -XX:-UseBiasedLocking JDK1.6开始默认打开的偏向锁,会尝试把锁赋给第一个访问它的线程,取消同步块上的synchron ...

  9. jvm参数设置和性能调优

    1.Java虚拟机运行时的数据区 2.常用的内存区域调节参数 -Xms:初始堆大小,默认为物理内存的1/64(<1GB):默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40% ...

  10. 第十章 常用的JVM参数记录

    GC -XX:+PrintGC   打印GC日志 -XX:+PrintGCDetails   打印详细的GC日志 -Xloggc:/var/gc.log   将GC日志打印在根目录的var文件夹下的g ...

随机推荐

  1. 实例讲解FusionInsight MRS RTD 实时决策引擎在医保行业应用

    摘要: 通过引入FusionInsight RTD实时决策系统,实现医保费用事前预防.事中控制.事后审核的全流程管理 本文分享自华为云社区<FusionInsight MRS RTD 实时决策引 ...

  2. 一图解析MySQL执行查询全流程

    摘要:当我们希望MySQL能够以更高的性能运行查询时,最好的办法就是弄清楚MySQL是如何优化和执行查询的. 本文分享自华为云社区<mysql执行查询全流程解析>,作者:breakDraw ...

  3. vue2升级vue3: Event Bus 替代方案

    在看 https://v3-migration.vuejs.org/breaking-changes/events-api.html 在vue2里面 In 2.x, a Vue instance co ...

  4. JS遍历循环方法性能对比:for/while/for in/for of/map/foreach/every

    这周codeReview例会,又遇到map与foreach到底谁问题.单独图方便,我会选择用map一个函数搞定一切.但是从语义的角度来讲,如果只是单纯遍历,还是推荐选择foreach.其实formap ...

  5. Axure 创建轮播图

    拖一个动态面板,设置名称 双击动态面板,添加3个状态 给3个状态,分别添加3张图片 设置交互 新建交互 -> 载入时 -> 设置面板状态 双击进去,界面看得直观些 下一项.向后循环,循环间 ...

  6. Codeforces Round #716 (Div. 2) A ~ D 个人题解

    补题链接:Here 1514A. Perfectly Imperfect Array 题意:给定长度为 \(n\) 的 \(a\) 序列,请问是否存在子序列积不存在平方根 思路:子序列的话,一个元素也 ...

  7. Spring自带的Objects等工具类(减少繁琐代码)

    断言: AssertUtils assert 关键字在 JDK1.4 中引入,可通过 JVM 参数-enableassertions开启 SpringBoot 中提供了 Assert 断言工具类,通常 ...

  8. vue3组件el-dialog提取

    父组件: 1 <template> 2 <div class="auto-wrap"> 3 <div class="content-left ...

  9. element的table组件在flex布局下宽度不能自适应

    问题描述 用了flex布局,左侧固定宽度,右侧flex:1:(表格在右侧区域),且中间容器都有width:100%,当将屏幕变大,表格随着变宽,当屏幕变小时,表格不会随着屏幕变小,宽度无法自适应. 解 ...

  10. d3生成器--line,area,diagonal

    https://blog.csdn.net/qq_31396185/article/details/78147612