Linux I/O工作原理(下)

磁盘性能指标
衡量磁盘的性能,有五个常见指标:使用率、饱和度、IOPS、吞吐量以及响应时间等。这五个指标,是衡量磁盘性能的基本指标。
使用率:是指磁盘处理 I/O 的时间百分比。过高的使用率(比如超过 80%),通常意味着磁盘 I/O 存在性能瓶颈。
饱和度:是指磁盘处理 I/O 的繁忙程度。过高的饱和度,意味着磁盘存在严重的性能瓶颈。当饱和度为 100% 时,磁盘无法接受新的 I/O 请求。
IOPS(Input/Output Per Second):是指每秒的 I/O 请求数。
吞吐量:是指每秒的 I/O 请求大小。
响应时间:是指 I/O 请求从发出到收到响应的间隔时间。

这里要注意的是,使用率只考虑有没有 I/O,而不考虑 I/O 的大小。换句话说,当使用率是 100% 的时候,磁盘依然有可能接受新的 I/O 请求。

在分析性能问题时,不要孤立地去比较某一指标,而要结合读写比例、I/O 类型(随机还是连续)以及 I/O 的大小,综合来分析。

举个例子,在数据库、大量小文件等这类随机读写比较多的场景中,IOPS 更能反映系统的整体性能;而在多媒体等顺序读写较多的场景中,吞吐量才更能反映系统的整体性能。

一般来说,我们在为应用程序的服务器选型时,要先对磁盘的 I/O 性能进行基准测试,以便可以准确评估,磁盘性能是否可以满足应用程序的需求。
这一方面,推荐用性能测试工具 fio ,来测试磁盘的 IOPS、吞吐量以及响应时间等核心指标。但还是那句话,因地制宜,灵活选取。在基准测试时,一定要注意根据应用程序 I/O 的特点,来具体评估指标。

磁盘 I/O 观测
iostat 是最常用的磁盘 I/O 性能观测工具,它提供了每个磁盘的使用率、IOPS、吞吐量等各种常见的性能指标,当然,这些指标实际上来自 /proc/diskstats。

# -d -x表示显示所有磁盘I/O的指标
[root@iZ2zeinb1j2xz9m1rtf1eoZ ~]# iostat -d -x 1
Linux 4.18.0-147.5.1.el8_1.x86_64 (iZ2zeinb1j2xz9m1rtf1eoZ) 	10/02/2021 	_x86_64_	(1 CPU)

Device            r/s     w/s     rkB/s     wkB/s   rrqm/s   wrqm/s  %rrqm  %wrqm r_await w_await aqu-sz rareq-sz wareq-sz  svctm  %util
vda              0.01    0.35      0.29      4.01     0.00     0.06   0.16  14.94    1.37    1.56   0.00    39.54    11.47   0.41   0.01

Device            r/s     w/s     rkB/s     wkB/s   rrqm/s   wrqm/s  %rrqm  %wrqm r_await w_await aqu-sz rareq-sz wareq-sz  svctm  %util
vda              1.00    0.00      8.00      0.00     0.00     0.00   0.00   0.00    1.00    0.00   0.00     8.00     0.00   1.00   0.10

Device            r/s     w/s     rkB/s     wkB/s   rrqm/s   wrqm/s  %rrqm  %wrqm r_await w_await aqu-sz rareq-sz wareq-sz  svctm  %util
vda              0.00    1.00      0.00      8.00     0.00     1.00   0.00  50.00    0.00    0.00   0.00     0.00     8.00   1.00   0.10

Device            r/s     w/s     rkB/s     wkB/s   rrqm/s   wrqm/s  %rrqm  %wrqm r_await w_await aqu-sz rareq-sz wareq-sz  svctm  %util
vda              0.00    0.00      0.00      0.00     0.00     0.00   0.00   0.00    0.00    0.00   0.00     0.00     0.00   0.00   0.00

Device            r/s     w/s     rkB/s     wkB/s   rrqm/s   wrqm/s  %rrqm  %wrqm r_await w_await aqu-sz rareq-sz wareq-sz  svctm  %util
vda              0.00    0.00      0.00      0.00     0.00     0.00   0.00   0.00    0.00    0.00   0.00     0.00     0.00   0.00   0.00

Linux I/O工作原理(下)
%util ,是磁盘 I/O 使用率;
r/s+ w/s ,就是 IOPS;
rkB/s+wkB/s ,就是吞吐量;
r_await+w_await ,就是响应时间。

在观测指标时,也别忘了结合请求的大小( rareq-sz 和 wareq-sz)一起分析
从 iostat 并不能直接得到磁盘饱和度。事实上,饱和度通常也没有其他简单的观测方法,不过,可以把观测到的,平均请求队列长度或者读写请求完成的等待时间,跟基准测试的结果(比如通过 fio)进行对比,综合评估磁盘的饱和情况。

进程 I/O 观测
iostat 只提供磁盘整体的 I/O 性能数据,并不能知道具体是哪些进程在进行磁盘读写。要观察进程的 I/O 情况,使用 pidstat 和 iotop 这两个工具。pidstat加上 -d 参数,可以看到进程的 I/O 情况,如下所示:

[root@iZ2zeinb1j2xz9m1rtf1eoZ ~]# pidstat -d 1
Linux 4.18.0-147.5.1.el8_1.x86_64 (iZ2zeinb1j2xz9m1rtf1eoZ) 	10/02/2021 	_x86_64_	(1 CPU)

10:02:36 PM   UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s iodelay  Command
10:02:37 PM     0     10969      0.00      3.96      0.00       0  AliYunDun

从 pidstat 的输出你能看到,它可以实时查看每个进程的 I/O 情况,包括下面这些内容。
用户 ID(UID)和进程 ID(PID) 。
每秒读取的数据大小(kB_rd/s) ,单位是 KB。
每秒发出的写请求数据大小(kB_wr/s) ,单位是 KB。
每秒取消的写请求数据大小(kB_ccwr/s) ,单位是 KB。
块 I/O 延迟(iodelay),包括等待同步块 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 的时钟百分比等。

本文章用于学习记录使用,如有类同侵权告知删除。

上一篇:LeetCode104 | 二叉树的最大深度


下一篇:Kubernetes部署通用手册 (支持版本1.19,1.18,1.17,1.16)