25-基础篇:Linux磁盘I/O是怎么工作的(下)





磁盘性能指标

磁盘性能的衡量标准,有五个:使用率、饱和度、IOPS、吞吐量、响应时间

  1. 使用率是指磁盘处理I/O的时间百分比
    过高的使用率(比如超过 80%),通常意味着磁盘I/O存在性能瓶颈
  2. 饱和度,是指磁盘处理I/O的繁忙程度
    过高的饱和度,意味着磁盘存在严重的性能瓶颈
    当饱和度为100% 时,磁盘无法接受新的I/O请求
  3. IOPS(Input/Output Per Second)是指每秒的I/O请求数
  4. 吞吐量是指每秒的I/O请求大小
  5. 响应时间是指I/O请求从发出到收到响应的间隔时间

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

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

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

在为应用程序的服务器选型时,要先对磁盘的I/O性能进行基准测试,以便可以准确评估,磁盘性能是否可以满足应用程序的需求

fio性能测试工具,用来测试磁盘的IOPS、吞吐量以及响应时间等核心指标
在基准测试时,一定要注意根据应用程序I/O的特点,来具体评估指标

需要测试出,不同I/O大小(一般是512B至1MB中间的若干值)分别在随机读、顺序读、随机写、顺序写等各种场景下的性能情况

用性能工具得到的这些指标,可以作为后续分析应用程序性能的依据
一旦发生性能问题,就可以把它们作为磁盘性能的极限值,进而评估磁盘I/O的使用情况




磁盘I/O观测

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

# -d -x 表示显示所有磁盘 I/O 的指标
[root@local_sa_192-168-1-6 ~]# iostat -d -x 1
Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
vda               0.00     0.06    0.00    0.53     0.03     4.49    17.08     0.00    1.08    3.79    1.07   0.49   0.03
vdb               0.00     0.15    0.00    0.27     0.00     1.71    12.60     0.00    2.78    7.60    2.77   0.60   0.02

##
Device           表示磁盘设备的名字
%util            就是磁盘I/O使用率
r/s、w/s         就是 IOPS
rkB/s、wkB/s     就是吞吐量
r_await、w_await 就是响应时间

##
在观测指标时,可以结合请求的大小(rareq-sz和wareq-sz)一起分析

image-20211217111416909

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




进程I/O观测

除了每块磁盘的I/O情况,每个进程的I/O情况也是需要关注的重点

上面提到的iostat只提供磁盘整体的I/O性能数据
缺点在于,并不能知道具体是哪些进程在进行磁盘读写
要观察进程的I/O情况,可以使用pidstat和iotop这两个工具


pidstat查看进程的I/O情况

[root@local_sa_192-168-1-6 ~]# pidstat -d 1
11时20分16秒   UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
11时20分17秒     0      8537      0.00      7.84      0.00  PM2 v4.4.0: God
11时20分17秒     0      9115      0.00      3.92      0.00  node /data/node
11时20分17秒     0     10568      0.00      3.92      0.00  node /data/node
##
时间
用户ID(UID)
进程ID(PID)
每秒读取的数据大小(kB_rd/s)单位是KB
每秒发出的写请求数据大小(kB_wr/s)单位是KB
每秒取消的写请求数据大小(kB_ccwr/s)单位是KB
##
块I/O延迟(iodelay),包括等待同步块I/O和换入块I/O结束的时间,单位是时钟周期

iotop根据I/O大小对进程排序

[root@local_sa_192-168-1-6 ~]# iotop
Total DISK READ :	0.00 B/s | Total DISK WRITE :      35.06 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
10576 be/4 root        0.00 B/s    3.90 K/s  0.00 %  0.00 % node /data/node/mahjong/robot/main.js [node]
 9123 be/4 root        0.00 B/s    3.90 K/s  0.00 %  0.00 % node /data/node/mahjong/room/main.js [node]
 5548 be/4 root        0.00 B/s    3.90 K/s  0.00 %  0.00 % mongod -f /data/mongodb/mongod_5000/mongod.yaml [ftdc]
##
前两行分别表示,进程的磁盘读写大小总数和磁盘真实的读写大小总数
因为缓存、缓冲区、I/O合并等因素的影响,它们可能并不相等
##
剩下的部分,则是从各个角度来分别表示进程的I/O情况,包括线程ID、I/O优先级
每秒读磁盘的大小、每秒写磁盘的大小、换入和等待I/O的时钟百分比等



小结

常用IOPS、吞吐量、 使用率、饱和度以及响应时间等几个指标,来评估磁盘的I/O性能

可以用iostat获得磁盘的I/O情况,也可以用pidstat、iotop等观察进程的I/O情况
不过在分析这些性能指标时,要注意结合读写比例、I/O类型以及I/O大小等,进行综合分析


posted @ 2021-12-17 11:44  李成果  阅读(168)  评论(0编辑  收藏  举报