(转)Linux 系统性能分析工具图解读(一、二)
Linux 系统性能分析工具图解读(一、二)
原文:http://oilbeater.com/linux/2014/09/08/linux-performance-tools.html
最近看了 Brendan Gregg 大神著名的 Linux Performance Observability Tools,这么好的资料不好好学习一下实在是浪费了,又找到了大神的 ppt 和 演讲(需爬墙),于是把相关的命令和概念连预习,学习,复习走了一遍。
首先学习的是大神提出的 Basic Tool 有如下几个:
-
uptime
-
top (htop)
-
mpstat
-
iostat
-
vmstat
-
free
-
ping
-
nicstat
-
dstat
uptime
uptime 比较重要的能显示当前系统的负载状态,但是这个负载究竟是什么意思呢?查了一些资料负载指的是当前可运行的程序加上正在运行的程序再加上等待 IO 的程序,比如现在运行着一个,一个等待运行,还有一个等待 IO 那么负载就是3. uptime 后面三个数分别是 1min, 5min 和 15min 的负载平均值,由于内核用了一个指数平滑的平均算法,这个值不能直接反应当前等待的进程数。此外这个值没对多核进行 normalization 所以单核情况下当负载是 1 的时候说明 cpu 满载了,但是对于 4 核 cpu 刚到满负载的 25%。 一般情况下这个值越大就说明等待 CPU 的进程越多,如果大于核数就说明有进程在等待 CPU,需要看一下程序的问题或者考虑加机器了。另外即使负载过载了也不一定说明 CPU 的利用率高,因为很可能是大量的请求 IO 的进程在等待,像一些数据库服务,所以看完负载后还要针对应用场景综合考量。
top & htop
top 其实是一个相当全面的分析了还是事实的,其他很多命令能拿到的数据,top 一个命令就可以拿到。但是他的一个问题就是本身的 overhead 比较大,如果系统负载本身就很大那么可能就会卡住了。此外 top 可能会忽视掉那些生命周期很短的程序。top 的 manual 里详细介绍了每个指标的意义,翻看一下还是很有收获的。其中比较要关注的有 wa(io wait),查看是不是你的 IO 是瓶颈,还有 st (time stolen from this vm by the hypervisor) 这个指标会出现在虚拟机里的系统中,表示的是你的虚拟机在等待真实物理机的 CPU 资源的时间。如果这个值很高的话说明你的服务提供商的 CPU 资源有限你没抢过别人,很有可能使服务商超卖了。碰到这种情况要么打客服投诉,或者多掏点银子找个靠谱的运营商吧。
htop 是 top 的改进版,带着各种颜色表示和百分比进度条,以及更丰富的功能,小伙伴们可以尝试一下。
mpstat
mpstat 可以显示出每个 CPU 核心的工作情况,其实也可以在 top 里输入 1 看到。通过这个命令我们可以观察是不是存在负载不均的现象,某个核心跑满了,另一个还在闲着,造成整体性能的下降。
iostat
加上 -x 参数后可以看到几乎全部的 io 指标,包括 tps, 请求 queue 的平均长度,平均处理时间, 磁盘带宽利用率等等。每个指标 manual 中都有详细的解释。
vmstat & free
vmstat 是一个展示内存整体使用情况的命令,其中要关注一下 swpd 和 swap 的 in/out 。如果这一部分的数值过大,会频繁的 IO 造成性能下降,要么看看是不是程序内存泄露了,要么就加内存吧。 memory 里的 buffer 指的是写磁盘缓冲区, 而 cache 可以当成是读文件的缓冲区。free也是类似的功能,不过只展示内存部分的内容。
ping
这个相对来说简单一些,主要反映了主机间的延迟和连通性,很多时候也只能告诉我们这些了。可以尝试一下 hping 有着指定端口,高级 tracerout 的功能。
nicstat
一个和 iostat 类似,不过是针对网卡的命令。
dstat
一个综合了cpu、 memory、 IO、 network 的工具,可以事实展示当前的系统资源利用情况。
以上就是最基础的命令了,高级一些的命令有:
-
sar
-
netstat
-
pidstat
-
strace
-
tcpdump
-
blktrace
-
iotop
-
slabtop
-
sysctl
-
/proc
-
第一篇讲了一些最基础的命令了,接下来在研究研究高级的命令:
-
sar
-
netstat
-
pidstat
-
strace
-
tcpdump
-
blktrace
-
iotop
-
slabtop
-
sysctl
-
/proc
sar
sar 是 System Activity Reporter 的意思,这是一个强大到发指的工具,在第一篇中提到的那些工具的功能(cpu、 mem、 disk、 net),基本上 sar 都可以覆盖到,不信的话可以试一下 sar -A 1 1 看一下它都统计了哪些东西。此外 sar 可以周期性的执行统计,很多系统级别的监控都是通过 sar 来做的。淘宝还专门自己开发了一个 tsar 在原有的系统级别的监控上增加了对应用的监控。
netstat
这个命令也是和网络相关的,可以查看 socket 的连接信息,比如建立了哪些 TCP 连接,他们的状态是怎样的,一个进程有多少链接。通常这个命令后面都会跟着 grep 或者 awk 的命令进行进一步处理。以至于有的 awk 的教程都会以 netstat 的输出处理作为样例,比如耗子叔叔的 awk 简明教程。此外这个命令还有一个 -s 的参数可以统计不同的协议的数据包信息。
pidstat
其实要不是看到大神说有这个命令,我还以为这个命令是 ps 的全称。其实展示的东西也和 ps 类似,主要的区别在于 ps 只是一次提供系统进程状态的一个快照,pidstat# 可以指定进程提供定时多次的统计信息,相当于你可以更细粒度的 ps 了。这也是做监控的一个很好的工具,可以针对特殊进程特殊关照。
strace
其实感觉 strace 是一个更偏针对应用的性能工具,他可以统计出进程进行了哪些系统调用,处理了哪些信号。也因此 strace 是一个分析程序实现的一个很好的工具,比如说你想知道 pidstat 中的信息都是从哪里获得的就 strace pidstat & grep open 就可以知道它是打开了哪些文件获取到信息的。由于 strace 会将输出打到标准错误中所以管道处理要记得加上 & 。这个命令是很强大,但问题是也及其消耗性能,一般情况下慢一个数量级还是会有的,所以只是分析的时候用一下,正常执行就不要了。 tcpdump
大名鼎鼎的 tcpdump 可以将经过网卡的数据包保存下来一份以供 wireshark 这类软件进一步进行分析。如果愿意的话开启网卡混杂模式也可以捕获同一网络上其他机器的数据包,也是黑客很喜欢的工具。和 strace 类似, tcpdump 的功能很强大,即使开了 filter 功能也很消耗性能,一般的生产机如果流量大的话开启 tcpdump还是吃不消的。当然有一些神秘的组织是需要获取网络包的完整备份的,他们大概是用专门的硬件完成的吧。
blktrace
其实这个命令用 btrace 展示会更好一些,看名字就知道是 strace 的 io 版,可以实时的展示每次磁盘 IO 请求的内容,耗时,发生位置等等很多东西,不过带 trace 的命令一般都比较耗性能。
iotop
和上个命令类似,一看就是 top 的 io 版,简洁明了,包括展示都和 top 很类似,试一下就知道是怎么回事了。
slabtop
其实只要知道 slab 是个什么东西,这个命令就很好理解了。slab 是对象缓冲池,将一些常用的小的对象结构再释放后缓存起来,而不是直接交给系统回收,这样可以避免频繁的小对象找系统申请内存造成性能下降,知道这个再看 这条命令就很轻松了。
sysctl
这里面是一些很有讲究的系统参数的设置,很多参数的设置都会对服务器的性能产生很大的影响。这也是个水很深的配置文件,比如 tcp_reuse、tcp_recycle 这些服务器的重要配置都在这里面。这里面的配置估计也能讲上个几天几夜。还是先 sysctl -a 看一下感受感受吧。
/proc
其实上述诸多的工具都是从这个文件加下面读取文件做展示的,不过真要自己解析这里面的文件还是蛮耗功夫的,所以还是好好用一下上面的那些命令吧。不过如果你对那些命令是如何实现的可以配合着 strace 来探索这里面的奥秘。
-
- http://blog.51cto.com/ixdba/715742
-
vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,很多linux发行版本都默认安装了此命令工具,利用vmstat命令可以对操作系统的内存信息、进程状态、CPU活动等进行监视,不足之处是无法对某个进程进行深入分析。
vmstat使用语法如下:
vmstat [-V] [-n] [delay [count]]
各个选项及参数含义如下:
l -V:表示打印出版本信息,是可选参数。
l -n:表示在周期性循环输出时,输出的头部信息仅显示一次。
l delay:表示两次输出之间的间隔时间。
l count:表示按照“delay”指定的时间间隔统计的次数。默认为1。
例如:
vmstat 3
表示每3秒钟更新一次输出信息,循环输出,按ctrl+c停止输出。
vmstat 3 5
表示每3秒更新一次输出信息,统计5次后停止输出。
iostat是I/O statistics(输入/输出统计)的缩写,主要的功能是对系统的磁盘I/O操作进行监视。它的输出主要显示磁盘读写操作的统计信息,同时也会给出CPU使用情况。同vmstat一样,iostat也不能对某个进程进行深入分析,仅对系统的整体情况进行分析。
iostat一般都不随系统安装,要使用iostat工具,需要在系统上安装一个Sysstat的工具包,Sysstat是一个开源软件,官方地址为http://pagesperso-orange.fr/sebastien.godard
可以选择源代码包或rpm包的方式安装,这里不在讲述安装过程,安装完毕,系统会多出3个命令:iostat、sar和mpstat。然后就可以直接在系统下运行iostat命令了。
iostat使用语法如下:
iostat [ -c | -d ] [ -k ] [ -t ] [ -x [ device ] ] [ interval [ count ] ]
各个选项及参数含义如下:
-c:显示CPU的使用情况。
-d:显示磁盘的使用情况。
-k:每秒以k bytes为单位显示数据。
-t:打印出统计信息开始执行的时间。
-x device:指定要统计的磁盘设备名称,默认为所有的磁盘设备。
interval:指定两次统计间隔的时间;
count:按照“interval”指定的时间间隔统计的次数。
sar命令很强大,是分析系统性能的重要工具之一,通过sar指令,可以全面的获取系统的CPU、运行队列、磁盘I/O、分页(交换区)、内存、CPU中断、网络等性能数据。
sar使用格式为:
sar [options] [g1] [-o filename] [interval [count] ]
各个选项及参数含义如下:
l options 为命令行选项,sar命令的选项很多,下面只列出常用选项:
-A:显示系统所有资源设备(CPU、内存、磁盘)的运行状况。
-u:显示系统所有CPU在采样时间内的负载状态。
-P:显示当前系统中指定CPU的使用情况。
-d:显示系统所有硬盘设备在采样时间内的使用状况。
-r:显示系统内存在采样时间内的使用状况。
-b:显示缓冲区在采样时间内的使用情况。
-v:显示进程、文件、I节点和锁表状态。
-n:显示网络运行状态。参数后面可跟DEV、EDEV、SOCK和FULL。DEV显示网络接口信息,EDEV显示网络错误的统计数据,SOCK显示套接字信息,FULL显示三个所有的信息。它们可以单独或者一起使用。
-q:显示了运行队列的大小,它与系统当时的平均负载相同。
-R:显示进程在采样时间内的活动情况。
-y:显示终端设备在采样时间内的活动情况。
-w:显示系统交换活动在采样时间内的状态。
l -o filename:表示将命令结果以二进制格式存放在文件中,filename是文件名。
l interval:表示采样间隔时间,是必须有的参数。
l count:表示采样次数,是可选参数,默认值是1。
要查看系统CPU的整体负载状况,每3秒统计一次,统计5次,可以使用以下组合:
sar –u 3 5
系统的CPU计数是从0开始的,如果要查看第二颗CPU的运行负载,使用下面组合:
sar –P 1 3 5
要查看系统磁盘的读写性能,使用以下组合:
sar -d 3 5
同理,查看系统内存使用情况、网络运行状态,可以分别使用下面命令:
sar -r 5 2
sar -n DEV 5 3
4. 系统性能分析标准
性能调优的主要目的是使系统能够有效的利用各种资源,最大的发挥应用程序和系统之间的性能融合,使应用高效、稳定的运行。但是,衡量系统资源利用率好坏的标准没有一个严格的定义,针对不同的系统和应用也没有一个统一的说法,因此,这里提供的标准其实是一个经验值,表15.1给出了判定系统资源利用状况的一般准则:
表1给出了判定系统资源利用状况的一般准则:
表1
%user:表示CPU处在用户模式下的时间百分比。
%sys:表示CPU处在系统模式下的时间百分比。
%iowait:表示CPU等待输入输出完成时间的百分比。
swap in:即si,表示虚拟内存的页导入,即从SWAP DISK交换到RAM。
swap out:即so,表示虚拟内存的页导出,即从RAM交换到SWAP DISK。
以上我们讲解了三个常用的系统性能分析工具,其实linux下性能分析工具还有很多,例如uptime可以检查CPU的平均负载,free可以查看系统内存的使用状况,ps、top可以配合监控系统的进程运行状态,netstat可以监测网络流量状况等等,这些命令的使用方法在我前面文章已经讲述很多,故不在这里讲解。
针对这个问题,第一步要做的是检测网络,可以通过ping命令检查网站的域名解析是否正常,同时,ping服务器地址的延时是否过大等等,通过这种方式,首先排除网络可能出现的问题;如果网络没有问题,接着进入第二步,对linux系统的内存使用状况进行检查,因为网站响应速度慢,一般跟内存关联比较大,通过free、vmstat等命令判断内存资源是否紧缺,如果内存资源不存在问题,进入第三步,检查系统CPU的负载状况,可以通过sar、vmstat、top等命令的输出综合判断CPU是否存在过载问题,如果CPU没有问题,继续进入第四步,检查系统的磁盘I/O是否存在瓶颈,可以通过iostat、vmstat等命令检查磁盘的读写性能,如果磁盘读写也没有问题,linux系统自身的性能问题基本排除,最后要做的是检查程序本身是否存在问题。通过这样的思路,层层检测,步步排查,性能问题就“无处藏身”,查找出现性能问题的环节也就变得非常简单。1.vmstat命令
2.iostat命令
3.sar命令
例如:
其中:
5. 说在最后
系统性能优化是个涉及面广、繁琐、长久的工作,寻找出现性能问题的根源往往是最难的部分,一旦找到出现问题的原因,性能问题也就迎刃而解。因此,解决问题的思路变得非常重要。
例如,linux系统下的一个网站系统,用户反映,网站访问速度很慢,有时无法访问。