Linux下常用系统分析工具总结
对于程序员来说,整个计算机系统由四个重要的模块组成,分别是:CPU,磁盘,内存,网络。在我们的程序或者系统出现问题时,我们应该分别有一定先后顺序的对这四块进行排查。而在Linux系统下,有很多高效的工具,可以帮助我们分析定位问题。本文对于Linux下常用的一些工具进行一些简单的介绍,帮助读者能对这些工具有一个初步的了解。如果有不对的地方,欢迎随时指正交流。
1.CPU
1.1 top
top命令可以实时动态地查看系统的整体运行情况,是一个综合了多方信息监测系统性能和运行信息的实用工具。
前五行是系统整体的统计信息。第一行是任务队列信息,第二行和第三行为进程和CPU的信息,最后两行为内存信息。下面对一些比较重要的参数进行说明。
Load average:0.60,0.94,1.04。load average表示系统在过去1分钟5分钟15分钟的任务队列的平均长度。这个值越大就表示系统CPU越繁忙。
Cpu(s):5.0%us(用户空间占用的cpu百分百),3.9%sy(系统空间占用的cpu百分比),0.0%ni(用户进程空间内改变过优先级的用户占用的cpu百分比),90.9%id(空闲cpu的百分比),0.2%wa(等待输入输出cpu的百分比)。
Mem:817280k buffers(用作内核缓存的内存量)。
Swap:磁盘交换区容量。
1.2 strace
strace可以跟踪到一个进程产生的系统调用,包含参数、返回值、执行消耗的时间。
例如执行 strace cat /dev/null,会得到如下输出:
每一行都是一条系统调用,等号左边是系统调用的函数名及其参数,右边是该调用的返回值。如果你知道你要找的是什么,你可以让strace只跟踪一些类型的系统调用。例如你需要看看在loadconfigure脚本里面执行的程序里面系统调用ececve的调用情况,则只需要输入这样一条shell命令:
strace -f -o loadconfigure-strace.txt -e execve ./loadconfigure
再例如,我们知道ActLogicSvr的进程号是16789,则可以执行strace -p 16789 -c来统计ActLogicSvr在某一段时间系统调用的统计情况。结果如下所示:
这里很清楚的告诉你调用了那些系统函数,调用次数多少,消耗了多少时间等等这些信息,这个对我们分析一个程序来说是非常有用的。
1.3 Perf
perf是Linux的性能调优工具。perf工具的常用命令包括top,record,report等。perf top命令用来显示程序运行的整体状况。该命令主要用来观察整个系统当前的状态,比如可以通过查看该命令的输出来查看当前系统最耗时的内核函数或某个用户进程。Perf stat的运行效果如下:
perf record命令则用来记录指定事件在程序运行过程中的信息,而Perf report命令则用来报告基于前面record命令记录的事件信息生成的程序运行状况报告。我们通常用命令perf record -g -p pid将进程在命令运行期间的各项指令运行所占CPU的比例存在perf.data里面(-g表示记录函数之间的调用关系)。再用perf report --call-graph --stdio将刚刚的统计结果展示出来。
perf record带-g选项时,perf report的运行效果:
perf record不带-g选项时,perf report的运行效果:
1.4 vmstat
vmstat是一个很全面的性能分析工具,可以观察到系统的进程状态、内存使用、虚拟内存使用、磁盘的 IO、中断、上下问切换、CPU使用等。
vmstat的输出如下:
2.内存
2.1 valgrind
valgrind 是在Linux程序中广泛使用的调试应用程序。它尤其擅长发现内存管理的问题,可以检查程序运行时的内存泄漏问题等。我们在使用valgrind时也主要用到它的内存泄漏检测功能,即memcheck功能。它检查所有对内存的读/写操作,并截取所有的malloc/new/free/delete调用。因此memcheck工具能够探测到以下问题:
LOG信息输出:
Memcheck工具的相关选项:
示例:
valgrind --leak-check=
full /usr/local/app/taf/tafnode/data/TenFortune.WeChatProxySvr/bin/WeChatProxySvr
--config=
/usr/local/app/taf/tafnode/data/TenFortune.WeChatProxySvr/conf/TenFortune.WeChatProxySvr.config.conf -trace-child=yes
执行的结果:
3.磁盘
3.1 iotop
iotop命令是一个用来监视磁盘I/O使用状况的top类工具。iotop具有与top相似的UI,其中包括PID、用户、I/O、进程等相关信息。Linux下的IO统计工具如iostat,nmon等大多数是只能统计到per设备的读写情况,如果你想知道每个进程是如何使用IO的就比较麻烦,使用iotop命令可以很方便的查看。
iotop的执行效果:
4.网络
4.1 netstat命令
netstat命令用来打印Linux中网络系统的状态信息,可让你得知整个Linux系统的网络情况。
netstat的常用的选项如下:
在这里我们简单复习一下TCP三次握手和四次挥手的过程,便于下面解释netstat中tcp的各种状态。
TCP三次握手的过程如下:
(1)主动连接端发送一个SYN包给被动连接端;
(2)被动连接端收到SYN包后,发送一个带ACK的SYN包给主动连接端。
(3)主动连接端发送一个带ACK标志的包给被动连接端,握手动作完成。
TCP的四次挥手过程如下:
(1)主动关闭端发送一个FIN包给被动关闭端。
(2)被动关闭端收到FIN包后,发送一个ACK包给主动关闭端。
(3)被动关闭端发送了ACK包后,再发送一个FIN包给主动关闭端。
(4)主动关闭端收到FIN包后,发送一个ACK包。当被动关闭端收到ACK后,四次挥手动作完成,连接断开。
下面我们解释一下netstat中tcp连接对应的各种状态。
(1)LISTEN:侦听状态,等待远程机器的连接请求。
(2)SYN_SEND:在TCP三次握手期间,主动连接端发送了SYN包后,进入SYN_SEND状态,等待对方的ACK包。
(3)SYN_RECV:在TCP三次握手期间,主动接收端收到SYN包后,进入SYN_RECV状态。
(4)ESTABLISHED:完成TCP三次握手后,主动连接端进入ESTABLISHED状态。此时,TCP连接已经建立,可以进行通信。
(5)FIN_WAIT_1:在TCP四次挥手时,主动关闭端发送FIN包后,进入FIN_WAIT_1状态。
(6)FIN_WAIT_2:在TCP四次挥手时,主动关闭端收到ACK包后,进入FIN_WAIT_2状态。
(7)TIME_WAIT:在TCP四次挥手时,主动关闭端发送了ACK包之后,进入TIME_WAIT状态,等待最多2MSL时间,让被动关闭端收到ACK包。
(8)CLOSING:在TCP四次挥手期间,主动关闭端发送了FIN包后,没有收到对应的ACK包,却收到了对方的FIN包,此时进入CLOSING状态。
(9)CLOSE_WAIT:在TCP四次挥手期间,被动关闭端收到FIN包后,进入CLOSE_WAIT状态。
(10)LAST_ACK:在TCP四次挥手时,被动关闭端发送FIN包后,进入LAST_ACK状态,等待对方的ACK包。
netstat -te(显示出所有的tcp连接)执行起来的效果如下:
4.2 lsof
lsof命令用于查看进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。在使用TCP的UDP的时候,系统在后台都为该应用程序分配了一个文件描述符。无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。
lsof的使用示例如下:
Lsof的常用方法:
(1)lsof abc.txt:查看所有打开了文件abc.txt的进程。
(2)lsof -p pid:显示进程打开的所有的文件。
4.3 tcpdump
tcpdump可以将网络中传送的数据包完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。
tcpdump的常用参数:
tcpdump的常见用法:
【推荐阅读】
添加极客助手微信,加入技术交流群
长按,扫码,关注公众号