Linux 存储系统 I/O 栈由文件系统层(file system layer)、通用块层( general block layer)和设备层(device layer)构成。
其中,通用块层是 Linux 磁盘 I/O 的核心。向上,它为访问文件系统和应用程序的块设备提供了标准接口;向下,它将各种异构磁盘设备抽象为一个统一的块设备,并响应文件系统和应用程序发送的 I/O。
在衡量磁盘性能时,我们经常提到五个常见指标:利用率、饱和度、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 请求和接收响应之间的间隔时间。
iostart
iostat 是最常用的磁盘 I/O 性能观察工具。它提供了各种常用性能指标,例如每个磁盘的利用率、IOPS 和吞吐量。当然,这些指标实际上来自 /proc/diskstats。
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
在上述指标中,您需要注意的是:
- %util 是我们前面提到的磁盘 I/O 使用情况
- r/s 和 w/s 是 IOPS
- rkB/s 和 wkB/s 是吞吐量
- r_await 和 w_await 是响应时间
pidstat
不仅可以查看每个磁盘的 I/O 情况,还可以查看每个进程的 I/O 情况
~ 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
从 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 完成的时间,以时钟周期为单位。
iotop
它是一个类似于 top 的工具,您可以按 I/O 大小对进程进行排序,并找到具有更大 I/O 的进程。
~ 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 时钟百分比。
文章来源:https://www.cnaaa.net,转载请注明出处:https://www.cnaaa.net/archives/6275