[转帖]谈 JVM 参数 GC 线程数 ParallelGCThreads 合理性设置
https://my.oschina.net/u/4090830/blog/7926038
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=<N> 来指定。在未明确指定的情况下,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>,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 合理性设置的更多相关文章
- poptest老李谈jvm的GC
poptest老李谈jvm的GC poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:90882 ...
- 浅谈并发和tomcat线程数
假设Tomcat每到固定一个时间会有一个高峰,峰值的并发达到了3000以上,最后的结果是Tomcat线程池满了,日志看很多请求超过了1s. 服务器性能很好,Tomcat版本是7.0.54,配置如下 & ...
- 180724-统计JVM进程中线程数两种方式小记
I. 统计进程中的线程数 相关系列博文推荐: 180711-JVM定位分析CPU性能消耗 180704-JDK常用监控参数 jvm调优的工具介绍 1. proc查询 /proc 目录以可读文本文件形式 ...
- JAVA之工作线程数究竟要设置多少
一.需求缘起 Web-Server通常有个配置,最大工作线程数,后端服务一般也有个配置,工作线程池的线程数量,这个线程数的配置不同的业务架构师有不同的经验值,有些业务设置为CPU核数的2倍,有些业务设 ...
- Spark学习之路 (十四)SparkCore的调优之资源调优JVM的GC垃圾收集器
一.概述 垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计数器.虚拟机栈.本 ...
- JVM优化-JVM参数配置
配置方式: java [options] MainClass [arguments] options - JVM启动参数. 配置多个参数的时候,参数之间使用空格分隔. 参数命名: 常见为 -参数名 参 ...
- 关键业务系统的JVM参数推荐(2018仲夏版) (强烈推荐 唯品会)
年更贴,因为两年里遇到的事情,一些想法变了.也补充了不少VJTools的内容,比如为伸手党们准备的jvm-options.sh. 在关键的业务系统里,除了继续追求技术人员最爱的高吞吐与低延时之外,系统 ...
- 关键系统的JVM参数推荐
1. 性能篇 1.1 建议的性能参数 1. 取消偏向锁: -XX:-UseBiasedLocking JDK1.6开始默认打开的偏向锁,会尝试把锁赋给第一个访问它的线程,取消同步块上的synchron ...
- jvm参数设置和性能调优
1.Java虚拟机运行时的数据区 2.常用的内存区域调节参数 -Xms:初始堆大小,默认为物理内存的1/64(<1GB):默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40% ...
- Tomcat设置最佳线程数总结
最佳线程数: 性能压测的情况下,起初随着用户数的增加,QPS会上升,当到了一定的阀值之后,用户数量增加QPS并不会增加,或者增加不明显,同时请求的响应时间却大幅增加.这个阀值我们认为是最佳线程数. 为 ...
随机推荐
- 让“物”能说会道,揭晓华为云IOT黑科技
什么是物联网?如何让"物"说话? 如今是一个万物互联的时代,物联网已经成为一个高大上的名词,那什么是物联网呢?从人与人之间的连接来看,指的是人们之间的通话.视频.进入智能时代以后, ...
- 划重点!DWS开发的五大要点
摘要:高效使用数据库是一个合格的开发工程师的必备技能,如何使用DWS进行高效开发,提升应用效率,技术干货来喽~~~ 高效使用数据库是一个合格的开发工程师的必备技能,如何使用DWS进行高效开发,提升应用 ...
- 华为云GuassDB(for Redis)发布全新版本推出:Lua脚本和SSL连接加密
摘要:9月8日,华为云GuassDB(for Redis)正式推出全新版本.新版本内核带来性能提升.无损升级.慢日志统计等多维度产品体验,同时推出Lua脚本和SSL连接加密两大重要功能,让业务设计更加 ...
- ipa文件怎么安装到iPhone手机上?
ipa文件怎么安装到iPhone手机上? 无需越狱帮你把ipa文件安装到苹果手机上 E86苹果签名简介:点击可查看 很多人都知道apk文件是安卓的app应用程序文件名,但有人知道苹果ios的app ...
- 直播实时数仓基于DataLeap开放平台在发布管控场景的业务实践
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 背景 业务背景 随着字节业务的高速增长,业务场景越来越丰富,业务基于数据做的决策也越来越多,对数据的时效性要求也越 ...
- 多种方式实现 Future 回调返回结果
JDK 实现 public class FutureTest { public static void main(String[] args) throws Exception { Executor ...
- MVCC多版本并发控制和幻读问题的解决
首先我们先介绍一下锁的分类,再进入今天的正题. 一.锁分类: 1.从性能上分:乐观锁.悲观锁.乐观锁(用版本号对比或CAS机制)适用于读比较多的场景,悲观锁适用于写比较多的场景.如果在写比较多的场景使 ...
- AI 黑科技,老照片修复,模糊变高清
大家好 最近闲逛,发现腾讯开源的老照片修复算法新出了V1.3的预训练模型,手痒试了一下. 我拿"自己"的旧照片试了一下,先看效果 GFPGAN FPGAN算法由腾讯PCG ARC实 ...
- Vue3--使用脚手架创建一个vue应用,实现todolist
一.安装脚手架,运行项目 1.1 安装,运行 首先安装 16.0 或更高版本的 Node.js 然后在cmd安装并执行 create-vue 它是 Vue 官方的项目脚手架工具 npm init vu ...
- 查看公网出口ip
curl cip.cc curl http://members.3322.org/dyndns/getip curl icanhazip.com curl ident.me curl ifconfig ...