使用权限:所有使用者
使用方式:top [-] [d delay] [q] [c] [S] [s] [i] [n] [b]
说明:即时显示process的动态
d :改变显示的更新速度,或是在交谈式指令列( interactive command)按s
q :没有任何延迟的显示速度,如果使用者是有superuser的权限,则top将会以最高的优先序执行
c :切换显示模式,共有两种模式,一是只显示执行档的名称,另一种是显示完整的路径与名称S :累积模式,会将己完成或消失的子行程( dead child process )的CPU time累积起来
s :安全模式,将交谈式指令取消,避免潜在的危机
i :不显示任何闲置(idle)或无用(zombie)的行程
n :更新的次数,完成后将会退出top
b :批次档模式,搭配"n"参数一起使用,可以用来将top的结果输出到档案内
范例:
显示更新十次后退出:top -n 10
使用者将不能利用交谈式指令来对行程下命令:top -s
将更新显示二次的结果输入到名称为top。log的档案里:top -n 2 -b < top.log
正如我们之前讨论的任何系统的性能比较都是基于基线的,并且监控CPU的性能就是以上3点,运行队列、CPU使用率和上下文切换。以下是一些对于CPU很普遍的性能要求:
1。对于每一个CPU来说运行队列不要超过3,例如,如果是双核CPU就不要超过6;
2。如果CPU在满负荷运行,应该符合下列分布,
a) User Time:65%~70%
b) System Time:30%~35%
c) Idle:0%~5%
r 列表示运行和等待cpu时间片的进程数,如果长期大于1,说明cpu不足,需要增加cpu。
b 列表示在等待资源的进程数,比如正在等待I/O、或者内存交换等。
swpd 切换到内存交换区的内存数量(k表示)。如果swpd的值不为0,或者比较大,比如超过了100m,只要si、so的值长期为0,系统性能还是正常
free 当前的空闲页面列表中内存数量(k表示)
buff 作为buffer cache的内存数量,一般对块设备的读写才需要缓冲。
cache: 作为page cache的内存数量,一般作为文件系统的cache,如果cache较大,说明用到cache的文件较多,如果此时IO中bi比较小,说明文件系统效率比较好。
si 由内存进入内存交换区数量。
so由内存交换区进入内存数量。
bi 从块设备读入数据的总量(读磁盘)(每秒kb)。
bo 块设备写入数据的总量(写磁盘)(每秒kb)
这里我们设置的bi+bo参考值为1000,如果超过1000,而且wa值较大应该考虑均衡磁盘负载,可以结合iostat输出来分析。
in 列表示在某一时间间隔中观测到的每秒设备中断数。
cs列表示每秒产生的上下文切换次数,如当 cs 比磁盘 I/O 和网络信息包速率高得多,都应进行进一步调查。
us 列显示了用户方式下所花费 CPU 时间的百分比。us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期大于50%,需要考虑优化用户的程序。
sy 列显示了内核进程所花费的cpu时间的百分比。这里us + sy的参考值为80%,如果us+sy 大于 80%说明可能存在CPU不足。
wa 列显示了IO等待所占用的CPU时间的百分比。这里wa的参考值为30%,如果wa超过30%,说明IO等待严重,这可能是磁盘大量随机访问造成的,也可能磁盘或者磁盘访问控制器的带宽瓶颈造成的(主要是块操作)。
id 列显示了cpu处在空闲状态的时间百分比。
对于上下文切换要结合CPU使用率来看,如果CPU使用满足上述分布,大量的上下文切换也是可以接受的。
常用的监视工具有:vmstat,top,dstat和mpstat。
r表示运行队列的大小,
b表示由于IO等待而block的线程数量,
in表示中断的数量,
cs表示上下文切换的数量,
us表示用户CPU时间,
sys表示系统CPU时间,
wa表示由于IO等待而是CPU处于idle状态的时间,
id表示CPU处于idle状态的总时间。
可以给出每一个设备产生的中断数。
我们可以看到这里有3个设备号92,107和109。设备名和设备号的关系我们可以参考文件/proc/interrupts,这里109代表网卡eth1。
-P {|ALL} 表示监控哪个CPU, cpu在[0,cpu个数-1]中取值;
internal 相邻的两次采样的间隔时间;
count 采样的次数,count只能和delay一起使用;
当没有参数时,mpstat则显示系统启动以后所有信息的平均值。有interval时,第一行的信息自系统启动以来的平均信息。从第二行开始,输出为前一个interval时间段的平均信息。
mpstat可以显示每个CPU的运行状况。
%user:在internal时间段里,用户态的CPU时间(%),不包含nice值为负进程(usr/total)*100
%nice:在internal时间段里,nice值为负进程的CPU时间(%) (nice/total)*100
%sys:在internal时间段里,内核时间(%) (system/total)*100
%iowait:在internal时间段里,硬盘IO等待时间(%) (iowait/total)*100
%irq:在internal时间段里,硬中断时间(%) (irq/total)*100
%soft:在internal时间段里,软中断时间(%) (softirq/total)*100
%idle:在internal时间段里,CPU除去等待磁盘IO操作外的因为任何原因而空闲的时间闲置时间(%) (idle/total)*100
总结的说,CPU性能监控包含以下方面:
检查系统的运行队列,确保每一个CPU的运行队列不大于3。
确保CPU使用分布满足70/30原则(用户70%,系统30%)。
如果系统时间过长,可能是因为频繁的调度和改变优先级。
CPU Bound进程总是会被惩罚(降低优先级)而IO Bound进程总会被奖励(提高优先级)。
常用格式:sar [options] [-A] [-o file] t [n]
t为采样间隔,n为采样次数,默认值是1;
-o file表示将命令结果以二进制格式存放在文件中,file 是文件名。
-A:所有报告的总和
-u:输出CPU使用情况的统计信息
-v:输出inode、文件和其他内核表的统计信息
-d:输出每一个块设备的活动信息
-r:输出内存和交换空间的统计信息
-b:显示I/O和传送速率的统计信息
-a:文件读写情况
-c:输出进程统计信息,每秒创建的进程数
-R:输出内存页面的统计信息
-y:终端设备活动情况
-w:输出系统交换活动信息
sar -u -o test 10 3
每10秒采样一次,连续采样3次,观察CPU 的使用情况,并将采样结果以二进制形式存入当前目录下的文件test中。
CPU:all 表示统计信息为所有CPU的平均值。
%user:显示在用户级别(application)运行使用 CPU 总时间的百分比。
%nice:显示在用户级别,用于nice操作,所占用 CPU 总时间的百分比。
%system:在核心级别(kernel)运行所使用 CPU 总时间的百分比。
%iowait:显示用于等待I/O操作占用 CPU 总时间的百分比。
%steal:管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟 CPU 的百分比。
%idle:显示 CPU 空闲时间占用 CPU 总时间的百分比。
1. 若 %iowait 的值过高,表示硬盘存在I/O瓶颈
2. 若 %idle 的值高但系统响应慢时,有可能是 CPU 等待分配内存,此时应加大内存容量
3. 若 %idle 的值持续低于1,则系统的 CPU 处理能力相对较低,表明系统中最需要解决的资源是 CPU 。
#sar -v 10 3
每10秒采样一次,连续采样3次,观察核心表的状态。
dentunusd:目录高速缓存中未被使用的条目数量
file-nr:文件句柄(file handle)的使用数量
inode-nr:索引节点句柄(inode handle)的使用数量
pty-nr:使用的pty数量
#sar -r 10 3
每10秒采样一次,连续采样3次,监控内存分页。
kbmemfree:这个值和free命令中的free值基本一致,所以它不包括buffer和cache的空间。
kbmemused:这个值和free命令中的used值基本一致,所以它包括buffer和cache的空间。
%memused:这个值是 kbmemused 和内存总量(不包括swap)的一个百分比。
kbbuffers和kbcached:这两个值就是free命令中的buffer和cache。
kbcommit:保证当前系统所需要的内存,即为了确保不溢出而需要的内存(RAM+swap)。
%commit:这个值是kbcommit与内存总量(包括swap)的一个百分比。
#sar -B 10 3
每10秒采样一次,连续采样3次,监控内存分页。
pgpgin/s:表示每秒从磁盘或SWAP置换到内存的字节数(KB)。
pgpgout/s:表示每秒从内存置换到磁盘或SWAP的字节数(KB)。
fault/s:每秒钟系统产生的缺页数,即主缺页与次缺页之和(major + minor)。
majflt/s:每秒钟产生的主缺页数。
pgfree/s:每秒被放入空闲队列中的页个数。
pgscank/s:每秒被kswapd扫描的页个数。
pgscand/s:每秒直接被扫描的页个数。
pgsteal/s:每秒钟从cache中被清除来满足内存需要的页个数。
%vmeff:每秒清除的页(pgsteal)占总扫描页(pgscank+pgscand)的百分比。
#sar -b 10 3
每10秒采样一次,连续采样3次,报告缓冲区的使用情况。
tps:每秒钟物理设备的 I/O 传输总量。
rtps:每秒钟从物理设备读入的数据总量。
wtps:每秒钟向物理设备写入的数据总量。
bread/s:每秒钟从物理设备读入的数据量,单位为块/s。
bwrtn/s:每秒钟向物理设备写入的数据量,单位为块/s。
#sar -q 10 3
每10秒采样一次,连续采样3次,监控进程队列长度和平均负载状态:
runq-sz:运行队列的长度(等待运行的进程数)。
plist-sz:进程列表中进程(processes)和线程(threads)的数量。
ldavg-1:最后1分钟的系统平均负载(System load average)。
ldavg-5:过去5分钟的系统平均负载。
ldavg-15:过去15分钟的系统平均负载。
#sar -W 10 3
每10秒采样一次,连续采样3次,监控系统交换活动信息。
pswpin/s:每秒系统换入的交换页面(swap page)数量
pswpout/s:每秒系统换出的交换页面(swap page)数量
#sar -d 10 3 –p
每10秒采样一次,连续采样3次,报告设备使用情况,
参数-p可以打印出sda,hdc等磁盘设备名称,如果不用参数-p,设备节点则有可能是dev8-0,dev22-0
tps:每秒从物理磁盘I/O的次数。多个逻辑请求会被合并为一个I/O磁盘请求,一次传输的大小是不确定的。
rd_sec/s:每秒读扇区的次数。
wr_sec/s:每秒写扇区的次数。
avgrq-sz:平均每次设备I/O操作的数据大小(扇区)。
avgqu-sz:磁盘请求队列的平均长度
await:从请求磁盘操作到系统完成处理,每次请求的平均消耗时间,包括请求队列等待时间,单位是毫秒(1秒=1000毫秒)。
svctm:系统处理每次请求的平均时间,不包括在请求队列中消耗的时间。
%util:I/O请求占CPU的百分比,比率越大,说明越饱和。
1. avgqu-sz 的值较低时,设备的利用率较高。
2. 当%util的值接近 1% 时,表示设备带宽已经占满。
要判断系统瓶颈问题,有时需几个 sar 命令选项结合起来。
怀疑CPU存在瓶颈,可用 sar -u 和 sar -q 等来查看。
怀疑内存存在瓶颈,可用 sar -B、sar -r 和 sar -W 等来查看。
怀疑I/O存在瓶颈,可用 sar -b、sar -u 和 sar -d 等来查看。
iostat主要用于监控系统设备的IO负载情况,iostat首次运行时显示自系统启动开始的各项统计信息,之后运行iostat将显示自上次运行该命令以后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。
iostat [ -c ] [ -d ] [ -h ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ] [ device [...] | ALL ] [ -p [ device [,...] | ALL ] ] [ interval [ count ] ]
#iostat -d -k 1 3
tps:该设备每秒的传输次数,一次传输的意思是“一次I/O请求”
kB_read/s:每秒从设备读取的数据量
kB_wrtn/s:每秒向设备写入的数据量
kB_read :读取的总数据量
kB_wrtn :写入的总数量数据量
#iostat -d -x -k 1 3
rrqm/s:每秒进行 merge 的读操作数目.即 delta(rmerge)/s
wrqm/s:每秒进行 merge 的写操作数目.即 delta(wmerge)/s
r/s:每秒完成的读 I/O 设备次数.即 delta(rio)/s
w/s:每秒完成的写 I/O 设备次数.即 delta(wio)/s
rsec/s:每秒读扇区数.即 delta(rsect)/s
wsec/s:每秒写扇区数.即 delta(wsect)/s
rkB/s:每秒读K字节数.是 rsect/s 的一半,因为每扇区大小为512字节.(需要计算)
wkB/s:每秒写K字节数.是 wsect/s 的一半.(需要计算)
avgrq-sz:平均每次设备I/O操作的数据大小(扇区).delta(rsect+wsect)/delta(rio+wio)
avgqu-sz:平均I/O队列长度.即 delta(aveq)/s/1000(因为aveq的单位为毫秒).
await:平均每次设备I/O操作的等待时间(毫秒).即 delta(ruse+wuse)/delta(rio+wio)
svctm:平均每次设备I/O操作的服务时间 (毫秒).即 delta(use)/delta(rio+wio)
%util:一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的.即 delta(use)/s/1000 (因为use的单位为毫秒)
如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。
%util:在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度。一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。)