目录
1.iostat简介
iostat主要用于监控系统设备的IO负载情况,根据这个可以看出当前系统的写入量和读取量,CPU负载和磁盘负载。
iostat属于sysstat软件包,可以通过命令进行安装:
sudo dpkg -i sysstat_11.6.1-1ubuntu0.1_amd64.deb(安装包可以从网上下载)
iostat有以下缺陷:
iostat的输出结果大多数是一段时间内的平均值,因此难以反映峰值情况 iostat仅能对系统整体情况进行分析汇报,却不能针对某个进程进行深入分析。 iostat未单独统计IO处理信息,而是将IO处理时间和IO等待时间合并统计,因此包括await在内的指标并不能非常准确地衡量磁盘性能表现。
2.命令与参数
语法:iostat [ 选项 ] [<时间间隔> <次数> ]
-c: 仅显示CPU统计信息,与-d选项互斥
-d:仅显示磁盘统计信息,与-c选项互斥
-h:使用NFS(Network File System网络文件系统)的输出报告,更加友好可读。需要使用-n参数开启NFS。
-k:以 kb 为单位显示,默认情况下,iostat的输出是以block作为计量单位,加上这个参数可以以kb作为计量单位显示。(该参数仅在linux内核版本2.4以后数据才是准确的)
-m:以 mb 为单位显示(该参数仅在linux内核版本2.4以后数据才是准确的)
-N:显示磁盘阵列(LVM) 信息。
-V:显示版本信息
-x:显示更详细的磁盘报告信息,默认只显示六列,加上该参数后会显示更详细的信息(该参数仅在linux内核版本2.4以后数据才是准确的)
-n:显示NFS(Network File System网络文件系统) 使用情况(该参数仅在linux内核版本2.6.17以后有效)
-t:输出报告时显示系统时间
-p:[ { device [,…] | ALL } ] 显示磁盘分区的相关统计信息(默认粒度只到磁盘,没有显示具体的逻辑分区)
-y:跳过不显示第一次报告的数据,因为iostat使用的是采样统计,所以iostat的第一次输出的数据是自系统启动以来的累计的数据
例如,iostat -d -x -k 1 3:每1s采集一次数据,显示3次,以kb为单位显示磁盘使用情况详细信息。
3.深入解析
avg-cpu段:总体cpu使用情况统计信息,对于多核cpu,这里为所有cpu的平均值(系统开机至此刻平均统计信息)
- %usr CPU在用户模式下的时间百分比(显示用户级(应用程序)执行产生的cpu使用率百分比(理论上一个良好的系统cpu处于user模式下的时间小于60%为优(参考)如果高于70%,可以考虑对应用程序进行优化))
- %nice CPU处在带NICE值的用户模式下的时间百分比
- %system CPU在系统模式下的时间百分比(系统(内核)执行产生的cpu使用率百分比%user+%sys<80%,Sys%>30%时,观察是否有过多的中断或上下文切换)
- %iowait CPU等待输入输出完成时间的百分比(若 %iowait 的值过高,表示硬盘存在I/O瓶颈,iowait% 表示CPU等待IO时间占整个CPU周期的百分比,如果iowait值超过50%,或者明显大于%system、%user以及%idle,表示IO可能存在问题)
- %steal 管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比(是衡量虚拟机CPU的指标,是指分配给本虚拟机的时间片被同一宿主机的其他的虚拟机使用,一般%steal值较高时,说明宿主机的资源使用已到达瓶颈)
- %idle CPU空闲时间百分比(%idle高但系统响应慢,说明cpu在等待分配内存,此时应增加内存容量,idle%过低持续小于10%则说明需要加强cpu)
device段:iostat -d -x sdc 1 1
- r/s:每秒完成的读I/O设备次数
- w/s:每秒完成的写I/O设备次数
- 磁盘IOPS=r/s+w/s(I/O per second,即每秒钟可以处理的I/O个数。随机读写频繁的应用(一般指I/O小于64KB的应用场景),如小文件存储(图片)、OLTP数据库、邮件服务器,关注随机读写性能,IOPS是关键衡量指标。)
- rkb/s:每秒读K字节数
- wkb/s:每秒写K字节数
- 磁盘吞吐量(throughput)=rkB/s+wkB/s(顺序读写频繁的应用,传输大量连续数据,如电视台的视频编辑,视频点播VOD(Video On Demand),关注连续读写性能。数据吞吐量是关键衡量指标。)
- rrqm/s:每秒合并的读操作次数
- wrqm/s:每秒合并的写操作次数
- r_await:每个读操作平均所需的时间(单位ms)(不仅包括硬盘设备读操作的时间,还包括了在kernel队列中等待的时间)
- w_await:每个写操作平均所需的时间(单位ms)(不仅包括硬盘设备写操作的时间,还包括了在kernel队列中等待的时间)
- await=r_await + w_await(磁盘对请求响应时间,可以理解为
IO
的响应时间,一般地系统IO
响应时间应该低于5ms
,如果大于10ms
就比较大了,值越小性能越好) - aqu-sz:平均I/O队列长度,即IO等待个数(数值越低越好,这个值在正常的系统中不应该超过113太多,如果到达了200左右,甚至上千,则说明发生了IO拥塞,而系统还在往I/O队列中放请求(有一个列外是在执行sync,fsync操作时,该值到达最大值8192是正常的),这个值越低越好)
- svctm:表示平均每次设备I/O操作的服务时间(以毫秒为单位)(对于普通硬盘来说,该时间通常不应该超过20ms;如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太长, 系统上运行的应用程序将变慢。)
- util%:单位时间内处理IO的时间比(如果%util值接近100%,则表示设备可能已经满负荷运行了,注意:如果是多硬盘,即使%util值是100%,因为磁盘的并发能力,所以磁盘的使用未必就到达了瓶颈;如果%util接近100%,表示磁盘产生的I/O请求太多,I/O系统已经满负荷的在工作,该磁盘可能存在瓶颈。长期下去,势必影响系统的性能)
- 正常情况下svctm应该是小于await值的,而svctm的大小和磁盘性能有关,CPU、内存的负荷也会对svctm值造成影响,过多的请求也会间接的导致svctm值的增加
-
await
远远高于svctm
,说明IO
等待队列较长,磁盘十分繁忙;而w_await
远高于r_await
,说明是磁盘写入造成的磁盘繁忙。
4.其他
重点关注3个性能核心指标:iops、throughput、await与多个任务指标。
如何通过以上指标数据判断磁盘有没有瓶颈呢?
①查看await值,响应时间是不是长期响应慢,如果是那肯定有问题;
②查看svctm的值与await很接近,说明IO任务提交之后,IO立即响应了,表示几乎没有I/O等待,磁盘性能很好,反之则有问题;
③查看aqu-sz队列值,越小越好,反之差值越大,队列越大,说明有问题;
④查看iops与业务block块大小对比FIO压测数据,看有没有到瓶颈;
⑤将throughput数据相加(或者执行sar -n DEV 1 统计网口流量)与光纤能支持的网络带宽对比,看有没有到网络传输瓶颈。
内存使用率导致问题的判断标准:
无性能压力:0%~50%
有一定性能压力:50%~70%
达到性能阈值:70%~80%
严重性能问题:80%~100%
内存使用率长时间处于95%以上---P1级bug
内存使用率长时间处于90%以上---P2级bug