监控的目的是为了,找出系统的瓶颈,理解并分析当前系统的特点,现在多数的系统跑的是应用类型,例如:
1.数据库(Oracle, MySQL,等)
2.Cache服务(Memcached, Squid等)
2.应用服务器(Tomcat, Apache,Nginx, Jboss, sendmail等)
其实这些应用软件大致可以分为两类:
1. 数据读取范畴(I/O 请求占用多数时间)
在这个范畴的应用软件,基本是处理高负荷的内存使用以及存储的系统,大量的时间处在数据处理的过程中,多半的软件不会对CPU发起更多的处理请求,当然这些软件也使用CPU,但都是为了产生I/O请求一集进入到内核态中断所发起的请求。
2. 数据处理范畴(CPU计算占用多数时间)
处在这个范畴的应用软件,基本是高负荷的CPU占用为主,以及高密度的数学计算,通常web服务器,Tomcat,Jboss这样的应用服务器,或者一些中间件都是这个范畴的应用软件。
在这里我们先介绍一下CPU范畴居多的服务器,怎么监控CPU的性能:
1.安装监控工具
标准的Linux发行版里都带有了top命令,除此意外还有一个sysstat的linux监控工具,可以使用
http://sebastien.godard.pagesperso-orange.fr/
sysstat里包括了一系列的监控工具,比较常用的有vmstat, mpstat, iostat
首先我们使用vmstat来看一下输出:
[root@localhost ~]# vmstat procs ------memory------ ---swap-- -----io--- ----system----- -----cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa 0 0 0 424904 14784 45484 0 0 29 2 26 14 0 1 99 1
这里简单解释一下几个比较重要的列所代表的含义:
列名称 | 含义 |
r | Run Queue, 表示当前CPU运行队列中线程的数目,代表线程出于可运行状态,但CPU尚未执行。 |
b | Blocked, 表示当前进程阻塞并等待I/O请求完成的数目。 |
in | Interrupts, 当前终端被处理的数目。 |
cs | Context Switch, 表示当前系统内核中,发生上下文切换的数目。 |
us | Utilization, 表示CPU利用率百分比。 |
sys | System kernel and Interrupts, 表示内核中断利用率的百分比。 |
wa | All runnable threads are blocked waiting on I/O, 表示所有可运行状态的线程被阻塞在I/O的百分比。 |
id | Idle, CPU空闲时间百分比。 |
这里产生了一个系统性能的快照,监控CPU,我们最关心的莫过于CPU使用率,这系统输出中---cpu---下的id列,代表CPU空闲时间百分比,idle的缩写,这里数值是99,表示系统非常空闲,同时r,b,us数值均为0,in与cs 也出于很低的数值位,总体数值表明该系统非常空闲,几乎不做任何事情。
下边给一个系统比较繁忙的例子,并且持续监控10秒
[root@localhost ~]# vmstat 1 procs ---------memory--------- ---swap--- -----io---- -----system----- -----cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa 3 0 207689 15094 80387 156631 0 0 0 2 726 26 82 20 0 0 2 0 207689 14768 80387 156165 0 0 0 2 738 23 96 3 0 0 1 0 207689 14723 80387 156774 0 356 0 2308 987 80 93 16 0 0 2 0 208352 13815 79183 156393 0 356 0 1038 667 62 91 13 0 0 1 0 208352 301812 77132 155414 0 0 0 2 873 24 87 6 0 0 3 0 208352 301812 77132 155547 0 0 0 2589 896 36 92 11 0 0 4 0 208352 301812 76062 155751 0 0 0 2 850 30 91 12 0 0 4 0 208352 301812 76062 155482 0 0 0 2 736 26 88 6 0 0 2 0 208352 301812 76103 155823 0 0 0 2 812 23 85 7 0 0 0 0 208352 301812 76103 155979 0 0 0 2 887 21 77 9 1 0
根据上边的数值,我们可以观察到:
1. in的数值很高,说明有大量的中断请求,而cs的数值较少,上下文切换较少,这说明可能有一个进程在产生对硬件设备的请求。
2. us平均数值在85以上,而cs的数值不高,说明上下文切换很少, 这说明这个应用程序很可能还在CPU里被处理。
3. r的数值有正常范围应该在1-3个以内,显然有2个4,这说明,超出了限制。
这里简单介绍一下r的含义:
r死Runnable Queue, 实际上每个CPU都维护这一个线程的运行队列,调度器应该不断的切换,并且执行线程, 当进程中的线程不是在阻塞队列中,或者等待I/O中,那么 就是在可运行状态中, 如果CPU出于高负荷状态下,那么内核调度将无法及时响应系统请求,这会使可运行状态进程的线程阻塞在运行队列里,随着队列越来越大,进程中的线程将话费更多的时间等待被执行。
大家可以用top命令查看系统的平均运行队列状况,在top中叫做load averages, top中列出的是指,1,5,15分钟内的运行队列状况。
下边再介绍一个工具 mpstat
这个工具主要是用在多核的处理器中, 你可以使用mpstat来监控每个核的处理情况.
[root@localhost ~]# mpstat -P ALL 1 Linux 2.6.35.14-95.fc14.i686 (localhost.localdomain) 2011年08月28日 _i686_ (1 CPU) 18时52分19秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 18时52分20秒 all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 18时52分20秒 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 18时52分20秒 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
mpstat命令打印出的CPU利用率基本与vmstat一致,但是mpstat可以基于单个处理器计算统计的数值:)