在Linux 系统上,iostat 和 iotop 这两个 IO 数据工具非常常用。它们都是性能分析领域中不可缺少的工具性软件。
如果 Linux 系统性能变慢,我们会用 top 命令 来查看系统性能。它被用来检查是什么进程在服务器上占有如此高的使用率,对于大多数 Linux 系统管理员来说很常见,现实世界中被 Linux 系统管理员广泛采用。
如果在进程输出中你没有看到很大的不同,你仍然有选择查看其他东西。比如你可以在 top 输出中检查 wa 状态,因为大多数时间里服务器性能由于在硬盘上的高 I/O 读和写降低了性能。如果它很高或者波动,很可能就是它造成的。因此,我们需要检查硬盘上的 I/O 活动。
我们可以在 Linux 中使用 iotop 和 iostat 命令监控所有的磁盘和文件系统的磁盘 I/O 统计。
iostat 工具是 sysstat 包的一部分,所以我们可以轻松地在包管理器地帮助下安装,因为在所有的 Linux 发行版的仓库都是可以获得的。
对于 Fedora 系统,使用 DNF Command 来安装 sysstat。
$ sudo dnf install sysstat
对于 Debian/Ubuntu 系统,使用 APT-GET Command 或者 APT Command 来安装 sysstat。
$ sudo apt install sysstat
对于基于 Arch Linux 的系统,使用 Pacman Command 来安装 sysstat。
$ sudo pacman -S sysstat
对于 RHEL/CentOS 系统,使用 YUM Command 来安装 sysstat。
$ sudo yum install sysstat
对于 openSUSE Leap 系统,使用 Zypper Command 来安装 sysstat。
$ sudo zypper install sysstat
iostat 命令,是用来展示系统中的 IO 设备和 CPU 使用情况的。它的最大优势在于能汇报所有块设备活动的统计情况,同时也能汇报出 CPU 使用情况。但是 iostat 命令有一个缺陷,就是它不能对每个应用程序进程进行深入分析,只能分析系统的整体情况。
我们先来看 iostat 如何使用,它的使用形式如下:
iostat [选项] [ <时间间隔> [ <次数> ] ]
下面是一些常用选项:
输出内容:
有了这些量化数据,我们就能判断每个硬盘分区的 IO 使用情况,从而分析出哪个设备占用 IO 请求量高或者低、占用时间多少、读取或者写入的数据量有多少。这样,性能瓶颈出现在哪个设备上,我们心中就有数了。
iostat 命令的数据来源,主要的数据来源是 /proc/diskstats 文件,它记录着块设备 IO 操作的全部统计信息。
下面来看一下这个文件的数据结构,它的每一行代表一个块设备或者块设备的分区,总共 20 列数据,每一列的内容如下:
| 序号 | 内容 |
|---|---|
| 1 | 主设备号 |
| 2 | 次设备号 |
| 3 | 设备名 |
| 4 | 已读取IO请求数量 |
| 5 | 读取的合并IO请求数量 |
| 6 | 读取的扇区数 |
| 7 | 读取IO请求的总等待时间(毫秒) |
| 8 | 已写入IO请求数量 |
| 9 | 写入的合并IO请求数量 |
| 10 | 写入的扇区数 |
| 11 | 写入IO请求的总等待时间(毫秒) |
| 12 | 加权的IO请求数量 |
| 13 | 此块设备活动的总时间(毫秒) |
| 14 | 队列中所有IO请求的总等待时间(毫秒) |
| 15 | 已丢弃IO请求数量 |
| 16 | 丢弃的合并IO请求数量 |
| 17 | 丢弃的扇区数 |
| 18 | 丢弃IO请求的总等待时间(毫秒) |
| 19 | 已刷新的IO请求数 |
| 20 | 刷新IO请求的总等待时间(毫秒) |
Linux 块设备层在处理每个 IO 请求的时候,都会更新这些数据。iostat 只使用了其中部分数据。由于这些数据是线性增加的,iostat 只需要经过多次采集,进行简单的运算就可以了。
iostat 只是负责的工作其实很简单,就是采集数据并计算显示。我们通过一段时间的 IO 请求数据、写入和读取的数据量、IO 请求等待时间等等这些数据,就可以评估一个设备的 IO 性能了。

2. 查看所有设备的 I/O 统计

加上设备名可以看到指定的设备 IO 信息:

4. 显示所有设备的详细的 I/O 统计信息

5.
使用时需要 root 权限
对于 Fedora 系统,使用 DNF 命令 来安装 iotop。
$ sudo dnf install iotop
对于 Debian/Ubuntu 系统,使用 API-GET 命令 或者 APT 命令 来安装 iotop。
$ sudo apt install iotop
对于基于 Arch Linux 的系统,使用 Pacman Command 来安装 iotop。
$ sudo pacman -S iotop
对于 RHEL/CentOS 的系统,使用 YUM Command 来安装 iotop。
$ sudo yum install iotop
对于使用 openSUSE Leap 的系统,使用 Zypper Command 来安装 iotop。
$ sudo zypper install iotop
上面的 iostat 工具,只能收集量化到每个块设备的读写情况,但如果我们想知道每个进程是如何使用 IO 的就做不到,这就要用到 iotop 命令了。
iotop 命令是一个 top 类工具,可以监视磁盘 I/O 使用状况,还可以作为 iostat 的升级工具使用。iotop 命令具有与 Linux 系统自带的 top 相似的 Ul,只是 top 更关注进程,而 iotop 更关注 IO。
iotop 命令它是使用 Python 语言编写而成,需要用 Python2.5 以上的版本和 Linux 内核 2.6以上的版本。iotop 提供了源代码和二进制软件包,可以自己选择安装。在前面已经说明了如何安装 ,iotop。
像 iostat 一样,我们一起看看 iotop 如何使用,它的使用形式如下:
iotop [选项]
下面是一些常用选项:
输出内容:
有了这些量化数据,我们就能判断哪些进程是 IO 型进程,哪些进程是计算型进程,每个进程的访问 IO 的数据一目了然。
根据这些数据,我们还能进一步分析出哪个进程使用 IO 的量是高或者低、占用时间多少、进程优先级多少。IO 性能瓶颈出现在哪个进程上,需要优化哪个进程的 IO 模型,我们心中就有底了。
root:~# iotop

2. 以累计方式显示信息
root:~# iotop -a

3. 利用重定向连续记录一段时间的信息
root:~# iotop -b > iotop.txt
^C
root@projectsauron:~# vim iotop.txt

4. 2s 剧新 1 次,刷新三次信息后结束
root:~# iotop -d 2 -n 3