1、iostat命令用于查询磁盘I/O使用情况,也可以看到CPU使用情况。从而发现磁盘和CPU性能瓶颈。
2、通常当系统变慢时可iostat定位问题。
3、常用命令:
iostat -c 1 10 , 查看CPU使用情况
iostat -d -k 1 10 , 查看TPS和吞吐量
iostat -d -x -k 1 10 , 查看设备使用率(%util)和响应时间(await)
4、参数解读:
主要看后两个iostat常见命令进行分析,常见情况有:
I/O几乎没有等待时间:svctm 比较接近 await
I/O瓶颈:iowait过大
I/O请求过多: %util 接近 100%
I/O队列太长:await远大于svctm,或者avgqu-sz比较大
CPU空闲:%idle值过高
CPU等待分配内存:%idle值高,但是系统响应慢
CPU处理能力低:%idle持续低于10
5、总结
如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。 idle小于70% IO压力就较大了,一般读取速度有较多的wait。
同时可以结合vmstat 查看查看b参数(等待资源的进程数)和wa参数(IO等待所占用的CPU时间的百分比,高过30%时IO压力高)。
另外 await 的参数也要多和 svctm 来参考。差的过高就一定有 IO 的问题。avgqu-sz 也是个做 IO 调优时需要注意的地方,这个就是直接每次操作的数据的大小,如果次数多,但数据拿的小的话,其实 IO 也会很小。如果数据拿的大,才IO 的数据会高。也可以通过 avgqu-sz × ( r/s or w/s ) = rsec/s or wsec/s。也就是讲,读定速度是这个来决定的。
svctm 一般要小于 await (因为同时等待的请求的等待时间被重复计算了),svctm 的大小一般和磁盘性能有关,CPU/内存的负荷也会对其有影响,请求过多也会间接导致 svctm 的增加。await 的大小一般取决于服务时间(svctm) 以及 I/O 队列的长度和 I/O 请求的发出模式。如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;如果 await 远大于 svctm,说明 I/O 队列太长,应用得到的响应时间变慢,如果响应时间超过了用户可以容许的范围,这时可以考虑更换更快的磁盘,调整内核 elevator 算法,优化应用,或者升级 CPU。