CPU高负载排查小技巧(2分钟速读版),细心的优化可能为公司节省一个亿!

女主宣言

服务优化是一个细心、漫长的过程,一个很小的优化不仅可以为用户带来更稳定更快速的互联网体验,也许还会为公司降低百万以上的成本。熟练掌握服务端排错技巧,已经是“匠心工程师”的标配技能。这篇CPU排错小技巧,希望能够帮助到大家。

PS:丰富的一线技术、多元化的表现形式,尽在“HULK一线技术杂谈”,点关注哦!


前言

为了能够支撑大并发并且合理的利用机器资源,一台服务器部署了n个tomocat的java微服务、或者是同时开启了多个端口的fastcgi,这些其实都是很正常的操作。但是往往会出现某一个实例的某个方法的执行,导致cpu负载非常高从而引发报警。当然,很多同学的第一想法就是“扩容”,于是便找到OPS的兄弟“给我扩xx台机器”,浪费了资源先不说,但是这样往往解决不了实质性的问题,毕竟不是可以无限扩容机器的。那么我们怎么排查此类问题做好优化工作呢?今天就给大家举例说明,希望同学们get这个小技能后多多使用,不断磨练自己的程序,说不定你的耐心优化,就会为公司节省1个亿的小目标!


640?wx_fmt=png

步骤

步骤一:找到最耗CPU的进程

工具:top

方法

  1. 执行top -c ,显示进程运行信息列表;

  2. 键入P (大写p),进程按照CPU使用率排序;


640?wx_fmt=png

如上图,最耗CPU的进程PID为18154


步骤二:找到最耗CPU的线程

工具:top

方法:

  1. top -Hp 18154 ,显示一个进程的线程运行信息列表

  2. 键入P (大写p),线程按照CPU使用率排序


640?wx_fmt=png

如上图,进程18154内,最耗CPU的线程PID为15259


步骤三将线程PID转化为16进制

工具:printf

方法

640?wx_fmt=png

如上图,15259对应的16进制是0x3b9b,当然,这一步可以用计算器

之所以要转化为16进制,是因为堆栈里,线程id都是用16进制表示的。


步骤四查看堆栈,找到线程在干嘛

工具:pstack/jstack/grep

方法:jstack -F 15259 | grep ‘0x3b9b’

  1. 打印进程堆栈

  2. 通过线程id,过滤得到线程堆栈


640?wx_fmt=png

如上图,找到了耗CPU高的线程对应的线程名称“main”方法,以及看到了该线程正在执行代码的堆栈。


步骤五打印的结果看起来不是很明显,那我们就直接jstack写到文件

工具:jstack

方法:jstack -l 15259 > 15259.stack

  1. 打印进程堆栈

  2. 通过线程id找到15259.stack,然后通过0x3b9b搜索


640?wx_fmt=png


总结

服务优化是一个细心、漫长的过程,一个很小的优化不仅可以为用户带来更稳定更快速的互联网体验,也许还会为公司降低百万以上的成本。熟练掌握服务端排错技巧,已经是“匠心工程师”的标配技能。这篇CPU排错小技巧,希望能够帮助到大家,多用多用,体会一下系统调优的乐趣。最后附上一张图,每个系统排错、优化的命令等待着你去发掘。



640?wx_fmt=png

HULK一线技术杂谈

由360云平台团队打造的技术分享公众号,内容涉及云计算数据库大数据监控泛前端自动化测试等众多技术领域,通过夯实的技术积累和丰富的一线实战经验,为你带来最有料的技术分享

640?wx_fmt=gif
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值