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 合理性设置的更多相关文章

  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. Tomcat设置最佳线程数总结

    最佳线程数: 性能压测的情况下,起初随着用户数的增加,QPS会上升,当到了一定的阀值之后,用户数量增加QPS并不会增加,或者增加不明显,同时请求的响应时间却大幅增加.这个阀值我们认为是最佳线程数. 为 ...

随机推荐

  1. 解读 SSDB、LevelDB 和 RocksDB 到 GaussDB(for Redis) 的迁移

    摘要:本期将详细介绍 SSDB.LevelDB 和 RocksDB 到 GaussDB(for Redis)的迁移. 本文分享自华为云社区<华为云PB级数据库GaussDB(for Redis) ...

  2. 自然语言处理 Paddle NLP - 机器同传技术及应用-理论

    基础 自然语言处理(NLP) 自然语言处理PaddleNLP-词向量应用展示 自然语言处理(NLP)-前预训练时代的自监督学习 自然语言处理PaddleNLP-预训练语言模型及应用 自然语言处理Pad ...

  3. PyCharm View as Array 查看数组

    代码中设置断点. 在Debug Variables 里面,点击 View as Array 如下图所示:

  4. IDEA 报 Unable to import maven project: See logs for details

    用的apache-maven-3.6.2 报错,解决方法:降级成 apache-maven-3.6.1 版本 IDEA 报 Unable to import maven project: See lo ...

  5. Java 网络编程 —— ServerSocket 详解

    构造 ServerSocket ServerSocket 的构造方法有以下几种重载形式 ServerSocket() throws IOException ServerSocket(int port) ...

  6. STM32CubeMX教程15 ADC - 多重ADC转换

    1.准备材料 开发板(正点原子stm32f407探索者开发板V2.4) STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) ST-LINK ...

  7. 【flask】蓝图的使用方式 g对象的使用 flask配置数据库连接池

    目录 上节回顾 今日内容 1 蓝图的使用 2 g对象 g对象 vs request对象 3 数据库连接池 上节回顾 全局request对象.线程会处理请求,确保线程中的数据不错乱. django_se ...

  8. Codeforce1343C. Alternating Subsequence

    Recall that the sequence b is a a subsequence of the sequence a if b can be derived from a by removi ...

  9. Codeforces Round #664 题解(A ~ C)

    1395A - Boboniu Likes to Color Balls 如果在r,b,g,w中小于或等于一个奇数,则可以将其定为回文. 否则,请进行一次操作(如果可以),然后检查上述情况. 进行多次 ...

  10. Problem 1342B - Binary Period (思维)

    AC代码: #include<bits/stdc++.h> using namespace std; int main() { //freopen("in.txt", ...