大家了解到 Linux 存储系统 I/O 栈由文件系统层(file system layer)、通用块层( general block layer)和设备层(device layer)构成。
其中,通用块层是 Linux 磁盘 I/O 的核心。向上,它为访问文件系统和应用程序的块设备提供了标准接口;向下,它将各种异构磁盘设备抽象为一个统一的块设备,并响应文件系统和应用程序发送的 I/O。
一:Linux 磁盘性能指标
五个常见指标:利用率、饱和度、IOPS、吞吐量和响应时间。
1:利用率(Utilization):磁盘处理 I/O 的时间百分比。过度使用(如超过 80%)通常意味着磁盘 I/O 存在性能瓶颈。
2:饱和度(Saturation):指磁盘处理 I/O 的繁忙程度。过度饱和意味着磁盘存在严重的性能瓶颈。当饱和度为 100% 时,磁盘无法接受新的 I/O 请求。
3:IOPS(Input/Output Per Second):指每秒 I/O 请求的数量。
4:吞吐量(Throughput):每秒 I/O 请求的大小。
5:响应时间(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 不能直接获取磁盘的饱和度。事实上,通常没有什么简单的方法可以测量饱和度。
三:进程 I/O 观察
要观察进程的 I/O,可以使用 pidstat 和 iotop 工具。
$ pidstat -d 1
13:39:51 UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command
13:39:52 102 916 0.00 4.00 0.00 0 rsyslogd
1:用户 ID UID 和进程 ID PID。
2:每秒读取的数据大小 kB_rd/s,以 KB 为单位。
3:每秒发出的写请求数据的大小(kB_wr/s),单位为KB。
4:每秒取消写入请求的数据大小 kB_ccwr/s,以 KB 为单位。
5:块 I/O 延迟 iodelay,包括等待同步块(synchronized block)I/O 和换入块(swap-in block)I/O 完成的时间,以时钟周期为单位。
使用 pidstat 实时查看进程磁盘 I/O 外,还有一个磁盘性能分析的常用方法是根据 I/O 大小对进程进行排序。
iotop 工具。它是一个类似于 top 的工具,您可以按 I/O 大小对进程进行排序,并找到具有更大 I/O 的进程。
$ iotop
Total DISK READ : 0.00 B/s
Total DISK WRITE : 7.85 K/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
15055 be/3 root 0.00 B/s 7.85 K/s 0.00 % 0.00 % systemd-journald
输出可以看到,前两行分别代表进程的磁盘读写总大小和磁盘的实际读写总大小。由于缓存、缓冲区、I/O 合并等因素,它们可能不相等。
剩下的部分从各个角度代表了进程的 I/O 情况,包括 线程 ID、I/O 优先级、每秒磁盘读取大小、每秒磁盘写入大小、换入百分比和等待 I/O 时钟百分比。