Linux 的磁盘 I/O 性能监测
Linux 存储系统 I/O 栈由文件系统层(file system layer)、通用块层( general block layer)和设备层(device layer)构成。
其中,通用块层是 Linux 磁盘 I/O 的核心。向上,它为访问文件系统和应用程序的块设备提供了标准接口;向下,它将各种异构磁盘设备抽象为一个统一的块设备,并响应文件系统和应用程序发送的 I/O。
在本文中,我们来看看磁盘的性能指标以及如何查看这些指标。
Linux 磁盘性能指标
利用率(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 观察
# -d -x的意思是打印磁盘的IO性能的详细信息
[root@m01 ~]# iostat -d -x 1
Linux 3.10.0-1160.el7.x86_64 (m01) 04/29/2022 _x86_64_ (1 CPU)
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 129.59 2.04 180.61 77.55 88322.45 967.96 0.32 1.78 0.50 1.79 0.60 11.02
dm-0 0.00 0.00 2.04 172.45 77.55 87771.43 1006.92 0.30 1.73 0.50 1.74 0.49 8.57
dm-1 0.00 0.00 0.00 137.76 0.00 551.02 8.00 0.51 3.72 0.00 3.72 0.18 2.45
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 323.76 0.00 557.43 0.00 272598.02 978.06 0.85 1.42 0.00 1.42 0.57 31.88
dm-0 0.00 0.00 0.00 547.52 0.00 278304.95 1016.59 0.81 1.38 0.00 1.38 0.51 27.82
dm-1 0.00 0.00 0.00 347.52 0.00 1390.10 8.00 0.63 1.80 0.00 1.80 0.12 4.06
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 476.53 0.00 788.78 0.00 387089.80 981.50 1.10 1.47 0.00 1.47 0.54 42.96
dm-0 0.00 0.00 0.00 740.82 0.00 378253.06 1021.18 1.07 1.52 0.00 1.52 0.53 39.59
dm-1 0.00 0.00 0.00 511.22 0.00 2044.90 8.00 0.57 1.11 0.00 1.11 0.07 3.57
%util 是我们前面提到的磁盘 I/O 使用情况 r/s 和 w/s 是 IOPS rkB/s 和 wkB/s 是吞吐量 r_await 和 w_await 是响应时间
您可能已经注意到 iostat 不能直接获取磁盘的饱和度。事实上,通常没有什么简单的方法可以测量饱和度。但是,您可以将观察到的平均请求队列长度或完成读写请求的等待时间与基准测试(例如通过 fio)的结果进行比较,以综合评估磁盘饱和度。
进程 I/O 观察
除了每个磁盘的 I/O 情况,每个进程的 I/O 情况也是大家关注的重点。
[root@m01 ~]# pidstat -d 1
Linux 3.10.0-1160.el7.x86_64 (m01) 04/29/2022 _x86_64_ (1 CPU)
12:37:07 AM UID PID kB_rd/s kB_wr/s kB_ccwr/s Command
12:37:08 AM 998 655 700.99 0.00 0.00 chronyd
12:37:08 AM 0 697 1287.13 0.00 0.00 NetworkManager
12:37:08 AM 0 39905 0.00 498102.97 0.00 dd
12:37:08 AM UID PID kB_rd/s kB_wr/s kB_ccwr/s Command
12:37:09 AM 998 655 122.45 0.00 0.00 chronyd
12:37:09 AM 0 39905 0.00 512677.55 0.00 dd
12:37:09 AM 0 39909 228.57 0.00 0.00 pidstat
^C
用户 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 的进程。
[root@m01 ~]# iotop
Total DISK READ : 0.00 B/s | Total DISK WRITE : 0.00 B/s
Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 0.00 B/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
39295 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.01 % [kworker/0:2]
1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % systemd --switched-root --system --deserialize 22
2 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kthreadd]
从该输出可以看到,前两行分别代表进程的磁盘读写总大小和磁盘的实际读写总大小。由于缓存、缓冲区、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 大小等综合分析。
Linux 网络状态工具 ss 命令详解
万字好文,最全 VxLAN 知识详解
除每周二、四、六定期更新的《Linux云计算一站式教程》以外,其余时间雷哥会推送一些工作中遇到的小知识、实战经验总结的文章。后续都会收录在“实战经验”合集中。
拉到最下方,给我“发消息”
看完本文有收获?请分享给更多人
推荐关注「Cloud研习社」,您的在看、关注、转发就是我的动力
点个在看你最好看