一个JVM参数,服务超时率降了四分之三

news2024/11/26 18:40:45

先说结论:通过优化Xms,改为和Xmx一致,使系统的超时率降了四分之三

1. 背景

一个同事说他负责的服务在一次上线之后超时率增加了一倍

2. 分析

2.1 机器的监控

首先找了一台机器,看了监控

上线后最明显的变化就是CPU使用率变高了

2.2 上线改动点

上线只加了简单的判断条件,按理不应该导致CPU变高成这样

2.3 CPU使用率随时间变低

又发现了一个奇怪的现象是,在没有上线的情况下,CPU使用率突然降低了,然后就一直保持着很低的状态

CPU降低之后,超时率也有所降低,现在大概能理解超时是和CPU使用率有关的,可能存在CPU瓶颈

2.4 依赖的服务

既然在没有上线的情况下,CPU使用率会降低,肯定有什么因素影响,猜测可能是依赖的服务,但依赖的服务太多,也没办法一个一个去看,哪个调用有问题

2.5 CPU和上线的关系

于是还是想在CPU使用率上找找问题,因为是上线导致的CPU使用率变高,所以看了其他上线时间的CPU使用率

还是有点思路了,发现大部分上线之后CPU使用率是会变高,部分没有(后面知道,因为有的上线本身就是优化,所以CPU使用率也会变低)

2.6 CPU和内存的关系

之前一直在关心CPU,突然看见了内存的使用率,一下就明白的问题所在,从下面这张图可以看出,CPU使用率和内存使用率是成反比的

使用Java的都应该清楚,内存不够的时候,就会STW,然后去启动GC线程去GC,而且一般情况GC线程数和CPU核数是一致的,这个服务也是如此,此时CPU使用率必然是会变高的

上面3月6号CPU突然下降的原因也是因为内存使用变高了,这是在没有上线的情况下

2.7 内存和JVM参数

可以看到上面的图中,CPU使用率高的时候,内存占用只有20%左右,为什么空这这么多内存不用呢?看下JVM参数

-Xmx16g -Xms4g -Xss1024K -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=10 -XX:MetaspaceSize=512m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:ParallelGCThreads=8 -XX:ConcGCThreads=8 -XX:G1HeapRegionSize=16m -XX:-OmitStackTraceInFastThrow

Xms配的是4G,也就是说JVM在启动时只会申请4G内存,当内存不足时,先会GC,当GC释放的内存还不够时,才会去申请更大的内存

这样的策略一般是为了节省内存,但目前主流的都是容器,节省下来的内存也不会给别的服务利用,所以我们这可以直接把Xms改为16G

改完之后立即得到了很好的效果,超时率降了四分之三,不过后续因为内存使用率变高,超过了阈值,所以又把Xmx和Xms调整为14G

3. 总结

  1. Xms配置过小,JVM启动时内存不足导致GC线程占用过多CPU
  2. CPU不足时,超时率增加,CPU充足时,超时率降低
  3. Xms配置和Xmx一样,超时率降低

4. Xms和Xmx

这两个参数使用Java的都比较了解

Xmx: JVM的最大堆内存
Xms: JVM的初始堆内存

4.2 不一致的坏处

  1. 堆内存不够时更频繁的触发GC
  2. 当GC完之后内存也不够时,向系统申请内存,会花费更多的时间

4.2 改为一致的好处

为了避免在生产环境由于heap内存扩大或缩小导致应用停顿,降低延迟,同时避免每次垃圾回收完成后JVM重新分配内存。所以,-Xmx和-Xms一般都是设置相等的

在生产环境中把Xms和Xmx设为相同值也是Oracle官方推荐

5. 感想

这个配置从机器上线跑了两年一直如此,大部分时间性能没被充分利用,现在有二十台机器都是以这样一种低性能模式跑了这么久,这绝对是一种浪费

在第三篇参考文章中,有个人的评论正好和我相反,他认为一开始将Xms和Xmx设置为一样,而实际没用那么多,其实也是一种浪费,不过这是18年前的文章,那时容器没有兴起,服务都在一个物理机上面共享内存,会是有这种问题的

在容器中,节省的内存别的服务也利用不了,所以Xms最后设置和Xmx一致,但是容器也是可能造成浪费的,比如上面我把Xmx和Xms从16G改为14G,从监控上来看耗时和超时率下降了一点,也就是把这个容器的内存往下调一点也是可以接受的,具体调到多少合适也不太确定

不过这种优化很没有必要,内存是很便宜的,而且适量冗余一些性能也可以理解

既然这么多好处,为什么Oracle不默认把Xms和Xmx设置为一致呢,我觉得可能是目前还是有大部分Java应用都不是容器环境,全局考虑,没有这样做,或许后续Java会判断是否是容器环境来自动设置Xms

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

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

相关文章

Redis6之主从复制

主从复制 是指将一台Redis服务器的数据,复制到其他Redis服务器。前者称为主节点,后者称为从节点;数据复制是单向的,只能由主节点复制到从节点;主节点以写为主,从节点以读为主。 特点 1.使用异步复制&#…

VS2019 QT5 第一个项目

(1条消息) VS2017PyQt5环境配置以及第一个HellowPyQt5_vs pyqt_2011老王的博客-CSDN博客 利用工具里的PyUIC5,将ui转为py 选中刚加入的ui文件,工具》PyUIC5 利用工具里的PyUIC5,将ui转为py 选中刚加入的ui文件,工具》PyUIC5 利用…

用Python手动实现一个简单的服务器,不借助任何框架在浏览器中输出任意内容

目录标题 前言主要内容开始我们的代码,先是导入模块为浏览器发送数据的函数创建一个执行函数网站服务启动程序运行代码尾语 前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 在公司网站开发中,我们往往借助于Flask、Django等网站开发框架去提高网站开…

libevent实践03:监听有名管道

首先创建两个管道:p1,p2 lkmaoubuntu:/big/libevent/libevent-2.1.12-stable/_install/learn$ mkfifo p1 p2 lkmaoubuntu:/big/libevent/libevent-2.1.12-stable/_install/learn$ ls -lshF p1 p2 0 prw-rw-r-- 1 lkmao lkmao 0 6月 29 20:39 p1| 0 prw-rw-r-- 1 l…

Blender导出gltf格式ThreeJS不显示问题-

1. 检查代码 import { GLTFLoader } from three/addons/loaders/GLTFLoader.js; 。。。。。。initRoomGltf() {const _this this;// const loader new OBJLoader();const loader new GLTFLoader();// load a resourceloader.load(// resource URL// this.commonFunc.getPat…

【2023年江西省研究生数学建模竞赛】题目三 植物的多样性 建模方案及参考文献

代码与结果如下:完整文档见文末 相关思路请点击这里到原文章查看 2023年江西省研究生数模竞赛题目三:植物的多样性 植物作为食物链中的生产者,通过光合作用吸收二氧化碳,制造氧气,同时为其他生物提供食物和栖息地&a…

(一)创建线程的三种方式

(一)创建线程的三种方式 1.1 线程与进程1.2 创建线程的三种方式01、继承Thread类02、实现Runnable接口03、实现Callable接口 1.3 Question?01、为什么要重写 run() 方法?02、run() 方法和 start() 方法有什么区别?03、…

npm 包 - serve 使用

前端打包后,或者本地的html文件。有时需要将打包好的项目跑一下看看效果,这时就可以使用 serve 工具,在本地启动一个静态文件服务器。本文主要简单记录下 npm 包 serve 的基本使用命令。 一、全局安装 serve npm install serve -g二、运行 s…

php宝塔搭建部署活动现场大屏幕互动系统php源码

大家好啊,我是测评君,欢迎来到web测评。本期给大家带来一套活动现场大屏幕互动系统php源码。抽时间看了一下,功能还是不错的,有参考价值。感兴趣的朋友可以自行下载学习。 技术架构 PHP7.0 nginx mysql5.7 JS CSS HTMLcneto…

【Java】Java核心 82:Git 教程(5)修改撤销

文章目录 08.GIT本地操作-修改撤消目标内容小结 09.GIT本地操作-总结 在Git中,可以使用不同的操作来修改和撤销提交。以下是几种常用的方法: 修改最后一次提交:如果你需要修改最后一次提交的提交信息或者漏掉了某些文件,可以使用…

Linux进程信号【信号保存】

✨个人主页: 北 海 🎉所属专栏: Linux学习之旅 🎃操作环境: CentOS 7.6 阿里云远程服务器 文章目录 🌇前言🏙️正文1、再次认识信号1.1、概念1.2、感性理解1.3、在内核中的表示1.4、sigset_t 信…

安装完MySQL后/var/log/mysqld.log中找不到初始密码

背景:我安装完MySQL后,密码忘记了,然后我又重新装了一次,结果发现重新安装后,/var/log/mysqld.log中找不到初始密码 找初始密码的命令 grep temporary password /var/log/mysqld.log问题原因:再删除MySQL…

matplotlib 更改离散colorbar分界线的宽度和外边框的宽度

1 设置colorbar颜色间隔线的宽度 通过属性dividers设置colorbar颜色间隔线的宽度 # 将drawedges设置为True,从而显示颜色之间的分界线 cbar fig.colorbar(im, axaxs, orientationhorizontal, ticksbins, drawedgesTrue) # 利用属性dividers设置宽度 cbar.divider…

小马识途:全媒体营销是未来营销之道

全媒体营销和整合营销都是广泛应用于市场营销领域的策略,但两者之间还是有一些区别和相似之处的。 全媒体营销和整合营销的相同之处,小马识途营销顾问认为两者都是多渠道整合的营销方式,都强调利用多个渠道和媒体来传播信息,以达到…

循环控制基础

循环控制 Key Point ●for 循环的使用 ●while 循环 ●do...while 循环 ●break 和continue 练习 1. (for 循环)计算123...100 的和 public class Test21 { public static void main(String[] args) { // (for 循环)计算…

我该如何抉择?测试工程师vs测试开发工程师vs开发工程师...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 软件开发工程师&a…

基于Python所写的读者书库设计

点击以下链接获取源码资源: https://download.csdn.net/download/qq_64505944/87964232 《RCQ读者书库》程序使用说明 在PyCharm中运行《RCQ读者书库》即可进入如图1所示的系统主界面。 图1 系统主界面 具体的操作步骤如下: (1)…

智慧校园--webGIS--高德地图

实现地图点击打卡&#xff0c;驾车路线。 需要自己去高德开发平台注册新建自己的项目保存key和秘钥 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"…

测试Hyperledger Fabric环境

首先进入fabric-samples目录中的first-networked 子目录 cd fabric-samples/first-network 在first-network目录下有一个自动化脚本byfn.sh,可以使用-help参数查看相应的可 用命令&#xff0c;在命令提示符中输入如下命令&#xff1a; ./byfn.sh --help命令执行成功后&#…

【运维工程师学习二】OS系统管理

【运维工程师学习二】OS系统管理 1、操作系统管理2、进程管理3、进程的启动4、进程信息的查看4.1、STAT 进程的状态&#xff1a;进程状态使用字符表示的&#xff08;STAT的状态码&#xff09;,其状态码对应的含义&#xff1a;4.2、ps命令常用用法&#xff08;方便查看系统进程&…