生产环境出现CPU占用过高,请谈谈你的分析思路和定位

假如生产环境出现CPU占用过高,请谈谈你的分析思路和定位

记一次印象深刻的故障?

常见的cpu飙高原因:

​ 1、CAS 自旋一直重试导致 cpu 飙高 没有控制自旋次数;

​ 2、死循环

​ 3、Redis 被注入挖矿程序,建议 Redis 端口不要能够被外网访问;

​ 4、服务器被 DDOS 工具导致 cpu 飙高,可以通过限流、ip 黑名单、图形验证码防止机器模拟攻击等

​ 5、不合理的使用线程。如:创建线程池的方式也是核心线程数、最大线程数是一样的,导致一些空闲的线程也得不到回收;这样会有很多无意义的资源消耗。

​ 由此我们知道在发生这类问题其解决关键就是找到发生cpu飙升的进程 --> 通过进程找到占用率最高的线程 --> 通过该线程找到对应的业务逻辑从而优化代码解决。

1、使用top命令找出CPU占比最高的

image-20230507172456928

2、ps -ef 或者 jps 进一步定位,得知是一个怎么样的后台程序出的问题

image-20230507173404326

3、定位到具体线程或者代码

ps -mp 进程  -o THREAD,tid,time

参数解释

  • -m:显示所有的线程
  • -p:pid进程使用CPU的时间
  • -o:该参数后是用户自定义格式

下图3929便是造成cpu过高的十进制线程id

image-20200326173656164

4、将需要的线程ID转换为16进制格式(英文小写格式)

因为线程在内存中跑是16进制的,所以需要执行如下的命令把上面得到的十进制的线程id(3929)转换成16进制。当然也可以用计算器转换。

printf "%x\n" 有问题的线程ID #\n表示换行

image-20230507181626696

十进制的3929转为十六进制为f59

5、jstack 进程ID | grep tid(16进制线程ID小写英文) -A60

这张图是之前截得,有点问题,线程id应该为上面的f59的,不是13ee的。

image-20200326174107444

这样便可以精准定位到错误的地方。

6、总结

这里总结个解决问题的思路,当然有不同的解决方案。

参考:
一次生产 CPU 100% 排查优化实践
cpu 飙高的问题解决

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值