Linux系统线上故障排查的几种技巧

无论是开发还是运维,和 Linux 打交道是每个技术人的日常。然而,性能优化、故障排查也是软件系统中最有挑战的工作之一,甭管看了多少资料和书,一旦涉及到解决具体问题,照样儿一脸懵逼,比如:

流量高峰期,服务器 CPU 使用率过高报警,你登录 Linux 上去 top 完之后,却不知道怎么进一步定位,到底是系统 CPU 资源太少,还是程序并发部分写得有问题? 系统并没有跑什么吃内存的程序,但在敲完 free 命令之后,却发现已经没什么内存了,到底是哪里占用了内存?为什么? 一大早就收到 Zabbix 告警,你发现某台存放监控数据的数据库主机 CPU 的 I/O Wait 较高,该怎么办?

下面,介绍几个 CPU 使用率过高的排查技巧:

1、通过top命令定位占用cpu高的进程

执行top命令得到以下结果:

Linux系统线上故障排查的几种技巧

通过上图可以明显看出进程PID41843占用cpu过高,明显存在问题,定位到了进程id。当然如果你想只观察进程PID41843的CPU和内存以及负载情况,可以使用以下命令

top -p 41843 

结果如下:

Linux系统线上故障排查的几种技巧

2、通过top命令定位问题进程中每个线程占用cpu情况

通过问题进程中每个线程占用cpu情况使用可以使用如下命令:

top -p 41843 -H 

查看进程PID41843的每一个线程占用CPU情况,如图。

Linux系统线上故障排查的几种技巧

由上图明显可以发现,线程PID41892CPU占用率***,接下来定位该线程的代码是否出现异常导致cpu占用过高。

3、通过jstack 命令定位问题代码

上一步发现PID41892占用的CPU过高,就将这个PID转换成16进制,易知,PID41892转化成16进制为a3a4。使用如下命令命令定位问题代码:

jstack 41892 | grep a3a4 

输出如下:

"Thread" prio=10 tid=0x00007f950043e000 nid=0x54ee in test(); 

可以分析得到: 线程Thread下的wait()函数cpu使用率很高,查看源代码中的test()函数代码如下:

Linux系统线上故障排查的几种技巧

while循环无法结束,一直抢占cpu,导致程序cpu使用过高,修改代码即可。

当然了,除了cpu以外,还有很多其它问题,这种类似的排查经验只能从实践中总结,原理书是不会告诉你这些的。几年前,我自己学习那会儿也看了不少书,尝试从网上找过些零零散散的资料。但说真的,Linux 性能优化是个系统工程,除了要学习那些基础知识点之外,还有 2 点比较重要:

掌握性能优化的思路和方法,尝试大量 Linux 性能工具 从学习到输出,说白了就是不断实践,从实践中总结经验