Linux下的IO监控与分析

近期要在公司内部做个Linux IO方面的培训, 整理下手头的资料给大家分享下

各种IO监视工具在Linux IO 体系结构中的位置

源自 Linux Performance and Tuning Guidelines.pdf

1 系统级IO监控iostat

  iostat -xdm 1 # 个人习惯

%util 代表磁盘繁忙程度。100% 表示磁盘繁忙, 0%表示磁盘空闲。但是注意,磁盘繁忙不代表磁盘(带宽)利用率高

argrq-sz 提交给驱动层的IO请求大小,一般不小于4K,不大于max(readahead_kb, max_sectors_kb)

可用于判断当前的IO模式,一般情况下,尤其是磁盘繁忙时, 越大代表顺序,越小代表随机

svctm 一次IO请求的服务时间,对于单块盘,完全随机读时,基本在7ms左右,既寻道+旋转延迟时间

注: 各统计量之间关系

=======================================

%util = ( r/s + w/s) * svctm / 1000 #队列长度 = 到达率 * 平均服务时间 avgrq-sz = ( rMB/s + wMB/s) * 2048 / (r/s + w/s) # 2048 为 1M / 512

=======================================

总结:

iostat 统计的是通用块层经过合并(rrqm/s, wrqm/s)后,直接向设备提交的IO数据,可以反映系统整体的IO状况,但是有以下2个缺点:

1 距离业务层比较遥远,跟代码中的write,read不对应(由于系统预读 + pagecache + IO调度算法等因素, 也很难对应)

2 是系统级,没办法精确到进程,比如只能告诉你现在磁盘很忙,但是没办法告诉你是谁在忙,在忙什么?

2 进程级IO监控 iotop 和 pidstat (仅rhel6u系列)

iotop 顾名思义, io版的top

pidstat 顾名思义, 统计进程(pid)的stat,进程的stat自然包括进程的IO状况

这两个命令,都可以按进程统计IO状况,因此可以回答你以下二个问题

当前系统哪些进程在占用IO,百分比是多少?占用IO的进程是在读?还是在写?读写量是多少?

pidstat 参数很多,仅给出几个个人习惯

pidstat -d 1 #只显示IO

pidstat -u -r -d -t 1 # -d IO 信息,

# -r 缺页及内存信息 # -u CPU使用率 # -t 以线程为统计单位 # 1 1秒统计一次

iotop, 很简单,直接敲命令

block_dump, iodump

iotop 和 pidstat 用着很爽,但两者都依赖于/proc/pid/io文件导出的统计信息, 这个对于老一些的内核是没有的,比如rhel5u2

因此只好用以上2个穷人版命令来替代:

echo 1 > /proc/sys/vm/block_dump # 开启block_dump,此时会把io信息输入到dmesg中

# 源码: submit_bio@ll_rw_blk.c:3213

watch -n 1 “dmesg -c | grep -oP \”\w+\(\d+\): (WRITE|READ)\” | sort | uniq -c”

见所未见,闻所未闻。

Linux下的IO监控与分析

相关文章:

你感兴趣的文章:

标签云: