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

系统 Linux
流量高峰期,服务器 CPU 使用率过高报警,你登录 Linux 上去 top 完之后,却不知道怎么进一步定位,到底是系统 CPU 资源太少,还是程序并发部分写得有问题?

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

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

[[260916]]

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

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

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

 

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

 

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

  1. top -p 41843 

结果如下:

 

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

 

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

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

  1. top -p 41843 -H 

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

 

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

 

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

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

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

  1. jstack 41892 | grep a3a4 

输出如下:

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

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

 

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

 

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

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

  • 掌握性能优化的思路和方法,尝试大量 Linux 性能工具
  • 从学习到输出,说白了就是不断实践,从实践中总结经验
责任编辑:武晓燕 来源: 今日头条
相关推荐

2013-04-10 13:52:23

2020-10-20 17:15:05

Java故障排查命令

2014-05-09 14:33:35

2020-05-18 07:50:47

线上故障排查

2022-04-18 09:07:54

Linux网络延迟

2018-10-08 09:44:51

无线AP故障

2021-08-31 10:45:28

故障内存问题排查

2017-03-24 09:50:00

2021-07-14 13:50:51

Linux命令文件

2019-08-19 14:51:56

Linux 系统 数据

2023-12-05 07:12:39

优化排查性能

2018-03-01 19:40:44

Linux运维常见问题

2024-08-14 14:20:00

2018-11-26 08:40:43

2013-05-16 09:11:15

系统故障故障排查

2022-02-07 15:12:17

系统日志定位

2022-09-26 23:36:33

Linux系统CPU

2022-04-25 11:27:34

LinuxCPU

2014-05-08 11:21:22

Linux应用程序排查故障

2010-09-07 09:35:22

点赞
收藏

51CTO技术栈公众号