59

CPU 高负载排查小技巧

 5 years ago
source link: https://mp.weixin.qq.com/s/rOZh0gOCJ1QsEjCIIcbM9w?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

女主宣言

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

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

前言

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

r6rYVf3.jpg!web

步骤

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

工具:top

方法:

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

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

aABFraj.png!web

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

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

工具:top

方法:

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

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

yYZrEjB.png!web

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

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

工具:printf

方法:

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

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

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

工具:pstack/jstack/grep

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

  1. 打印进程堆栈

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

MfuYFrI.png!web

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

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

工具:jstack

方法:jstack -l 15259 > 15259.stack

  1. 打印进程堆栈

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

总结

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

r6rYVf3.jpg!web

HULK一线技术杂谈

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

e6reEb2.gif

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK