CentOS下I/O统计工具
时间:2014-08-09 17:56 来源:linux.it.net.cn 作者:it
Linux 系统管理员,统计各类 IO 是一项必不可少的工作。其统计工具中 iostat 显然又是最重要的一个统计手段。但是这里 iostat 不是本文的重点,因为这个工具的使用在网络上已经有大量的教程,可以供大家参考。这里主要是想介绍一些其他统计工具以来满足不同的需求。
iostat
iostat 的功能异常强大,输出项也特别多,比如下面这个例子:
其各项的含义分别是:
-
rrqm/s: 每秒进行 merge 的读操作数目.即 delta(rmerge)/s
-
wrqm/s: 每秒进行 merge 的写操作数目.即 delta(wmerge)/s
-
r/s: 每秒完成的读 I/O 设备次数.即 delta(rio)/s
-
w/s: 每秒完成的写 I/O 设备次数.即 delta(wio)/s
-
rsec/s: 每秒读扇区数.即 delta(rsect)/s
-
wsec/s: 每秒写扇区数.即 delta(wsect)/s
-
rkB/s: 每秒读 K 字节数.是 rsect/s 的一半,因为每扇区大小为 512 字节.(需要计算)
-
wkB/s: 每秒写 K 字节数.是 wsect/s 的一半.(需要计算)
-
avgrq-sz: 平均每次设备 I/O 操作的数据大小 (扇区).delta(rsect+wsect)/delta(rio+wio)
-
avgqu-sz: 平均 I/O 队列长度.即 delta(aveq)/s/1000 (因为 aveq 的单位为毫秒).
-
await: 平均每次设备 I/O 操作的等待时间 (毫秒).即 delta(ruse+wuse)/delta(rio+wio)
-
svctm: 平均每次设备 I/O 操作的服务时间 (毫秒).即 delta(use)/delta(rio+wio)
-
%util: 一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的.即 delta(use)/s/1000 (因为 use 的单位为毫秒)
如果 %util
接近 100%,说明产生的 I/O 请求太多,I/O 系统已经满负荷,该磁盘可能存在瓶颈.
idle 小于 70% IO 压力就较大了,一般读取速度有较多的 wait.
同时可以结合vmstat
查看查看 b 参数(等待资源的进程数)和 wa 参数(IO 等待所占用的 CPU 时间的百分比,高过 30%时 IO 压力高)
另外 await
的参数也要多和 svctm
来参考。差的过高就一定有 IO 的问题.
avgrq-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.
队列长度(avgqu-sz
)也可作为衡量系统 I/O 负荷的指标,但由于 avgqu-sz
是按照单位时间的平均值,所以不能反映瞬间的 I/O 洪水.
有时间的话,我会单独写几个帖子来说说iostat
。
iodump
iodump 是一个统计每一个进程(线程)所消耗的磁盘 I/O 工具。这个一个 perl 脚本,其原理时打开有关 I/O 的内核记录消息开关,而后读取消息然后分析输出。简单使用步骤如下:
首先下载这个工具
wget http://aspersa.googlecode.com/svn/trunk/iodump
然后打开有关 I/O 内核消息的开关
echo 1 >/proc/sys/vm/block_dump
上述开关打开后,内核会记录下每一个 I/O 操作的消息。我们只需要定时获取并分析就好了,比如下面这样
while true; do sleep 1; dmesg -c ; done |perl iodump
等待一段时间,然后通过ctrl+c
来结束上述脚本,你将获得下面类似的信息:
上述输出的单位为块(block),每块的大小取决于创建文件系统时指定的块大小。比如我这个里的 sda7 的 block 大小是 1KB。
iotop
iotop 是一个 Python 编写的工具,有类似top
工具的 UI,包括一些参数也和top
类似。不过它对系统有一些要求,分别是:
-
Python ≥ 2.5 or Python ≥ 2.4 with the ctypes module
-
Kernel ≥ 2.6.20
-
Kernel uses options:
-
TASK_DELAY_ACCT
-
CONFIG_TASKSTATS
-
TASK_IO_ACCOUNTING
-
CONFIG_VM_EVENT_COUNTERS
如果是基于 RPM 包的系统,可以直接下载编译好的二进制包(here)或者二进制源代码包(here)
如果是 Debian/Ubuntu 系统,直接使用
sudo apt-get install iotop
即可(不得不说,Debian 系统提供的软件真的是相当丰富呀),其他系统则可以通过下面的指令下载源代码,然后编译
git clone git://repo.or.cz/iotop.git
具体的使用方法可以参考 iotop(8)手册,下面是在我机器上的一个显示:
iopp
iopp 是另外一个统计每一个进程 I/O 的工具,使用 C 语言编写,理论上应该比上述两个重狙效率都要高。安装方法很简单,首先通过下面的指令下载源代码:
git://github.com/markwkm/iopp.git
然后分别通过下面的指令编译安装
下面是一个使用例子
上述输出的各项含义是:
-
pid 进程 ID
-
rchar 将要从磁盘读取的字节数
-
wchar 已经写入或应该要写入磁盘的字节数
-
syscr 读 I/O 数
-
syscw 写 I/O 数
-
rbytes 真正从磁盘读取的字节数
-
wbytes 真正写入到磁盘的字节数
-
cwbytes 因为清空页面缓存而导致没有发生操作的字节数
-
command 执行的命令
其中rbytes
,wbytes
,cwbytes
会因给出-k
或者-m
参数,而显示为rkb
,wkb
,cwkb
或rmb
,wmb
,cwmb
。command
一列如果给出-c
的参数则显示完整的命令名而不仅仅只是命令本身。这些参数的使用和top
类似。
更具体的可以参考 iopp(8)手册。
dstat
dstat 号称各种资源统计工具,其目的是想替代vmstat
,iostat
,netstat
,ifstat
等各种单一统计工具,从而做到All in one
。 dstat 用 Python 语言编写。
dstat 能够清晰显示每列的信息,特别是单位及大小很明确,不会在单位换算上犯迷糊和失误。最重要的是,因为它是基于模块化设计,因此我们可以很容易的写一个插件来收集我们需要的统计信息。
另外,dstat 的输出还可以导出为CSV
格式文件,从而可以在电子表格工具里分方便的生成统计图形。
目前 dstat 的插件已经相当多了,这是我机器上目前的输出:
下面给出几个使用的列子(实际输出是带彩色的,很容易识别)
dstat 的缺省输出
指定需要显示的列
指定需要显示的列,并同时将结果导出到文件
更详细的用法,可以参考 dstat(1)手册
(责任编辑:IT)
Linux 系统管理员,统计各类 IO 是一项必不可少的工作。其统计工具中 iostat 显然又是最重要的一个统计手段。但是这里 iostat 不是本文的重点,因为这个工具的使用在网络上已经有大量的教程,可以供大家参考。这里主要是想介绍一些其他统计工具以来满足不同的需求。 iostatiostat 的功能异常强大,输出项也特别多,比如下面这个例子: 其各项的含义分别是:
如果 idle 小于 70% IO 压力就较大了,一般读取速度有较多的 wait.
同时可以结合
另外
队列长度(
有时间的话,我会单独写几个帖子来说说 iodumpiodump 是一个统计每一个进程(线程)所消耗的磁盘 I/O 工具。这个一个 perl 脚本,其原理时打开有关 I/O 的内核记录消息开关,而后读取消息然后分析输出。简单使用步骤如下: 首先下载这个工具
然后打开有关 I/O 内核消息的开关
上述开关打开后,内核会记录下每一个 I/O 操作的消息。我们只需要定时获取并分析就好了,比如下面这样
等待一段时间,然后通过 上述输出的单位为块(block),每块的大小取决于创建文件系统时指定的块大小。比如我这个里的 sda7 的 block 大小是 1KB。 iotop
iotop 是一个 Python 编写的工具,有类似
如果是基于 RPM 包的系统,可以直接下载编译好的二进制包(here)或者二进制源代码包(here) 如果是 Debian/Ubuntu 系统,直接使用
即可(不得不说,Debian 系统提供的软件真的是相当丰富呀),其他系统则可以通过下面的指令下载源代码,然后编译
具体的使用方法可以参考 iotop(8)手册,下面是在我机器上的一个显示: ioppiopp 是另外一个统计每一个进程 I/O 的工具,使用 C 语言编写,理论上应该比上述两个重狙效率都要高。安装方法很简单,首先通过下面的指令下载源代码:
然后分别通过下面的指令编译安装 下面是一个使用例子 上述输出的各项含义是:
其中 更具体的可以参考 iopp(8)手册。 dstat
dstat 号称各种资源统计工具,其目的是想替代 dstat 能够清晰显示每列的信息,特别是单位及大小很明确,不会在单位换算上犯迷糊和失误。最重要的是,因为它是基于模块化设计,因此我们可以很容易的写一个插件来收集我们需要的统计信息。
另外,dstat 的输出还可以导出为 目前 dstat 的插件已经相当多了,这是我机器上目前的输出: 下面给出几个使用的列子(实际输出是带彩色的,很容易识别) dstat 的缺省输出 指定需要显示的列 指定需要显示的列,并同时将结果导出到文件 更详细的用法,可以参考 dstat(1)手册 (责任编辑:IT) |