京东神灯文档:JVM参数GC线程数ParallelGCThreads合理性设置

news2025/1/12 12:21:01

目录

1. ParallelGCThreads参数含义

2. ParallelGCThreads参数设置

3. ParallelGCThreads参数实验

4. ParallelGCThreads扫描结果

5. 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参数实验

使用LF 10区创建 8C12G 容器(11.152.29.22),宿主机是128C(11.127.156.110)。模拟线上真实流量,采用相同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.

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

图2: JVM Young GC对比图:场景3(上)和场景4(下)

4. ParallelGCThreads扫描结果

泰山应用健康度临时扫描了线上JAVA应用的ParallelGCThreads配置情况,统计数据如下表:

0/1级应用

1487(49%)

678(22%)

541(18%)

330(11%)

3036

2/3级应用

3505(32%)

1836(17%)

3704(34%)

1925(18%)

10970

所有应用

4992(36%)

2514(18%)

4245(30%)

2255(16%)

14006

其中:

参数设置正常:JRE版本大于等于1.8.0_131,或者手动指定了合理的GC线程参数值

参数设置有风险:GC线程参数未指定且JRE版本低,或指定的值过大

参数设置疑似风险:参数未指定,但JRE版本未知,有风险的概率较大(目前约60%的应用JRE版本低于1.8.0_131)

风险状态未知:解析GC线程参数失败

数据来源:UMP上报、应用配置文件解析

用户可以在泰山平台-应用健康度的应用tab下的JVM配置项中,查看当前应用各个分组使用的JRE版本,以及ParallelGCThreads配置情况(目前未配置未提示风险,用户需对比JRE版本判断风险)。个别应用如未接入UMP或者线程数显示解析失败,可以通过查看配置文件的JVM启动参数来确定是否配置ParallelGCThreads参数,JRE版本可以查看部署镜像获取。

5. ParallelGCThreads修改建议

ParallelGCThreads配置存在风险的应用,修改方式为以下两种方案(任选一种):

◦升级JRE版本到1.8.0_131以上,推荐1.8.0_192

◦在JVM启动参数明确指定 -XX:ParallelGCThreads=<N>,N为下表的推荐值:

推荐值

2

4

8

13

23

43

建议上下界

1~2

2~4

4~8

8~16

16~32

32~64

非原创,转载至京东神灯文档:JVM参数GC线程数ParallelGCThreads合理性设置

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/24753.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ERP (SAP) Integrator Delphi Edition

ERP (SAP) Integrator Delphi Edition ERP(SAP)Integrator支持RFC和SAP服务&#xff0c;并允许开发人员轻松编写桌面、服务器和移动应用程序。它提供了一种连接到SAP R/3和NetWeaver系统的简单方法&#xff0c;并使应用程序能够进行远程功能调用&#xff0c;以便向这些远程功能…

SQL Server 卸载和安装

在莫不知名链接下载sql失败了&#xff0c;然就几天变化&#xff0c;让我从sql Server2019到2022了&#xff0c; 首先讲一下卸载吧&#xff0c;很简单一共就5步&#xff0c; 先停止服务&#xff0c;有关sql server的相关服务全部停止&#xff0c;再进入控制面板 > 卸载程序…

解决:Uncaught (in promise) TypeError: Failed to fetch 的问题

1、问题展示&#xff1a; 其一、报错的代码信息为&#xff1a; Access to fetch at .......... from origin ................. has been blocked by CORS policy: Response to preflight request doesnt pass access control check: Redirect is not allowed for a preflight…

HashSet和HashMap

目录 一、HashSet 1、HashSet简单介绍 2、HashSet的常用方法 3、HashSet保证元素不重复的原理 二、HashMap 1、HashMap简单介绍 2、HashMet的常用方法 3、使用LinkedHashMap集合保证元素添加顺序 三、HashSet和HashMap的区别和联系 1、区别 2、联系 一、HashSet 1、Has…

Web3 入门教程 1 —— 认知篇

如果你也喜欢Web3&#xff0c;希望在这做些有趣的、有意义的事情&#xff0c;那么我希望这篇文章可以帮助到你。 其实在很早之前&#xff0c;我就计划写一篇《Web3 新手教程》&#xff0c;送给想要进入 Web3 或者刚刚进入 Web3 的小伙伴&#xff0c;但是考虑到两点原因&#xf…

力扣 53. 最大子数组和 --- C语言求解

题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 题解&#xff1a; 此题可以用动态规划和分治法。 方法1. 动态…

《深度学习进阶 自然语言处理》第七章:seq2seq介绍

文章目录7.1 seq2seq模型介绍7.1.1 seq2seq的原理7.1.2 时序数据转换简单举例7.2 seq2seq模型实现7.3 seq2seq模型改进7.3.1 反转输入数据(Reverse)7.3.2 偷窥(Peeky)7.4 seq2seq模型的应用7.5 总结之前文章链接&#xff1a; 开篇介绍&#xff1a;《深度学习进阶 自然语言处理…

MySQL Hash Join前世今生

GreatSQL社区原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本&#xff0c;使用上与MySQL一致。作者&#xff1a;nw MySQL Hash Join前世今生 因工作需要&#xff0c;对MySQL Hash Join的内部实现做了一些探索和实践&#x…

【Hack The Box】linux练习-- Mango

HTB 学习笔记 【Hack The Box】linux练习-- Mango &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月17日&#x1f334; &#x1f36…

01 基于yum方式部署Kubernetes集群

文章目录1.实验环境准备2.部署单节点的etcd1.在192.168.221.133节点安装etcd服务2.修改etcd的配置文件3.启动etcd并设置开机自启动4.检查集群的健康状态5.操作etcd服务3. master 组件部署1.在192.168.221.133节点安装master服务2.配置apiserver组件3.配置master的组件4.启动服务…

m基于MIMO中继通信和非规则LDPC编译码的matlab仿真,其中波束形成为SVD,MMSE,中继包括AF,DF,CF

目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 即在非规则LDPC下&#xff0c;且源节点1个&#xff0c;中继一个&#xff0c;目标节点一个&#xff0c;天线也是1的情况对比三种中继协作协议的误码率。 做非规则LDPC码的以编码协作形…

computed计算方法不被调用的原因;只有在使用时才会被调用

目录 一、问题 二、解决方法 三、总结 一、问题 1.需求&#xff1a;根据组件外部一个变量的值来确定 组件内部的操作。组件外部可以更改filetime的值&#xff0c;filetime有值时这个界面可以操作&#xff0c;否则不可以操作。 我一想 用computed就可以了呀&#xff0c;动态…

Rockwell EDI 850 采购订单报文详解

罗克韦尔&#xff08;Rockwell&#xff09;自动化(中国)有限公司(NYSE: ROK)是全球最大的致力于工业自动化与信息化的公司&#xff0c;致力于帮助客户提高生产力&#xff0c;以及世界可持续发展。罗克韦尔自动化总部位于美国威斯康星州密尔沃基市&#xff0c;在全球80多个国家设…

超级明星们的人物化身 NFT 将来到 The Sandbox 元宇宙

超级明星队 NFT 将在 The Sandbox 的全球运动村体验中亮相&#xff01; ​ The Sandbox 与 Web3 公司 Forj 达成合作&#xff0c;还获得了独特的 BAYC 无聊猿人物化身的授权。 NFTSTAR 在 The Sandbox 建造了新的体验&#xff0c;巴西足球明星内马尔&#xff08;Neymar JR.&am…

高项 质量管理论文

三个过程 项目质量管理包括执行组织确定质量政策、目标与职责的各过程和活动&#xff0c;从而使项目满足其预定的需求。项目质量管理在项目环境内使用政策和程序&#xff0c;实施组织的质量管理体系&#xff1b;并以执行组织的名义&#xff0c;适当支持持续的过程改进活动。项目…

【408专项篇】C语言笔记-第五章(一维数组与字符数组)

第五章&#xff1a;一维数组与字符数组 第一节&#xff1a;一维数组 1. 数组的定义 C语言提供的数组&#xff0c;通过一个符号来访问多个元素。 特点&#xff1a; 具有相同的数据类型。使用过程中需要保留原始数据。 数组是构造数据类型。所谓数组&#xff0c;是指一组具…

深入理解Python生成器和yield

深入理解Python生成器和yield 我在《Python性能优化指南–让你的Python代码快x3倍的秘诀》中有提到&#xff0c;在处理大文件或大数据集时用生成器可以提高性能。很多朋友会问&#xff1a;“为什么用生成器就能提升性能呢&#xff1f;”。今天&#xff0c;我就带大家深入看一…

Web2 vs. Web3,社交工具的发展会有什么变化?

社交&#xff0c;是不同主体传递、反馈社会信息的主要方式之一。从古代的飞鸽传书、近代的书信往来&#xff0c;到现代大家手机里都必不可少的社交 APP&#xff0c;人们对于社交的需求和实现方式都在不断更新和变化。 当前&#xff0c;Web2 社交赛道已经非常成熟。为吸引更多流…

前端文件流相关

XMLHttpRequest // XMLHttpRequest对象用于与服务器交互 // XMLHttpRequest可以在不刷新页面的情况下请求特定URL, 获取数据 // XMLHttpRequest属性responseType是一个枚举字符串值, 用于指定响应中包含的数据类型 // 如果将 responseType的值设置为空字符串, 则使用 text 作为…

Linux网络编程基础

Linux网络编程基础一、基础概念的介绍1.1 网卡的介绍1.2 mac地址 六个字节 48位1.3 ip地址 32位 四个字节 ipv41.4 端口二、网络模型2.1 OSI七层模型2.2 TCP/IP模型2.3 协议2.4 网络通信过程2.4 arp协议2.5 网络设计模式一、基础概念的介绍 1.1 网卡的介绍 1.2 mac地址 六个字…