监测 Linux 的磁盘 I/O 性能
Linux 存储系统 I/O 栈由文件系统层(file system layer)、通用块层( general block layer)和设备层(device layer)构成。
其中,通用块层是 Linux 磁盘 I/O 的核心。向上,它为访问文件系统和应用程序的块设备提供了标准接口;向下,它将各种异构磁盘设备抽象为一个统一的块设备,并响应文件系统和应用程序发送的 I/O。
Linux 磁盘性能指标
在衡量磁盘性能时,我们经常提到五个常见指标:利用率、饱和度、IOPS、吞吐量和响应时间。这五个指标是衡量磁盘性能的基本指标。
- 利用率(Utilization):磁盘处理 I/O 的时间百分比。过度使用(如超过 80%)通常意味着磁盘 I/O 存在性能瓶颈。
-
饱和度(Saturation):指磁盘处理 I/O 的繁忙程度。过度饱和意味着磁盘存在严重的性能瓶颈。当饱和度为 100% 时,磁盘无法接受新的 I/O 请求。
-
IOPS(Input/Output Per Second):指每秒 I/O 请求的数量。
-
吞吐量(Throughput):每秒 I/O 请求的大小。
-
响应时间(Response time):指发送 I/O 请求和接收响应之间的间隔时间。
需要注意的是,关于利用率,我们只考虑有无 I/O,而不考虑 I/O 的大小。也就是说,当利用率为 100% 时,磁盘仍有可能接受新的 I/O 请求。
磁盘 I/O 观察
首先要观察的是每个磁盘的使用情况。iostat
是最常用的磁盘 I/O 性能观察工具。它提供了各种常用性能指标,例如每个磁盘的利用率、IOPS 和吞吐量。当然,这些指标实际上来自 /proc/diskstats
。
以下是iostat
的输出示例:
在上述指标中,您需要注意的是:
%util
是我们前面提到的磁盘 I/O 使用情况r/s
和w/s
是 IOPSrkB/s
和wkB/s
是吞吐量r_await
和w_await
是响应时间
进程 I/O 观察
除了每个磁盘的 I/O 情况,每个进程的 I/O 情况也是大家关注的重点。
上面提到的iostat
只提供了观察磁盘的整体 I/O 性能数据。
缺点是无法知道哪些进程正在读写磁盘。
要观察进程的 I/O,还可以使用 pidstat
和iotop
工具。
例如,要使用 pidstat
从 pidstat 的输出可以看出,它可以实时查看每个进程的 I/O 情况,这包括以下内容:
- 用户 ID (
UID
) 和进程 ID (PID
)。 - 每秒读取的数据大小 (
kB_rd/s
),以 KB 为单位。 - 每秒发出的写请求数据的大小(
kB_wr/s
),单位为KB。 - 每秒取消写入请求的数据大小 (
kB_ccwr/s
),以 KB 为单位。 - 块 I/O 延迟 (
iodelay
),包括等待同步块(synchronized block)I/O 和换入块(swap-in block)I/O 完成的时间,以时钟周期为单位。
除了使用pidstat
实时查看进程磁盘 I/O 外,还有一个磁盘性能分析的常用方法是根据 I/O 大小对进程进行排序。为此,我推荐 iotop
工具。它是一个类似于 top 的工具,您可以按 I/O 大小对进程进行排序,并找到具有更大 I/O 的进程。
结论
Linux 磁盘 I/O 的性能指标和查看性能工具。我们通常使用 IOPS、吞吐量、利用率、饱和度和响应时间等几个指标来评估磁盘的 I/O 性能。
可以使用iostat
获取磁盘的 I/O 情况,也可以使用pidstat
、iotop
等观察进程的 I/O 情况。
但在分析这些性能指标时,要注意结合读写比率、I/O 类型、I/O 大小等综合分析。