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

jvm,参数,gc,线程,parallelgcthreads,合理性,设置 · 浏览次数 : 36

小编点评

## 概述 这篇文章解释了 JVM 参数 `ParallelGCThreads` 的含义、设置方法和实验结果,旨在帮助开发者合理配置该参数。 **主要内容:** 1. **`ParallelGCThreads` 参数含义:** * `ParallelGCThreads` 参数用于指定并行垃圾收集线程的数量。 * 两个优化标点在 GC 进程中平衡: * 吞吐量:业务线程 CPU 时间与总 CPU 时间的比值。 * 停顿时长:GC 暂停整个应用的持续时间。 * 两个目标是有冲突的,在一定范围内,参与 GC 的线程数越多,停顿时长越小,但吞吐量也越小。 2. **`ParallelGCThreads` 参数设置:** *可以通过 `-XX:ParallelGCThreads=` 参数设置 GC 并行线程数。 * 默认值为 `ncpus`,其中 `ncpus` 是逻辑核数。 * JRE 版本 1.8.0_131之前无法感知 Docker CPU 限制,使用逻辑核数计算默认值。 3. **`ParallelGCThreads` 参数实验:** * 创建 8C12G 容器,模拟线上真实流量。 * 观察不同场景下 JVM CPU、容器CPU 和系统CPU 的变化。 * 发现修改 `ParallelGCThreads` 参数后,瞬间发压时 CPU 恢复速度更快。 4. **结论:** * 修改 `ParallelGCThreads` 参数可以降低 CPU 使用量,但需要根据实际需求进行调整。 * 建议在 JRE 版本 1.8.0_131 或更高版本中使用 `-XX:ParallelGCThreads=` 参数明确指定线程数。 ## 参考资料 * 文章原文 * JRE 参数说明

正文

作者:京东零售 刘乐

导读:本篇文章聚焦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恢复较快

3-9.png

10.png

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

11.png
12.png
图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合理性设置相似的内容:

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

作者:京东零售 刘乐 导读:本篇文章聚焦JVM参数GC线程数的合理配置,从ParallelGCThreads参数含义、参数设置,到参数实验以及修改意见进行解析。 1. ParallelGCThreads参数含义 在讲这个参数之前,先谈谈JVM垃圾回收(GC)算法的两个优化标的:吞吐量和停顿时长。JV

[转帖]谈 JVM 参数 GC 线程数 ParallelGCThreads 合理性设置

https://my.oschina.net/u/4090830/blog/7926038 1. ParallelGCThreads 参数含义 在讲这个参数之前,先谈谈 JVM 垃圾回收 (GC) 算法的两个优化标的:吞吐量和停顿时长。JVM 会使用特定的 GC 收集线程,当 GC 开始的时候,GC

谈JVM xmx, xms等内存相关参数合理性设置

吞吐量和停顿时长,这两个优化目标是有冲突的。那么有没有可能提高吞吐量而不影响停顿时长,甚至缩短停顿时长呢?答案是有可能的,提高内存占用(Memory Footprint)就有可能。

谈了千百遍的数据一致性

今天来说一个老生常谈的问题,来看一个实际案例:业务中往往都会通过缓存来提高查询效率,降低数据库的压力,尤其是在分布式高并发场景下,大量的请求直接访问Mysql很容易造成性能问题。

再谈量化策略失效的问题

更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流。 如何判断量化策略是否失效 我们在交易量化策略的时候,经常会遇到量化策略出现持续性的回撤。此时,必须考虑一种情况,即正在交易的策略可能失效了。于是,我们的首要工作是,判断这个量化策略是否失效。 判断量化交易

再谈23种设计模式(3):行为型模式(学习笔记)

行为型模式的关注点在于对象之间的通信和职责分配(描述结构模型中对象的动态特征)。行为型模式关注的是对象之间的交云和协作,即它们是如何相互作用的,以及如何分配职责和算法来完成任务。

不谈虚的,平台即产品真的有那么好吗?

随着信息技术的高速发展,我们每隔一段时间就能看到一个热门术语在各大平台被分析和讨论。当我们上搜索引擎搜索相关词条,就会找到大量与该技术优势、亮点相关的文章。特别是“平台即产品”(PaaP)策略,其在实际应用中的利用价值和效用性成为近期关注的焦点。 虽然构建数字平台以促进协作和创新的理念听起来颇具前景

再谈http请求调用(Post与Get),项目研发的核心一环

支持.Net Core(2.0及以上)与.Net Framework(4.0及以上) 【目录】 前言 Post请求 Get请求 与其它工具的比较 1【前言】 http请求调用是开发中经常会用到的功能。 在内,调用自有项目的Web Api等形式接口时会用到;在外,调用一些第三方功能接口时,也会用到,因

再谈vue中的differ算法

Differ算法 在 Vue 中,当数据变化时,Vue 会使用 Virtual DOM 和 diff 算法来尽可能地减少 DOM 操作的次数,以提高性能。 diff 算法是 Virtual DOM 实现中的核心算法之一,其主要作用是比较新旧虚拟 DOM 树的差异,并将差异应用到真实的 DOM 树上。

[转帖]陈巍谈芯:一图看懂芯片禁令的目的、范围和影响

https://zhuanlan.zhihu.com/p/572905835 陈巍谈芯:让你一图看懂某国芯片禁令的目的、范围和影响。 感觉这回是“芯片战争”,影响全球半导体产业链。但也是有方法减少影响的。