iostat vmstat sar命令详解文档格式.docx
《iostat vmstat sar命令详解文档格式.docx》由会员分享,可在线阅读,更多相关《iostat vmstat sar命令详解文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
![iostat vmstat sar命令详解文档格式.docx](https://file1.bdocx.com/fileroot1/2023-1/4/617d771e-2e73-42eb-bd3f-fec041605f4e/617d771e-2e73-42eb-bd3f-fec041605f4e1.gif)
idle小于70%IO压力就较大了,一般读取速度有较多的wait.
同时可以结合vmstat查看查看b参数(等待资源的进程数)和wa参数(IO等待所占用的CPU时间的百分比,高过30%时IO压力高)
iostat输出解析
1./proc/partitions
对于kernel2.4,iostat的数据的主要来源是/proc/partitions,而对于kernel2.6,数据主要来自/proc/diskstats或/sys/block/[block-device-name]/stat。
先看看/proc/partitions中有些什么。
#cat/proc/partitions
majorminor#blocksnameriormergersectrusewiowmergewsectwuserunninguseaveq
3019535040hda125243112734437134436012941255343084341097290-11580072028214662
317172991hda1137116814000000140140
321hda200000000000
355116671hda5100477665620112300610650
36265041hda65189246162770257337529056143880046520146650
376980211hda71188930475338890340740126832215827937695338005093501294120
major:
主设备号。
3代表hda。
minor:
次设备号。
7代表No.7分区。
#blocks:
设备总块数(1024bytes/block)。
19535040*1024=>
20003880960(bytes)~2G
name:
设备名称。
如hda7。
rio:
完成的读I/O设备总次数。
指真正向I/O设备发起并完成的读操作数目,
也就是那些放到I/O队列中的读请求。
注意非常多进程发起的读操作
(read())非常可能会和其他的操作进行merge,不一定每个read()调用
都引起一个I/O请求。
rmerge:
进行了merge的读操作数目。
rsect:
读扇区总数(512bytes/sector)
ruse:
从进入读队列到读操作完成的时间累积(毫秒)。
上面的例子显示从开机
开始,读hda7操作共用了约340秒。
wio:
完成的写I/O设备总次数。
wmerge:
进行了merge的写操作数目。
wsect:
写扇区总数
wuse:
从进入写队列到写操作完成的时间累积(毫秒)
running:
已进入I/O请求队列,等待进行设备操作的请求总数。
上面的例子显
示hda7上的请求队列长度为0。
use:
扣除重叠等待时间的净等待时间(毫秒)。
一般比(ruse+wuse)要小。
比
如5个读请求同时等待了1毫秒,那么ruse值为5ms,而use值为
1ms。
use也能理解为I/O队列处于不为空状态的总时间。
hda7的I/O
队列非空时间为509秒,约合8分半钟。
aveq:
在队列中总的等待时间累积(毫秒)(约等于ruse+wuse)。
为什么是“约等于”而不是等于呢?
让我们看看aveq,ruse,wuse的计算方式,这些量一般是在I/O完成后进行更新的:
aveq+=in-flight*(now-disk->
stamp);
ruse+=jiffies-req->
start_time;
//如果是读操作的话
wuse+=jiffies-req->
//如果是写操作的话
注意aveq计算中的in-flight,这是当前还在队列中的I/O请求数目。
这些I/O还没有完成,所以不能计算到ruse或wuse中。
理论上,只有在I/O全部完成后,aveq才会等于ruse+wuse。
举一个例子,假设初始时队列中有三个读请求,每个请求需要1秒钟完成。
在1.5秒这一时刻,aveq和ruse各是多少呢?
ruse=1//因为此时只有一个请求完成
aveq=3*1+2*0.5=4//因为第二个请求刚发出0.5秒钟,另更有一个请求在队列中呢。
//这样第一秒钟时刻有3个in-flight,而1.5秒时刻有2个in-flight.
如果三个请求全部完成后,ruse才和aveq相等:
ruse=1+2+3=6
aveq=1+2+3=6
周详说明请参考linux/drivers/block/ll_rw_blk.c中的end_that_request_last()和disk_round_stats()函数。
vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。
这个命令是我查看Linux/Unix最喜爱的命令,一个是Linux/Unix都支持,二是相比top,我可以看到整个机器的CPU,内存,IO的使用情况,而不是单单看到各个进程的CPU使用率和内存使用率(使用场景不一样)。
一般vmstat工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数,如:
root@ubuntu:
~#vmstat21
procs-----------memory-------------swap-------io-----system------cpu----
rbswpdfreebuffcachesisobiboincsussyidwa
10034984723158363819540000120001000
2表示每个两秒采集一次服务器状态,1表示只采集一次。
实际上,在应用过程中,我们会在一段时间内一直监控,不想监控直接结束vmstat就行了,例如:
~#vmstat2
10034998403158363819660000120001000
00034995843158363819660000088158001000
00034997083158363819660000286162001000
000349970831583638196600001081151001000
10034997323158363819660000283154001000
这表示vmstat每2秒采集数据,一直采集,直到我结束程序,这里采集了5次数据我就结束了程序。
好了,命令介绍完毕,现在开始实战讲解每个参数的意思。
r
表示运行队列(就是说多少个进程真的分配到CPU),我测试的服务器目前CPU比较空闲,没什么程序在跑,当这个值超过了CPU数目,就会出现CPU瓶颈了。
这个也和top的负载有关系,一般负载超过了3就比较高,超过了5就高,超过了10就不正常了,服务器的状态很危险。
top的负载类似每秒的运行队列。
如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高。
b
表示阻塞的进程,这个不多说,进程阻塞,大家懂的。
swpd
虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。
free
空闲的物理内存的大小,我的机器内存总共8G,剩余3415M。
buff
Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存,我本机大概占用300多M
cache
cache直接用来记忆我们打开的文件,给文件做缓冲,我本机大概占用300多M(这里是Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。
)
si
每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。
我的机器内存充裕,一切正常。
so
每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。
bi
块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte,我本机上没什么IO操作,所以一直是0,但是我曾在处理拷贝大量数据(2-3T)的机器上看过可以达到140000/s,磁盘写入速度差不多140M每秒
bo
块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。
bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。
in
每秒CPU的中断次数,包括时间中断
cs
每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。
系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。
上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。
us
用户CPU时间,我曾经在一个做加密解密很频繁的服务器上,可以看到us接近100,r运行队列达到80(机器在做压力测试,性能表现不佳)。
sy
系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。
id
空闲CPU时间,一般来说,id+us+sy=100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。
wt
等待IOCPU时间。
linuxsar命令详解
sar(SystemActivityReporter系统活动情况报告)是目前
Linux
上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括:
文件的读写情况、系统调用的使用情况、磁盘I/O、CPU效率、内存使用状况、进程活动及IPC有关的活动等。
本文主要以CentOS
6.3x64系统为例,介绍sar命令。
sar命令常用格式
sar[options][-A][-ofile]t[n]
其中:
t为采样间隔,n为采样次数,默认值是1;
-ofile表示将命令结果以二进制格式存放在文件中,file是文件名。
options为命令行选项,sar命令常用选项如下:
-A:
所有报告的总和
-u:
输出CPU使用情况的统计信息
-v:
输出inode、文件和其他内核表的统计信息
-d:
输出每一个块设备的活动信息
-r:
输出内存和交换空间的统计信息
-b:
显示I/O和传送速率的统计信息
-a:
文件读写情况
-c:
输出进程统计信息,每秒创建的进程数
-R:
输出内存页面的统计信息
-y:
终端设备活动情况
-w:
输出系统交换活动信息
1.CPU资源监控
例如,每10秒采样一次,连续采样3次,观察CPU的使用情况,并将采样结果以二进制形式存入当前目录下的文件test中,需键入如下命令:
sar-u-otest103
屏幕显示如下:
17:
06:
16CPU%user%nice%system%iowait%steal%idle
26all0.000.000.200.000.0099.80
36all0.000.000.200.000.0099.80
46all0.000.000.100.000.0099.90
Average:
all0.000.000.170.000.0099.83
输出项说明:
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。
如果要查看二进制文件test中的内容,需键入如下sar命令:
sar-u-ftest
2.inode、文件和其他内核表监控
例如,每10秒采样一次,连续采样3次,观察核心表的状态,需键入如下命令:
sar-v103
10:
49dentunusdfile-nrinode-nrpty-nr
5963015664120374
11:
0963015664120374
1963015664120374
63015664120374
dentunusd:
目录高速缓存中未被使用的条目数量
file-nr:
文件句柄(filehandle)的使用数量
inode-nr:
索引节点句柄(inodehandle)的使用数量
pty-nr:
使用的pty数量
3.内存和交换空间监控
例如,每10秒采样一次,连续采样3次,监控内存分页:
sar-r103
kbmemfree:
这个值和free命令中的free值基本一致,所以它不包括buffer和cache的空间.
kbmemused:
这个值和free命令中的used值基本一致,所以它包括buffer和cache的空间.
%memused:
这个值是kbmemused和内存总量(不包括swap)的一个百分比.
kbbuffers和kbcached:
这两个值就是free命令中的buffer和cache.
kbcommit:
保证当前系统所需要的内存,即为了确保不溢出而需要的内存(RAM+swap).
%commit:
这个值是kbcommit与内存总量(包括swap)的一个百分比.
4.内存分页监控
sar-B103
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)的百分比
5.I/O和传送速率监控
例如,每10秒采样一次,连续采样3次,报告缓冲区的使用情况,需键入如下命令:
sar-b103
18:
51:
05tpsrtpswtpsbread/sbwrtn/s
150.000.000.000.000.00
251.920.001.920.0022.65
350.000.000.000.000.00
0.640.000.640.007.59
tps:
每秒钟物理设备的I/O传输总量
rtps:
每秒钟从物理设备读入的数据总量
wtps:
每秒钟向物理设备写入的数据总量
bread/s:
每秒钟从物理设备读入的数据量,单位为块/s
bwrtn/s:
每秒钟向物理设备写入的数据量,单位为块/s
6.进程队列长度和平均负载状态监控
例如,每10秒采样一次,连续采样3次,监控进程队列长度和平均负载状态:
sar-q103
19:
25:
50runq-szplist-szldavg-1ldavg-5ldavg-15
26:
0002590.000.000.00
1002590.000.000.00
2002590.000.000.00
02590.000.000.00
runq-sz:
运行队列的长度(等待运行的进程数)
plist-sz:
进程列表中进程(processes)和线程(threads)的数量
ldavg-1:
最后1分钟的系统平均负载(Systemloadaverage)
ldavg-5:
过去5分钟的系统平均负载
ldavg-15:
过去15分钟的系统平均负载
7.系统交换活动信息监控
例如,每10秒采样一次,连续采样3次,监控系统交换活动信息:
sar-
W103
39:
50pswpin/spswpout/s
40:
000.000.00
100.000.00
200.000.00
0.000.00
pswpin/s:
每秒系统换入的交换页面(swappage)数量
pswpout/s:
每秒系统换出的交换页面(swappage)数量
8.设备使用情况监控
例如,每10秒采样一次,连续采样3次,报告设备使用情况,需键入如下命令:
#sar-d103–p
45:
54
DEV
tps
rd_sec/s
wr_sec/s
avgrq-sz
avgqu-sz
await
svctm
%util
46:
04
scd0
0.00
0.00
sda
vg_livedvd-lv_root
vg_livedvd-lv_swap
参数-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:
从请求磁盘操作到系