CPU瞬间飙升170%问题复盘
CPU瞬间飙升170%问题复盘
- 现象
- 现象描述
- 问题排查思路
- 代码逻辑复杂,导致处理时间过长
- 网络阻塞导致调用时间长(刚开始一直以为的问题)
- 定位线程(网上常用方法)
- 查找问题线程
- 查看dump文件(可跳过)
- 监控堆栈信息
- 总结
现象
做消息转发的服务(业务服务器),当收到一个请求触发时,CPU飙升170%+,导致请求响应时间漫长。
现象描述
问题排查思路
代码逻辑复杂,导致处理时间过长
主业务代码体中加入调用时间日志打印,发现处理时间非常短,排除此项。
网络阻塞导致调用时间长(刚开始一直以为的问题)
测试同区域服务器互ping时间,时间很短,基本排除
定位线程(网上常用方法)
top 查看占用cpu最多的进程号
ps -mp 24939 -o THREAD,tid,time c 查看该进程的线程情况
结果发现两个线程cpu瞬间占用70%+(截图是后边复盘截取,不是当时情况)
查找问题线程
- 挑选TID为24471的线程,查看该线程的堆栈情况,先将线程id转为16进制,使用printf “%x\n” tid命令进行转换
[root@tomcat02 message]# printf "%x\n" 24471
5f97
- 查看进程堆栈信息
[root@tomcat02 message]#jstack 24939 >>java.txt
查找状态为RUNNABLE,线程号为上一步计算后得到的5f97,找到此线程为GC线程,并没有找到想要的业务代码位置信息
查看dump文件(可跳过)
jmap -dump:format=b,file=heap.bin 24939
下载dump文件使用eclips进行分析
说实话,并没有看懂,放弃!
监控堆栈信息
调用接口的时候反复监控堆栈信息
jstack 24939
图片是后边截取的,不是当时情况,仅供参考
发现每次调用都会执行一段redis代码,耗时较长,很是奇怪,打开代码自己看下
@Configuration
public class JedisClusterConfig {@Autowiredprivate RedisProperties redisProperties;public JedisCluster getJedisCluster(){String [] serverArray=redisProperties.getClusterNodes().split(",");Set<HostAndPort> nodes=new HashSet<>();for (String ipPort:serverArray){String [] ipPortPair=ipPort.split(":");nodes.add(new HostAndPort(ipPortPair[0].trim(),Integer.valueOf(ipPortPair[1].trim())));}String redisAuthPass = redisProperties.getRedisAuthPass();return new JedisCluster(nodes,2000, 2000, 6, redisAuthPass, new JedisPoolConfig());}}
发现每次调用redis都是重新初始化redis集群配置,问题大概出来了,正常redis初始化只需程序启动时执行一次,不必每次都执行,按此思路修改代码
@Configuration
public class JedisClusterConfig {@Autowiredprivate RedisProperties redisProperties2;private static JedisCluster jedisCluster = null;private static RedisProperties redisProperties;@PostConstructpublic void init() {redisProperties = redisProperties2;if (jedisCluster==null) {try {jedisCluster = reloadJedisCluster();} catch (Exception e) {e.printStackTrace();}}}private static JedisCluster reloadJedisCluster() throws Exception {System.out.println("初始化实体");JedisCluster cluster = null;String [] serverArray=redisProperties.getClusterNodes().split(",");Set<HostAndPort> nodes=new HashSet<>();for (String ipPort:serverArray){String [] ipPortPair=ipPort.split(":");nodes.add(new HostAndPort(ipPortPair[0].trim(),Integer.valueOf(ipPortPair[1].trim())));}String redisAuthPass = redisProperties.getRedisAuthPass();cluster = new JedisCluster(nodes,2000, 2000, 6, redisAuthPass, new JedisPoolConfig());return cluster;}public JedisCluster getJedisCluster() throws Exception{if (jedisCluster == null) {synchronized (JedisClusterConfig.class) {jedisCluster = reloadJedisCluster();}return jedisCluster;} else {return jedisCluster;}}}
再次部署后问题解决。
总结
如果是接口调用期间导致CPU暴涨,排除掉业务代码逻辑问题后,直接查看堆栈信息,从中找出可能存在问题的地方。
也可能是拦截器中问题导致。(本例)
CPU瞬间飙升170%问题复盘相关推荐
- java 正则 cpu 100_这六个原因真的可以使Java应用程序的CPU使用率飙升到100%吗?...
点击上方的"代码农户的冥想记录",然后选择"设为明星" 高质量文章,及时交付 问题 1. 无限while循环会导致CPU使用率飙升吗? 2.经常使用Young ...
- pe卸载win10更新补丁_Win10更新翻车!CPU使用率飙升,直接损坏SSD,勿升级
你的电脑系统更新了吗?Windows 10在12月更新中又翻车了! 据一位用户在Reddit帖子中指出:"高CPU和磁盘使用率,它发作的时候我甚至无法正常观看流媒体和视频.无奈之下只有卸载了 ...
- java进程cpu使用率高_什么会导致Java应用程序的CPU使用率飙升?
问题 无限循环的while会导致CPU使用率飙升吗? 经常使用Young GC会导致CPU占用率飙升吗? 具有大量线程的应用程序的CPU使用率是否较高? CPU使用率高的应用程序的线程数是多少? 处于 ...
- CPU连续飙升的背后是 “道德的沦丧” 还是 “人性的泯灭”
最近负责的一个老项目CPU时不时的就会飘到90%以上,然后宕掉,这个项目是一个汽车类的商城支持在线下单预约试驾等功能,咨询品牌方说是做了一波投放,但是没有提前通知我们,看了一波日志其实请求量也不是特别 ...
- 记一次CPU突然飙升到 100% 问题排查
线上 CPU 飚高问题该如何定位问题呢? 是因为线程太多,导致上下文切换? 还是因为应用代码中出现了死循环? 还是GC频繁导致 CPU 突然飙升? 该如何入手呢? 首先要知道那些情况会导致 CPU 的 ...
- Android滑屏速度,让安卓手机流畅度瞬间飙升60%,这个小技巧厉害了
原标题:让安卓手机流畅度瞬间飙升60%,这个小技巧厉害了 6月份各大国产手机品牌相继推出自己的旗舰机,华为小米等厂商都推出自己的旗舰机,就连最近几年一直主打中端手机的ov厂商也推出了顶级旗舰机,vov ...
- Java 应用程序的 CPU 使用率飙升原因分析
一. 问题 while 的无限循环是否会导致 CPU 使用率飙升? 频繁的 Young GC 是否会导致 CPU 使用率飙升? 有大量线程的应用程序的 CPU 使用率高吗? CPU 使用率高的应用程序 ...
- 关于CPU使用率飙升,我们需要了解什么?
关注.星标公众号,直达精彩内容 1.CPU 使用率怎么计算? CPU% = (1 - idleTime / sysTime) * 100 idleTime:CPU处于空闲状态的时间 sysTime:C ...
- [MySQL优化案例]系列 — 典型性索引引发CPU负载飙升问题
收到一个mysql服务器负载告警,上去一看,load average都飙到280多了,用top一看,CPU跑到了336%,不过IO和内存的负载并不高,根据经验,应该又是一起索引引起的惨案了. 看下pr ...
最新文章
- Nat. Commun | 预测RNA-蛋白质结合偏好的深度学习框架
- SAP RETAIL 分配表功能的使用
- java stringbuffer原理_String,StringBuilder,StringBuffer 实现原理解析
- mybatisnet - 1 获取 mybatisnet
- 3DSlicer17:Logics
- 微信小程序:页面跳转时传递数据到另一个页面
- javaee 中遇到的jdk自带的异常(Exception)
- java插件化_从零开始实现一个插件化框架(一)
- 《30天自制操作系统》学习笔记--第8天
- 配置 mysql/mariadb sphinxSE 错误解决 1st column must be bigint to accept 64-bit DOCID
- 即时聊天软件开发体会
- 查看本地计算机ip命令,查看你本机的IP信息的命令ipconfig详解【图】
- c语言 -- 三位数的逆序
- 腾讯海外计费系统架构演进
- linux中ps命令输出pid,LINUX使用ps命令获取对应PID
- Redis BitMap结构实现签到、连续签到统计
- OpenGL深入探索——阴影贴图(二)
- Glide之GlideModule
- 学习笔记 -- 证明旋转矩阵为正交阵
- OVAL学习之第二篇