有时候会遇到一些疑难杂症,并且监控插件并不能一眼立马发现问题的根源。这时候就需要登录服务器进一步深入分析问题的根源。那么分析问题需要有一定的技术经验积累,并且有些问题涉及到的领域非常广,才能定位到问题。所以,分析问题和踩坑是非常锻炼一个人的成长和提升自我能力。如果我们有一套好的分析工具,那将是事半功倍,能够帮助大家快速定位问题,节省大家很多时间做更深入的事情。
套用 5W2H 方法,可以提出性能分析的几个问题
针对应用程序,我们通常关注的是内核 CPU 调度器功能和性能。
线程的状态分析主要是分析线程的时间用在什么地方,而线程状态的分类一般分为:
如果大量时间花在 CPU 上,对 CPU 的剖析能够迅速解释原因;如果系统时间大量处于 off-cpu 状态,定位问题就会费时很多。但是仍然需要清楚一些概念:
说明:
//查看系统cpu使用情况top //查看所有cpu核信息mpstat -P ALL 1 //查看cpu使用情况以及平均负载vmstat 1 //进程cpu的统计信息pidstat -u 1 -p pid //跟踪进程内部函数级cpu使用情况 perf top -p pid -e cpu-clock
内存是为提高效率而生,实际分析问题的时候,内存出现问题可能不只是影响性能,而是影响服务或者引起其他问题。同样对于内存有些概念需要清楚:
说明:
//查看系统内存使用情况free -m //虚拟内存统计信息vmstat 1 //查看系统内存情况top //1s采集周期,获取内存的统计信息pidstat -p pid -r 1 //查看进程的内存映像信息pmap -d pid //检测程序内存问题valgrind --tool=memcheck --leak-check=full --log-file=./log.txt ./程序名
磁盘通常是计算机最慢的子系统,也是最容易出现性能瓶颈的地方,因为磁盘离 CPU 距离最远而且 CPU 访问磁盘要涉及到机械操作,比如转轴、寻轨等。访问硬盘和访问内存之间的速度差别是以数量级来计算的,就像 1 天和 1 分钟的差别一样。要监测 IO 性能,有必要了解一下基本原理和 Linux 是如何处理硬盘和内存之间的 IO 的。
在理解磁盘 IO 之前,同样我们需要理解一些概念,例如:
//查看系统io信息iotop //统计io详细信息iostat -d -x -k 1 10 //查看进程级io的信息pidstat -d 1 -p pid //查看系统IO的请求,比如可以在发现系统IO异常时,可以使用该命令进行调查,就能指定到底是什么原因导致的IO异常perf record -e block
-ag^Cperf report网络的监测是所有 Linux 子系统里面最复杂的,有太多的因素在里面,比如:延迟、阻塞、冲突、丢包等,更糟的是与 Linux 主机相连的路由器、交换机、无线信号都会影响到整体网络并且很难判断是因为 Linux 网络子系统的问题还是别的设备的问题,增加了监测和判断的复杂度。现在我们使用的所有网卡都称为自适应网卡,意思是说能根据网络上的不同网络设备导致的不同网络速度和工作模式进行自动调整。
//显示网络统计信息netstat -s //显示当前UDP连接状况netstat -nu //显示UDP端口号的使用情况netstat -apu //统计机器中网络连接各个状态个数netstat -a | awk '/^tcp/ {++S[$NF]} END {for(a in S)print a, S[a]}' //显示TCP连接ss -t -a//显示sockets摘要信息ss -s//显示所有udp socketsss -u -a//tcp,etcp状态sar -n TCP,ETCP 1 //查看网络IOsar -n DEV 1//抓包以包为单位进行输出tcpdump -i eth1 host 192.168.1.1 and port 80 //抓包以流为单位显示数据内容tcpflow -cp host 192.168.1.1
Load 就是对计算机干活多少的度量(WikiPedia:the system Load is a measure of the amount of work that a compute system is doing)简单的说是进程队列的长度。Load Average 就是一段时间(1 分钟、5 分钟、15 分钟)内平均 Load。
//查看负载情况uptimetopvmstat //统计系统调用耗时情况strace -c -p pid //跟踪指定的系统操作例如epoll_waitstrace -T -e epoll_wait -p pid //查看内核日志信息dmesg
本文作者:Gustav
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!