Linux 常见 IO 分析工具
记录一次 IO 告警分析过程
接到告警,服务器 IO 飙升,连接服务器,登录服务器查看分析
top 命令查看
首先就是通过 top 命令查看,因为 top 命令最直接,且信息量够大,覆盖面够全,可以看到 CPU 的 wa 有点高
CPU 的 wa 是是 wait,是 CPU 等待时间,通常是由于磁盘 IO 问题引起,当然也有可能是其他原因引起的
top 命令的其他参数就不多介绍了,网上很多,接着看 IO
vmstat
vmstat 是一个很强大的工具,它除了能给出系统在性能方面的 CPU 和内存的统计信息之外,也能提供系统整体上的 I/O 性能情况
可以看到采集的数据中,系统写磁盘 5032 个磁盘块,vmstat 内磁盘块大小为 1024 字节,所以这里系统写磁盘速率约为每秒 4MB,vmstat 中也有 CPU 的 wa 统计,可以看到 23%的时间用来等待 I/O
vmstat 还提供自系统启动以来 I/O 子系统的性能信息
如上图,包括了磁盘数量,分区数量、读/写请求总数,读/写所花费的时间,以及当前正在处理的 I/O 总数(inprogress IO),等待 I/O 完成所花费的毫秒数(milli spent IO),这个是整个系统的 IO 统计信息
说一下合并读和合并写,linux 在读写磁盘时,为了提高性能,内核合并对磁盘相邻区域的请求,这样减少了对磁盘 IO 的操作,从而一定程度上提高 linux 性能
从上面的信息,我们已经可以定位是写磁盘造成的 IO 等待,接着我们需要定位是哪块磁盘造成的
通过-d 参数可以看到更细化的每块磁盘的 IO 信息,如上图,可以看到 vda 的读写请求,特别是写提交比较频繁,接着就可以查看磁盘下单个分区的统计信息
vmstat 虽然提供了详细的信息,但是要能很直观的从统计信息中分辨出问题并不是十分友好
iostat
和 vmstat 相似的,但是专门用来显示磁盘 I/O 统计信息的工具,就是 iostat,iostat 和 vmstat 的块大小不一样,iostat 一般为 512 字节,
iostat 的统计结果默认显示的是传输速率
如图,第一条信息是自系统启动以来的统计信息,第二条开始,为每隔 1 秒的统计数据(由于截图的时候,故障已处理,所以这里其实看起来并没有什么读写),统计数据分别为:
tps 每秒传输次数,该项为每秒对设备/分区读写请求的次数
Blk_read/s 每秒读取磁盘块的速率
Blk_wrtn/s 每秒写入磁盘块的速率
Blk_read 在时间间隔内读取块的总数量
Blk_wrtn 在时间间隔内写入块的总数量
这部分是指 iostat 输出的基本信息,如果想看到更详细的信息,需要用-x 参数
从 iostat 中能更直观的看到那个磁盘在进行大量的读写操作,如果用-x 参数,能看到更多的统计信息
sar
除了上面的工具,sar 也是 linux 下性能分析常用的工具,sar 也比较通用,除了 CPU、内存之外,也能查看关于 I/O 的信息
sar 能看到的 I/O 相关的信息也就是读写速率,而且显示的是设备的主设备号和次设备号,而不是它们的名称
iotop
而其实最简单的方式是使用 iotop,它是一个用来监视磁盘 I/O 使用状况的 top 类工具,可以直观的检测到哪一个程序使用的磁盘 IO 信息
上面的工具,我们需要自己去分析,去查找,iotop 很直观的,按照 I/O 统计展示进程,在运维定位 IO 故障中效率更高,不过,默认系统不自带,需要 yum 安装
此次 I/O 升高是由于 jbd2 引起的,jbd2 是一个文件系统的日志功能,为了保证文件系统的完整性,而引入了这么一个日志功能,会将所有的操作写盘记录日志,这也是为什么刚开始分析看到的磁盘写操作频繁。
网上不少文章有关于 jbd2 引起 I/O 高的分析,认为比较好的是这篇https://cloud.tencent.com/developer/article/1465600,有兴趣的可以看下,里面有多种解决方案
本文主要想介绍服务器遇到 I/O 高的情况的一些分析方法和工具,总结分析思路:
查看系统总体 I/O 性能
查找 I/O 高的驱动器或磁盘
查找引起 I/O 高的进程
查看进程对应的 I/O 操作或系统调用
进行相应的处理或优化
版权声明: 本文为 InfoQ 作者【运维研习社】的原创文章。
原文链接:【http://xie.infoq.cn/article/056fbf0f85ec77d7ce29013c4】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论