linux系统出现性能问题,一般我们通过top、iostat、vmstat、free等命令来查看定位问题。
Iostat工具对系统的磁盘操作活动进行监视,提供丰富的io状态数据;特点是汇报磁盘活动统计情况,同时也会汇报cpu使用情况。缺点是不能对某个进程进行深入分析,仅对系统的整体情况进行分析。Vmstat也有同样的问题。
1 命令格式:
iostat [参数] [时间] [次数]
2 命令功能
通过iostat方便查看cpu、磁盘、tty等设备活动情况,负载信息
3 命令参数
-c显示cpu使用情况
-d显示磁盘使用情况
-k 以KB为单位显示
-m以M为单位显示
-N 显示磁盘阵列(LVM)信息
-p[磁盘]显示磁盘和分区情况
-t 显示终端和cpu的信息
-x 显示详细信息
-V 显示版本信息
4 常见用法
iostat -d -k 1 10 # 查看TPS和吞吐量信息
iostat -d -x -k 1 10 #查看设备使用率(%util)、响应时间(await)
iostat -c 1 10 #查看cpu状态
5 用法解读
iostat-d -k 1 10
输出
Tps:该设备每秒的传输次数(Indicatethe number of transfer per second that were issued to the device)。一次传输意思是一次I/o请求。多个逻辑请求可能会被合并为一次I/O请求。“一次传输“请求的大小是未知的
KB_read/s:每秒从设备(drive expressed)读取的数据量
KB_wrtn/s:每秒向设备(drive expressed)写入的数据量
KB_read:读取的总数据量
KB_wrtn:写入的总数据量
从上图可知,tps是分区统计的。
iostat -d -x -k 1 10
输出
rrqm/s: 每秒进行merge的读操作数目
wrqm/s:每秒进行merge的写操作数目
r/s:每秒完成的读io设备次数
w/s:每秒完成的写io设备次数
rkB/s:每秒读取量,单位KB
wKB/s:每秒写入量,单位KB
avgrq-sz:平均每次设备i/o操作的数据大小(扇区)。(rsect+wsect)/(rio+wio)
avgqu-sz:平均I/O队列长度。Aveq/s/1000(aveg的单位是毫秒)
await:平均每次设备i/o操作的等待时间(毫秒)
svctm:平均每次设备I/O操作的服务时间(毫秒)。即use/(rio+wio)
%util:一秒中有百分之多少用于I/O操作
重要的项是%util,体现的是io的负载情况。如果%util接近100%,说明产生的io请求太多,io系统满负荷,磁盘可能存在瓶颈。关注%util的同时,也关注下await。Io压力增大的时候,一般读取速度有较多的wait,await值也比较大。
另外await 参数项也要和svctm来参考。差的过高一定有io问题。
每次数据量读取的大小。如果每次查询读取的数据量大,io值会高;每次操作数据小,读取次数多,io也不会大。Io调优时,这个参数也可以关注。
有些资料上说 svctm一般要小于await,svctm的大小一般和磁盘性能有关,cpu/内存的负荷也会对其有影响,请求过多也会间接导致svctm的增加。Await的大小一般取决于服务时间(svctm)以及io队列的长度和IO请求的发出模式。如果svctm比较接近await,说明i/O几乎没有等待时间;如果await>svctm,说明I/O队列太长,应用得到的响应时间变慢,如果响应时间超过了用户可以容许的范围,最直接有效的方法考虑更换更快的硬盘,优化应用,或者升级cpu。通过上面理论解读,看下面的负载
%util 已经达到100,await=11 , await>svctm avgrq –sz avgqu-sz都比较高 rsec/s=36896读操作比较多,磁盘负载有读操作引起。此图截之comm slave库
iostat -c 1 10
输出
主要关注 %iowait 与 %idle