CPU瞬间飙升170%问题复盘

  • 现象
    • 现象描述
  • 问题排查思路
    • 代码逻辑复杂,导致处理时间过长
    • 网络阻塞导致调用时间长(刚开始一直以为的问题)
    • 定位线程(网上常用方法)
    • 查找问题线程
    • 查看dump文件(可跳过)
    • 监控堆栈信息
  • 总结

现象

做消息转发的服务(业务服务器),当收到一个请求触发时,CPU飙升170%+,导致请求响应时间漫长。

现象描述

问题排查思路

代码逻辑复杂,导致处理时间过长

主业务代码体中加入调用时间日志打印,发现处理时间非常短,排除此项。

网络阻塞导致调用时间长(刚开始一直以为的问题)

测试同区域服务器互ping时间,时间很短,基本排除

定位线程(网上常用方法)

top 查看占用cpu最多的进程号
ps -mp 24939 -o THREAD,tid,time c 查看该进程的线程情况

结果发现两个线程cpu瞬间占用70%+(截图是后边复盘截取,不是当时情况)

查找问题线程

  1. 挑选TID为24471的线程,查看该线程的堆栈情况,先将线程id转为16进制,使用printf “%x\n” tid命令进行转换
[root@tomcat02 message]# printf "%x\n" 24471
5f97
  1. 查看进程堆栈信息
[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%问题复盘相关推荐

  1. java 正则 cpu 100_这六个原因真的可以使Java应用程序的CPU使用率飙升到100%吗?...

    点击上方的"代码农户的冥想记录",然后选择"设为明星" 高质量文章,及时交付 问题 1. 无限while循环会导致CPU使用率飙升吗? 2.经常使用Young ...

  2. pe卸载win10更新补丁_Win10更新翻车!CPU使用率飙升,直接损坏SSD,勿升级

    你的电脑系统更新了吗?Windows 10在12月更新中又翻车了! 据一位用户在Reddit帖子中指出:"高CPU和磁盘使用率,它发作的时候我甚至无法正常观看流媒体和视频.无奈之下只有卸载了 ...

  3. java进程cpu使用率高_什么会导致Java应用程序的CPU使用率飙升?

    问题 无限循环的while会导致CPU使用率飙升吗? 经常使用Young GC会导致CPU占用率飙升吗? 具有大量线程的应用程序的CPU使用率是否较高? CPU使用率高的应用程序的线程数是多少? 处于 ...

  4. CPU连续飙升的背后是 “道德的沦丧” 还是 “人性的泯灭”

    最近负责的一个老项目CPU时不时的就会飘到90%以上,然后宕掉,这个项目是一个汽车类的商城支持在线下单预约试驾等功能,咨询品牌方说是做了一波投放,但是没有提前通知我们,看了一波日志其实请求量也不是特别 ...

  5. 记一次CPU突然飙升到 100% 问题排查

    线上 CPU 飚高问题该如何定位问题呢? 是因为线程太多,导致上下文切换? 还是因为应用代码中出现了死循环? 还是GC频繁导致 CPU 突然飙升? 该如何入手呢? 首先要知道那些情况会导致 CPU 的 ...

  6. Android滑屏速度,让安卓手机流畅度瞬间飙升60%,这个小技巧厉害了

    原标题:让安卓手机流畅度瞬间飙升60%,这个小技巧厉害了 6月份各大国产手机品牌相继推出自己的旗舰机,华为小米等厂商都推出自己的旗舰机,就连最近几年一直主打中端手机的ov厂商也推出了顶级旗舰机,vov ...

  7. Java 应用程序的 CPU 使用率飙升原因分析

    一. 问题 while 的无限循环是否会导致 CPU 使用率飙升? 频繁的 Young GC 是否会导致 CPU 使用率飙升? 有大量线程的应用程序的 CPU 使用率高吗? CPU 使用率高的应用程序 ...

  8. 关于CPU使用率飙升,我们需要了解什么?

    关注.星标公众号,直达精彩内容 1.CPU 使用率怎么计算? CPU% = (1 - idleTime / sysTime) * 100 idleTime:CPU处于空闲状态的时间 sysTime:C ...

  9. [MySQL优化案例]系列 — 典型性索引引发CPU负载飙升问题

    收到一个mysql服务器负载告警,上去一看,load average都飙到280多了,用top一看,CPU跑到了336%,不过IO和内存的负载并不高,根据经验,应该又是一起索引引起的惨案了. 看下pr ...

最新文章

  1. Nat. Commun | 预测RNA-蛋白质结合偏好的深度学习框架
  2. SAP RETAIL 分配表功能的使用
  3. java stringbuffer原理_String,StringBuilder,StringBuffer 实现原理解析
  4. mybatisnet - 1 获取 mybatisnet
  5. 3DSlicer17:Logics
  6. 微信小程序:页面跳转时传递数据到另一个页面
  7. javaee 中遇到的jdk自带的异常(Exception)
  8. java插件化_从零开始实现一个插件化框架(一)
  9. 《30天自制操作系统》学习笔记--第8天
  10. 配置 mysql/mariadb sphinxSE 错误解决 1st column must be bigint to accept 64-bit DOCID
  11. 即时聊天软件开发体会
  12. 查看本地计算机ip命令,查看你本机的IP信息的命令ipconfig详解【图】
  13. c语言 -- 三位数的逆序
  14. 腾讯海外计费系统架构演进
  15. linux中ps命令输出pid,LINUX使用ps命令获取对应PID
  16. Redis BitMap结构实现签到、连续签到统计
  17. OpenGL深入探索——阴影贴图(二)
  18. Glide之GlideModule
  19. 学习笔记 -- 证明旋转矩阵为正交阵
  20. OVAL学习之第二篇

热门文章

  1. ALLEGRO的约束规则的设置教程,手把手教你!
  2. 测试独立显卡显存好坏的软件,显卡显存测试小软件(Artifact Tester)
  3. Vue接入Google Adsense
  4. IDA静态动态逆向分析基础
  5. BS与CS的联系与区别
  6. 内存优化之一——内存优化工具参数详解
  7. 基于Yocto构建嵌入式Linux系统U-boot、kernel内核、rootfs文件系统
  8. 解决模拟器不能上网问题
  9. 【有利可图网】小白设计师该如何创作电商广告Banner图?内附精华教程
  10. 微软认证系统管理员MCSA(院校IT课程)