记一次服务cpu爆高异常
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/linzhiqiang0316/article/details/90738839
这几天进行架构整改,将业务服务话,然后单独部署,但是有一台服务的运行时,cpu特别高,基本都是90%以上,导致服务的消费能力特别差。这种级别bug,简直是一种噩梦,但还是必须得解决。
发现问题:
1.服务部署到linux之后,通过top命令观察服务的cpu和内存使用情况
我们可以很明显的看到,在java进程中cpu使用率超级高,所以我们需要进一步的排查,是java进程中哪一个线程导致cpu如此高负载的。
2.通过如下命令,我们可以查看java进程是因为哪一个线程引起的。
ps -mp 23615 -o THREAD,tid,time
printf "%xn" 线程号
jstack 进程号|grep 16进制异常线程号 -A90
我们可以很明显的看到,最耗费性能的是gc垃圾回收线程引起的,这说明jvm在垃圾回收可能很频繁。
3.通过命令查看jvm垃圾回收情况
jstat -gc 2592 5000
通过命令,我们可以很明显的看到YGC都没发生,FGC一直在叠加,说明老年代回收频率特别高,这也是cpu爆高的最终原因。
解决方案:
既然问题已经找到了,那我们应该如何解决呢?
从上面的问题可以得出应该是jvm参数配置有误,导致频繁的full gc,新生代回收基本没用到,所以我们需要调整jvm的参数,让full gc少发生,新生代得到充分使用,从而降低cpu占用率。
下面是博主我针对上面的问题,调优而成的配置:
-Xmx3000M
最大堆内存
-Xms3000M
最小堆内存
-Xmn600M
年轻代大小
-XX:PermSize=500M
设置持久代(perm gen)初始值
-XX:MaxPermSize=500M
设置持久代最大值
-Xss256K
每个线程的堆栈大小
-XX:+DisableExplicitGC
关闭System.gc()
-XX:SurvivorRatio=1
Eden区与Survivor区的大小比值
-XX:+UseConcMarkSweepGC
使用CMS内存收集
-XX:+UseParNewGC
设置年轻代为并行收集
-XX:+CMSParallelRemarkEnabled
降低标记停顿
-XX:+UseCMSCompactAtFullCollection
在FULL GC的时候, 对年老代的压缩
-XX:CMSFullGCsBeforeCompaction=0
多少次后进行内存压缩
-XX:+CMSClassUnloadingEnabled
垃圾回收会清理持久代,移除不再使用的classes
-XX:LargePageSizeInBytes=128M
内存页的大小
-XX:+UseFastAccessorMethods
原始类型的快速优化
-XX:+UseCMSInitiatingOccupancyOnly
使用手动定义初始化定义开始CMS收集
-XX:CMSInitiatingOccupancyFraction=70
使用cms作为垃圾回收,使用70%后开始CMS收集
-XX:SoftRefLRUPolicyMSPerMB=0
每兆堆空闲空间中SoftReference的存活时间
-XX:+PrintClassHistogram
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintHeapAtGC
-Xloggc:log/gc.log
应用上述的配置,服务的cpu和内存占有率下降了一大截,稳定性也得到很大的提高,gc回收频率大大降低了。
备注:
因为上述截图,是配置生效之后的数据,所以可能不准确。 参考地址:https://www.cnblogs.com/zexu-cheng/p/5079826.html
- 剑指OFFER之包含min函数的栈(九度OJ1522)
- 使用VS2010开发Qt程序的一点经验
- 用Qt写软件系列五:一个安全防护软件的制作(3)
- 剑指OFFER之顺时针打印矩阵(九度OJ1391)
- 用Qt写软件系列五:一个安全防护软件的制作(2)
- 2018年值得关注的200场机器学习会议
- Linux开机启动(bootstrap)
- 剑指OFFER之树的子结构(九度OJ1520)
- 万物智联慧结成网:信息技术驱动物流产业转型升级
- 用Qt写软件系列五:一个安全防护软件的制作(1)
- Linux文件管理
- 为什么区块链会成为消除数字化营销障碍的解决方案
- TinyOS和Deluge的安装模拟(二)
- Kubernetes的服务网格(第4部分):通过流量切换持续部署
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Head First设计模式——状态模式
- Head First设计模式——代理模式
- [Maven]告警[WARNING] Unable to create Maven project from repository.
- Head First设计模式——复合模式
- [System.currentTimeMillis]/[Calendar.getInstance().getTimeInMillis()]/[new Date().getTime()]
- 【每日一题】32. Longest Valid Parentheses
- 面经手册 · 第3篇《HashMap核心知识,扰动函数、负载因子、扩容链表拆分深度学习(+实践验证)》
- Head First设计模式——桥接模式
- Head First设计模式——生成器模式和责任链模式
- Head First设计模式——蝇量模式和解释器模式
- 【每日一题】33. Search in Rotated Sorted Array
- 【每日一题】34. Find First and Last Position of Element in Sorted Array
- 【每日一题】35. Search Insert Position
- Head First设计模式——原型模式和访问者模式
- Java 新特性前瞻:封印类