作者:京东零售 刘乐

导读:本篇文章聚焦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. Unity3D 导出的apk进行混淆加固、保护与优化原理(防止反编译)

    ​ Unity3D 导出的apk进行混淆加固.保护与优化原理(防止反编译) 目录 前言: 准备资料: 正文: 1:打包一个带有签名的apk 2:对包进行反编译 3:使用ipaguard来对程序进行加固 ...

  2. App备案与iOS云管理式证书 ,公钥及证书SHA-1指纹的获取方法

    iOS 备案查看信息 iOS平台Bundle ID 公钥 证书SHA-1指纹 IOS平台服务器域名 获取 Bundle ID: 或者 https://developer.apple.com/accou ...

  3. 【已解决】无法打开.xlsx文件,xlrd.biffh.XLRDError: Excel xlsx file; not supported

    原因是最近xlrd更新到了2.0.1版本,只支持.xls文件.所以x1 = xlrd.open_workbook("data.xlsx")会报错. 可以安装旧版xlrd,在cmd中 ...

  4. ElasticSearch 分组聚合统计

    统计总数: GET mytest-statistics/_search { "size": 0, "query": { "bool": { ...

  5. 2018年蓝桥杯B组C/C++国赛题解

    1.换零钞 x星球的钞票的面额只有:100元,5元,2元,1元,共4种. 小明去x星旅游,他手里只有2张100元的x星币,太不方便,恰好路过x星银行就去换零钱. 小明有点强迫症,他坚持要求200元换出 ...

  6. SpringCloud学习 系列一、 前言-为什么要学习微服务

    系列导航 SpringCloud学习 系列一. 前言-为什么要学习微服务 SpringCloud学习 系列二. 简介 SpringCloud学习 系列三. 创建一个没有使用springCloud的服务 ...

  7. 二、mongo集群搭建

    系列导航 一.linux单机版mongo安装(带密码验证) 二.mongo集群搭建 三.java连接mongo数据库 四.java对mongo数据库增删改查操作 五.mongo备份篇 mongoexp ...

  8. 我让 ChatGPT 化身为全知全能的文档小助理,啥姿势她都会......

    ChatGPT 虽然只是一个对话型人工智能,但已经震惊了全世界,有人甚至认为人工智能的奇点已经到来.未来一定会有很多人失业,从工业革命开始,每出现一次重大的技术变革,就必然会有一批人失业,我们要直面现 ...

  9. freeswitch号码变化方案

    概述 freeswitch是一款简单易用的开源音视频软交换平台. 在生产环境中,由于各个线路的号码规则并不统一,经常需要针对中继线路做号码变换的方案. 本文主要介绍fs中有哪些可选的号码变换方案. 环 ...

  10. SNMP 使用总结

    转载请注明出处: 1.SNMP简介 SNMP(Simple Network Management Protocol,简单网络管理协议)是一种用于网络设备和系统的管理协议.它允许网络管理员监控和管理网络 ...