共计 2005 个字符,预计需要花费 6 分钟才能阅读完成。
在我之前的文章:《探讨 Linux 的磁盘 I/O》中,我谈到了 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 性能进行基准测试,这样才能准确评估磁盘性能,以判断是否能够满足应用的需求。
当然,这需要你在 随机读 、 顺序读 、 随机写 、 顺序写 等各种应用场景下测试不同 I/O 大小(通常是 512B ~ 1MB 之间)的性能。
磁盘 I/O 观察
首先要观察的是每个磁盘的使用情况。iostat 是最常用的磁盘 I/O 性能观察工具。它提供了各种常用性能指标,例如每个磁盘的 利用率 、IOPS 和 吞吐量。当然,这些指标实际上来自 /proc/diskstats
。
以下是 iostat
的输出示例:
在上述指标中,您需要注意的是:
%util
是我们前面提到的磁盘 I/O 使用情况r/s
和w/s
是 IOPSrkB/s
和wkB/s
是吞吐量r_await
和w_await
是响应时间
您可能已经注意到 iostat
不能直接获取磁盘的饱和度。事实上,通常没有什么简单的方法可以测量饱和度。但是,您可以将观察到的 平均请求队列长度 或完成读写请求的等待时间 与基准测试(例如通过 fio)的结果进行比较,以综合评估磁盘饱和度。
进程 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 的进程。
从该输出可以看到,前两行分别代表 进程的磁盘读写总大小 和磁盘的实际读写总大小 。由于 缓存 、 缓冲区 、I/O 合并 等因素,它们可能不相等。
剩下的部分从各个角度代表了进程的 I/O 情况,包括 线程 ID、I/O 优先级 、 每秒磁盘读取大小 、 每秒磁盘写入大小 、 换入百分比 和等待 I/O 时钟百分比。
结论
在本文中,我介绍了 Linux 磁盘 I/O 的性能指标和查看性能工具。我们通常使用 IOPS、吞吐量 、 利用率 、 饱和度 和响应时间 等几个指标来评估磁盘的 I/O 性能。
可以使用 iostat
获取磁盘的 I/O 情况,也可以使用 pidstat
、iotop
等观察进程的 I/O 情况。但在分析这些性能指标时,要注意结合 读写比率 、I/O 类型、I/O 大小 等综合分析。
链接:https://blog.devgenius.io/linux-disk-i-o-performance-1e920faba23
(版权归原作者所有,侵删)