[转帖]谈 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并不会增加,或者增加不明显,同时请求的响应时间却大幅增加.这个阀值我们认为是最佳线程数. 为 ...
随机推荐
- java进行数据库操作的并发控制的2种方法
本文分享自华为云社区<java进行数据库操作的并发控制>,作者:张俭. 在现代应用编码中,从数据库里面find出来,进行一些业务逻辑操作,最后再save回去.即: Person perso ...
- AppCube视角浅析: 艾瑞咨询《2022年中国低代码行业研究报告》
摘要:近日,艾瑞咨询发布了<2022年中国低代码行业研究报告>,报告从企业数字化发展背景.低代码的发展路径.应用渗透.市场规模等方面进行深入研究分析,并洞察了发展趋势. 本文分享自华为云社 ...
- KubeEdge发布云原生边缘计算威胁模型及安全防护技术白皮书
摘要:本文将基于KubeEdge项目详细分析云原生边缘计算业务过程的威胁模型并给出对应的安全加固建议. 本文分享自华为云社区<KubeEdge发布云原生边缘计算威胁模型及安全防护技术白皮书> ...
- 跟我读论文丨ACL2021 NER 模块化交互网络用于命名实体识别
摘要:本文是对ACL2021 NER 模块化交互网络用于命名实体识别这一论文工作进行初步解读. 本文分享自华为云社区<ACL2021 NER | 模块化交互网络用于命名实体识别>,作者: ...
- 使用 Kubeadm 部署 Kubernetes(K8S) 安装 -- 持久化存储(NFS网络存储)
使用 Kubeadm 部署 Kubernetes(K8S) 安装 使用 Kubeadm 部署 Kubernetes(K8S) 安装 -- Ingress-Ngnix Volume 是 Pod 中能够被 ...
- SpringBoot Jar 包太大 瘦身 【终极版】
思路,将依赖的第三方jar包,移到启动jar包个面外部加载 jar 包 SpringBoot Jar 包太大 瘦身 [初试]简单应用 SpringBoot Jar 包太大 瘦身 [终极版],建议使用这 ...
- Codeforce:Good Bye 2020 个人题解
题面链接:Here 代码提交:Here 年终彩蛋 1466A. Bovine Dilemma 题意是:给定一个固定点(0,1),然后给定n个在x轴的点,求面积不同的三角形个数 简单思考一下就容易发现这 ...
- 活动回顾|阿里云云原生 Serverless 技术实践营 深圳站回放&PPT下载
11月24日"阿里云云原生 Serverless 技术实践营"深圳站圆满落幕.活动受众以关注 Serverless 技术的开发者.企业决策人.云原生领域创业者为主,活动形式为演讲 ...
- 2 Englishi 词根
11 mis 错 misuse misfortune misunderstand 12 out 超过: 外 outnumber outspend outdoor 13 over 过度 overprai ...
- vue动态组件使用