谈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=<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 |

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
借助 APISIX Ingress,实现与注册中心的无缝集成
作者张晋涛,API7.ai 云原生技术专家,Apache APISIX PMC 成员,Apache APISIX Ingress Controller 项目维护者。 原文链接 云原生场景下是否需要服务发现 背景 微服务架构是当前最为流行的应用架构之一。 应用被拆分为多个服务组件,通过相互配合共同完成业务的具体逻辑和功能。 随着应用规模的增加和微服务拆分粒度的不同,一套系统内会包含很多个服务组件。 要让这些组件之间可以很好的协同,并且能彼此识别到,通常都需要引入服务注册和发现组件。 之前我们写了一篇文章专门来介绍微服务架构中的服务发现, What Is Service Discovery in Microservices - API7.ai 简单来说,通过引入了服务发现组件,微服务架构中的组件,只需要关注其他组件的名称即可,而无需关注其他组件的部署位置,或者部署 IP 等信息。 通过服务发现组件可以动态的进行获取。 Kubernetes 中的服务发现 在 Kubernetes 环境中,Pod 是最小的调度单元。 而且在 Kubernetes 中,Pod 的 IP 不具备持久性,常常会发生...
- 下一篇
拜占庭将军问题和 Raft 共识算法讲解
作者: 京东物流 郭益如 导读 在分布式系统中, 什么是拜占庭将军问题?产生的场景和解决方案是什么?什么是 Raft 共识算法?Raft 算法是如何解决拜占庭将军问题的?其核心原理和算法逻辑是什么?除了 Raft,还有哪些共识算法?共识问题作为分布式系统的一大难点和痛点,本文主要介绍了其产生的背景、原因,以及通用的 Raft 算法解决方案。 01 拜占庭将军问题 【分布式对等网络中的通信容错问题。 在分布式计算中,不同的计算机通过通讯交换信息达成共识按照一套协作策略行动。有时候,系统中的成员计算机可能出错而发送错误的信息,用于传递信息的通讯网络也可能导致信息损坏,使得网络中不同的成员关于全体协作的策略得出不同结论,从而破坏系统一致性,这就是拜占庭将军问题。 拜占庭将军问题被认为是容错性问题中最难的问题类型之一。】 9 位将军兵分 9 路去打仗,他们各自有权力观测敌情并做出行动判断 —— 进攻或撤退,他们必须行动一致,即所有军队一起进攻或者一起撤退,否则部分进攻部分撤退会造成灾难性后果。 前提: 将军之间只能通过信使互相联系,每位将军将自己的判断发送给其他将军,并接收其他将军发送的判断;...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8
- Mario游戏-低调大师作品
- CentOS7安装Docker,走上虚拟化容器引擎之路