平时监控linux的运行性能的时候,一般咱们最早关注的就是CPU的相关指标了,如load,cpu的利用率等。下面就来简单的介绍一下linux系统中咱们常常关注的几个性能指标,有: Run Queue Statistics 若是想查看cpu的相关繁忙程度,咱们能够经过查看系统中进程的状态来作个简单的判断,比方说咱们能够经过查看一下runnable进程的数目和blocked进程的数目来cpu的利用率等。 1)runnable 若是一个process在runnable状态,这就意味着它和其余一样处在runnable状态的process在等待CPU时间,而不是当即得到CPU时间,即咱们平时所说的“就绪”状态,表示随时能够执行可是没有在执行。 当process在runnable状态时,表示其在等待CPU时间执行,这种状态是不消耗CPU时间的,他们造成的等待队列称做Run Queue,Run Queue越大,表示等待的队列越长。Linux调度进程,从runnable队列中(Run Queue),选择一个process下次执行,那么这个process就会得到CPU时间,其就变成running状态。 process的runnable和running状态,在linux系统中用TASK_RUNNING这个全局变量来表示。TASK_RUNNING表示process正在被CPU执行,或者已经准备就绪随时可由调度程序调度执行;若此时进程没有被CPU执行,则称其处于就绪状态(runnable),若此时进程正在被CPU执行,则称其处于执行状态(running)。当一个进程在内核代码中运行时,咱们称其处于内核态;当一个进程正在执行用户本身的代码时,咱们称其处于用户态。当系统资源已经可用时,进程就被唤醒而进入准备运行状态,也就是就绪状态。这些状态在内核中表示方法相同,都被称为TASK_RUNNING状态。当一个进程刚被建立后就处于TASK_RUNNING状态。 咱们平时常常说到的监控系统状态的load(中文翻译为负载),就是这个TASK_RUNNING值,它就是指处在running和runnable的process的总和。例如:若是有两个processes在running和有三个在等待运行(runnable),那么系统的load为五。load average是指在指定时间内load的平均值,通常load average显示的三个数字的时间分别为1分钟,五分钟和十五分钟。 2)blocked waiting for an event to complete 一个blocked状态的process可能在等待一个I/O操做获取的数据,或者是一个系统调用的结果。 Context Switches 大部分如今的CPU在同一时间只能运行一个process,虽然也有一些CPU,例如超线程技术的CPU,能实现同时运行超过一个process,linux把这种CPU看做多个单线程CPU。 linux内核不断的在不一样process间切换,形成一个错觉,让人感受一个单CPU同时处理多个任务,不一样process之间的切换称做 Context Switch。当系统作Context Switch时,CPU保存全部old process的context信息并得到new process的全部context信息。Context信息包括大量的linux追踪每一个process信息,尤为是一些资源:哪些process正在执行,被分配了哪些内存,它打开了那些文件等等。切换Context会触发大量的信息移动,这是比较高的开销,若是可能的话尽可能保持很小的 context switches。 为了尽量的减少context switches,得须要知道它们是怎么产生的?首先kernel调度触发context switches。为了保证每一个process平等的共享CPU时间kernel周期性中断running的process,若是合适,kernel调度器会开始一个其余的process而不是让当前的process继续执行,每次的周期性中断或者定时中断均可能触发context switch,每秒定时中断的次数因不一样架构和不一样的kernel版本而不一样。获取每秒中断次数的一个简单办法是经过监控 /proc/interrupts文件,看下面的例子: [root[@localhost](http://my.oschina.net/u/570656) asm-i386]# cat /proc/interrupts | grep timer; sleep 10 ; cat /proc/interrupts | grep timer 0: 24060043 XT-PIC timer 0: 24070093 XT-PIC timer 上面能够看到在指定的时间内timer次数的变化,每秒产生的中断次数为1000次。 另外若是你的context switch比timer中断大不少,那么context switch更多的多是I/O请求或者其余长时间的系统调用(好比sleep)产生。当一个应用请求一个操做不能当即实现时,kernel开始 context switch操做:存入请求的process而且试着切换到其余runnable process,这将使得CPU保持工做状态。 Interrupts 其余方面,CPU接收硬件驱动发出的中断请求,这种中断一般被触发当一个驱动器有一个时间须要被kernel操做时。例如:若是一个磁盘控制器从磁盘上取得了一个数据块和kernel须要读取使用这个块,那么磁盘控制器会触发一个中断。kernel接收每一个中断,若是这个中断被注册,那么就会有一个中断处理器来运行处理这个中断,不然这个中断将会被忽略。在系统中,中断处理器的优先级很是高,并且执行速度很是快。不少时候,有些中断处理并不须要很高的处理优先级,因此也有soft- interrupt handler。若是有不少的中断,kernel须要花费大量的时间去处理中断。能够检查/proc/interrupts可以知道中断发生在哪一个CPU 上。 CPU Utilization CPU Utilization,一个很直观的概念,在任意时间内,CPU有7个状态: 1)idle,表示CPU闲置并等待工做分配 2)user,表示CPU在运行用户的进程 3)system,表示CPU在执行kernel工做 4)nice,表示CPU花费在被nice改变过优先级的process上的时间(注意:被nice命令改变优先级的process仅指那些nice值为负的process。花费在被nice命令改变优先级的任务上的时间也将被计算在系统和用户时间内,所以整个时间加起来可能会超过百分之百) 5)iowait,表示CPU等待IO操做完成的时间 6)irq,表示CPU开销在响应硬中断上的时间 7)softirq,表示CPU开销在响应软中断上的时间 咱们通常用vmstat看到的都是四个状态:sy,us,id,wa,经过他和loadavg结合,基本能够知道cpu的状态。大部分的性能工具用百分比表示CPU时间。当system时间占用很高的时候,你能够用"oprofile"工具发现时间都花费在哪里。当iowait很高的时候,你须要分析你的IO设备,好比磁盘,网卡。 正如咱们以前讨论的任何系统的性能比较都是基于基线的,而且监控CPU的性能就是以上3点,运行队列、CPU使用率和上下文切换。如下是一些对于CPU很广泛的性能要求:linux
对于每个CPU来讲运行队列不要超过3,例如,若是是双核CPU就不要超过6;
若是CPU在满负荷运行,应该符合下列分布,
a) User Time:65%~70% b) System Time:30%~35% c) Idle:0%~5% 3. 对于上下文切换要结合CPU使用率来看,若是CPU使用知足上述分布,大量的上下文切换也是能够接受的。架构
经常使用的监视工具备,vmstat, top,dstat和mpstat.dom
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu---- r b swpd free buff cache si so bi bo in cs us sy id wa 0 0 104300 16800 95328 72200 0 0 5 26 7 14 4 1 95 0 0 0 104300 16800 95328 72200 0 0 0 24 1021 64 1 1 98 0 0 0 104300 16800 95328 72200 0 0 0 0 1009 59 1 1 98 0ide
r表示运行队列的大小, b表示因为IO等待而block的线程数量, in表示中断的数量, cs表示上下文切换的数量, us表示用户CPU时间, sys表示系统CPU时间, wa表示因为IO等待而是CPU处于idle状态的时间, id表示CPU处于idle状态的总时间。工具
dstat能够给出每个设备产生的中断数:性能
----total-cpu-usage---- ----interrupts--- ---procs--- usr sys idl wai hiq siq| 15 169 185 |run blk new 6 1 91 2 0 0| 12 0 13 | 0 0 0 1 0 99 0 0 0| 0 0 6 | 0 0 0 0 0 100 0 0 0| 18 0 2 | 0 0 0 0 0 100 0 0 0| 0 0 3 | 0 0 0 咱们能够看到这里有3个设备号15,169和185.设备名和设备号的关系咱们能够参考文件/proc/interrupts,这里185表明网卡eth1.ui
CPU0 0: 1277238713 IO-APIC-edge timer 6: 5 IO-APIC-edge floppy 7: 0 IO-APIC-edge parport0 8: 1 IO-APIC-edge rtc 9: 1 IO-APIC-level acpi 14: 6011913 IO-APIC-edge ide0 15: 15761438 IO-APIC-edge ide1 169: 26 IO-APIC-level Intel 82801BA-ICH2 185: 16785489 IO-APIC-level eth1 193: 0 IO-APIC-level uhci_hcd:usb1spa
mpstat能够显示每一个CPU的运行情况,好比系统有4个CPU。咱们能够看到:.net
Linux 2.4.21-20.ELsmp (localhost.localdomain) 05/23/2006 05:17:31 PM CPU %user %nice %system %idle intr/s 05:17:32 PM all 0.00 0.00 3.19 96.53 13.27 05:17:32 PM 0 0.00 0.00 0.00 100.00 0.00 05:17:32 PM 1 1.12 0.00 12.73 86.15 13.27 05:17:32 PM 2 0.00 0.00 0.00 100.00 0.00 05:17:32 PM 3 0.00 0.00 0.00 100.00 0.00线程
总结的说,CPU性能监控包含如下方面: 检查系统的运行队列,确保每个CPU的运行队列不大于3. 确保CPU使用分布知足70/30原则(用户70%,系统30%)。 若是系统时间过长,多是由于频繁的调度和改变优先级。 CPU Bound进程老是会被惩罚(下降优先级)而IO Bound进程总会被奖励(提升优先级)。
参考文章:http://blog.163.com/bobile45@126/blog/static/960619922012101005948264/ http://www.51testing.com/?uid-3787-action-viewspace-itemid-5527