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

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

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

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

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

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

Linux(1) Linux系统线上故障排查的几种技巧_第1张图片

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

top -p 41843。

结果如下:

Linux(1) Linux系统线上故障排查的几种技巧_第2张图片

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

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

top -p 41843 -H

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

Linux(1) Linux系统线上故障排查的几种技巧_第3张图片

由上图明显可以发现,线程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()函数代码如下:

public void test(){  while(true){     for(int i = 0 ;i<100;i++);  }}

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

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

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

最近,我陆续”追“了极客时间的专栏《Linux 性能优化实战》,感觉内容是真的挺硬核,是那种实践性非常强的课,即学即用。

这个专栏大概有 50 讲左右,讲了 Linux 性能的基本指标、工具,以及相应的观测、分析和调优方法,用实际案例贯穿了从应用程序到操作系统的各个组件。

作者倪朋飞是微软的 Azure 资深工程师,有着近 10 年的云计算工作经验,难怪对 Linux 性能优化的知识体系有这么深入的理解。

你可能感兴趣的:(linux)