无论是开发还是运维,与Linux打交道是每个技术人的日常。然而,性能优化和故障排除也是软件系统中最具挑战性的任务之一。不管你看过多少资料和书籍,一旦涉及到解决具体问题,你还是会一头雾水,比如:在流量高峰期,服务器CPU使用率过高而发出告警。登录linux后进入top,不知道如何进一步定位。是系统CPU资源太少,还是程序的并发部分有问题?系统没有运行任何消耗内存的程序,但是在输入free命令后,发现没有内存了。内存占用在哪里?为什么?一大早收到Zabbix告警,发现某存储监控数据的数据库主机CPUI/OWait高。我应该怎么办?下面介绍几种CPU占用率高的排查技巧:1、使用top命令定位CPU占用率高的进程。执行top命令得到如下结果:从上图可以明显看出进程PID41843占用CPU过高。很明显有问题,已经定位到进程id了。当然,如果只想观察进程PID41843的CPU、内存和负载情况,可以使用如下命令top-p41843,结果如下:2、使用top命令定位各个线程的CPU使用情况在问题进程中使用问题进程中各个线程的CPU使用率可以使用如下命令:top-p41843-H查看进程PID41843的各个线程的CPU使用率,如图。从上图可以明显看出线程PID41892的CPU占用率最高,再定位是不是这个线程的代码异常导致CPU占用率过高。3.使用jstack命令定位问题代码。上一步发现PID41892占用CPU太高,所以将PID转成16进制。很容易知道PID41892转成16进制变成a3a4。使用如下命令定位问题代码:jstack41892|grepa3a4输出如下:"Thread"prio=10tid=0x00007f950043e000nid=0x54eeintest();可以分析得到:线程Thread下wait()函数的cpu使用率很高,查看源码。test()函数的代码如下:while循环无法结束,一直占用cpu,导致程序占用cpu过多,修改代码即可。当然,除了CPU还有很多其他的问题。这种类似排错的经验只能从实践中总结,原理书不会告诉你这些。几年前,我在自学的时候,也看了很多书,也试着从网上找了一些零散的资料。不过说实话,Linux性能优化是一个系统工程。除了学习那些基础知识点外,还有两个比较重要的点:掌握性能优化的思路和方法,从学习到输出尝试大量的Linux性能工具。说白了就是Keeppracticing,在实践中总结经验
