首页 > 其他分享 >谈JVM参数GC线程数ParallelGCThreads合理性设置

谈JVM参数GC线程数ParallelGCThreads合理性设置

时间:2023-02-17 12:51:16浏览次数:50  
标签:场景 线程 JVM ParallelGCThreads GC CPU

作者:京东零售 刘乐

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恢复较快

谈JVM参数GC线程数ParallelGCThreads合理性设置_默认值

谈JVM参数GC线程数ParallelGCThreads合理性设置_垃圾回收_02

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

谈JVM参数GC线程数ParallelGCThreads合理性设置_参数设置_03

谈JVM参数GC线程数ParallelGCThreads合理性设置_参数设置_04

图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,ParallelGCThreads,GC,CPU
From: https://blog.51cto.com/u_15714439/6063968

相关文章

  • AGC061C
    AGC061C答案为什么不是\(2^n\),因为有可能选择不同的左右端点可能会导出相同的排列。考虑把一种选择刻画为\(01\)序列\(a_i\),\(a_i=0\)表示选择左端点,\(a_i=1\)表示......
  • agc061_c 容斥+dp
    题意有两个长度为\(n\)的严格递增序列\(A_i,B_i\),满足\(\foralli\len,A_i<B_i\),且\(A_i\)和\(B_i\)的所有元素恰好取遍\(1-2n\)。现在有一个队列,对于\(1\)......
  • SpringCloudGateway启动报错解决
    报错启动项目后报错,提示如下2023-02-1621:51:35.786ERROR[main]o.s.boot.diagnostics.LoggingFailureAnalysisReporter.report:40-***************************APP......
  • GC
    GC的基础知识1.什么是垃圾C语言申请内存:mallocfreeC++:newdeletec/C++手动回收内存Java:new?自动内存回收,编程上简单,系统不容易出错,手动释放内存,容易出两种类型......
  • Serial,Parallel,CMS,G1四大GC收集器特点小结
    1.Serial收集器一个单线程的收集器,在进行垃圾收集时候,必须暂停其他所有的工作线程直到它收集结束。特点:CPU利用率最高,停顿时间即用户等待时间比较长。适用场景:小型应用通过......
  • Hystrix + OpenFeign+ SpringCloud +Nacos
      注意:2023年2月 springcloud最新版本不支持nacos2.2和hystrix,测试发现以下这个版本还支持<groupId>org.springframework.cloud</groupI......
  • linux系统(centos7)安装gcc命令包(解压缩版)
    linux系统(centos7)安装gcc命令包(解压缩版)一、如果执行gcc–version出现以下信息,表示已经安装过gcc,可以跳过该步骤:[boco@CDH-143spark_job_monitor]$gcc--versiongcc......
  • jmeter的阶梯式加压性能测试 jp@gc - Stepping Thread Group (deprecated)
    当测试需求要求是阶梯型的压力测试场景时,使用该线程组。比如测试场景是  从100并发开始,每60s加压50并发,直至达到目的并发数(中途发现问题随时停掉),之后保持每60s停止50......
  • 阶梯场景jp@gc - Stepping Thread Group (deprecated)
    1、新建线程,添加配置元件、监听器  由上可见:需要启动100个线程,然后间隔30s就持续5s去启动10个线程,那么就需要这样重复操作10次,才能100个线程全部启动。最后整体10......
  • 4. JVM
    JVM的内存区域,即运行时数据区域。线程私有的:程序计数器虚拟机栈本地方法栈线程共享的:堆方法区直接内存Java内存模型(JMM),Happens-Before规则。JVM内存结构和Ja......