文章内容为学习整理笔记,绝大部分来源于 倪朋飞 老师的 Linux性能优化实战

一、磁盘性能指标

  说到磁盘性能的衡量标准,必须要提到五个常见指标,也就是我们经常用到的,使用率、饱和度、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 大小(一般是 512B 至 1MB 中间的若干值)分别在随机读、顺序读、随机写、顺序写等各种场景下的性能情况。用性能工具得到的这些指标,可以作为后续分析应用程序性能的依据。一旦发生性能问题,你就可以把它们作为磁盘性能的极限值,进而评估磁盘 I/O 的使用情况。
  了解磁盘的性能指标,只是我们 I/O 性能测试的第一步。接下来,又该用什么方法来观测它们呢?这里,我给你介绍几个常用的 I/O 性能观测方法。

二、观测工具

1、iostat

  第一个要观测的,是每块磁盘的使用情况,即观测磁盘 I/O。iostat 是最常用的磁盘 I/O 性能观测工具,它提供了每个磁盘的使用率、IOPS、吞吐量等各种常见的性能指标,当然,这些指标实际上来自 /proc/diskstats。
  iostat更多用法请阅读:https://www.cpweb.top/2145

# -d -x表示显示所有磁盘I/O的指标
[root@test ~]# iostat -d -x 1
Linux 3.10.0-1160.el7.x86_64 (zabbix)   2021年05月24日     _x86_64_    (8 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               5.45     0.09   11.17  156.12   540.34  5423.33    71.30     3.42   20.47   99.36   14.82   5.92  99.06
scd0              0.00     0.00    0.00    0.00     0.00     0.00   114.22     0.00    0.28    0.28    0.00   0.28   0.00
dm-0              0.00     0.00    1.34    0.11     5.37     0.43     8.00     0.07   48.06   45.41   81.12  39.14   5.68
dm-1              0.00     0.00   15.27  156.11   534.93  5422.89    69.53     4.10   23.86  116.16   14.83   5.69  97.44
dm-2              0.00     0.00   15.27  156.11   534.93  5422.89    69.53     4.10   23.86  116.16   14.83   5.69  97.47
dm-3              0.00     0.00    0.12    0.67     4.19    17.02    53.58     3.38 4265.11  159.02 5022.38  28.51   2.26
dm-4              0.00     0.00    0.00    0.00     0.00     0.00    53.36     0.00    3.38    3.38    0.00   3.15   0.00
dm-6              0.00     0.00   15.15  164.77   530.75  5405.52    65.99     4.20   23.24  120.86   14.26   5.52  99.26

新版本:

[root@test ~]# iostat -V
sysstat 版本 12.2.0
(C) Sebastien Godard (sysstat <at> orange.fr)

[root@test ~]# iostat -h -xd 1 1 sda
Linux 3.10.0-1160.el7.x86_64 (zabbix)   2021年05月24日     _x86_64_    (8 CPU)

     r/s     rkB/s   rrqm/s  %rrqm r_await rareq-sz Device
   11.21    542.3k     5.47  32.8%   99.45    48.4k sda

     w/s     wkB/s   wrqm/s  %wrqm w_await wareq-sz Device
  156.42      5.3M     0.09   0.1%   16.04    34.7k sda

     d/s     dkB/s   drqm/s  %drqm d_await dareq-sz Device
    0.00      0.0k     0.00   0.0%    0.00     0.0k sda

  aqu-sz  %util Device
    3.62  99.1% sda

输出信息含义:

指标 含义
rrqm/s 每秒合并读请求,%rrqm表示合并读请求的百分比
wrqm/s 每秒合并写请求,%wrqm表示合并读请求的百分比
r/s 每秒发送给磁盘的读请求。相当于合并后请求数
w/s 每秒发送给磁盘的写请求。相当于合并后请求数
rkB/s 每秒从磁盘读取的数据量,单位为KB
wkB/s 每秒向磁盘写入的数据量,单位为KB
rareq-sz 平均读请求大小,单位为kB
wareq-sz 平均写请求大小,单位为kB
avgrq-sz 平均请求的大小(以扇区为单位)
avgqu-sz(aqu-sz) 平均请求队列长度
await 处理 I/0 请求的平均时间,这包括队列中的等待时间和设备实际处理时间,以毫秒为单位。
r_await 处理读取请求的平均时间,这包括队列中的等待时间和设备实际处理时间,以毫秒为单位。
w_await 处理写入请求的平均时间,这包括队列中的等待时间和设备实际处理时间,以毫秒为单位。
svctm 处理I/O请求所需的平均时间(不包括等待时间),单位为毫秒,这个字段是不可靠的,将在之后版本删除
%util 磁盘处理I/O的时间百分比

这些指标中,我们要注意:

• %util:就是我们前面提到的磁盘 I/O 使用率。由于可能存在并行I/O,100%并不一定表明磁盘I/O饱和。
• r/s+ w/s:就是 IOPS。
• rkB/s+wkB/s:就是吞吐量。
• r_await+w_await:就是响应时间,相同时间间隔。

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

2、pidstat

  第二个要观测的是,是每个进程的 I/O 情况。这里要用到 pidstat 命令,它可以用来观测进程的cpu、内存、线程、IO及上下文切换等系统资源的占用情况。

[root@test ~]# pidstat -d 1
Linux 3.10.0-1160.el7.x86_64 (zabbix)   2021年05月24日     _x86_64_    (8 CPU)

14时31分50秒   UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s iodelay  Command
14时31分51秒  1000      2387   1345.79   4000.00      0.00       0  mysqld

输出信息含义:

指标 含义
kB_rd/s 进程每秒从磁盘读取的数据量,以KB为单位
kB_wr/s 进程每秒向磁盘写入的数据量,以KB为单位
kB_ccwr/s 任务写入磁盘被取消的速率,以KB为单位
iodelay 块 I/O 延迟,以时钟周期为单位,包括等待同步块 I/O 和换入块 I/O 结束的时间。

3、iotop

iotop。它是一个类似于 top 的工具,你可以按照 I/O 大小对进程排序,然后找到 I/O 较大的那些进程。

[root@zabbix ~]# iotop

Total DISK READ :      11.23 K/s | Total DISK WRITE :       5.59 M/s
Actual DISK READ:      11.23 K/s | Actual DISK WRITE:       7.17 M/s
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN  IO     COMMAND                                                  
 2397  be/4  mysql     0.00 B/s    0.00 B/s  0.00 % 40.63 % mysqld --defaults-file=/etc/my.cnf

输出信息含义:

指标 含义
Total DISK READ 进程对磁盘读的大小总数
Total DISK WRITE 进程对磁盘写的大小总数
Actual DISK READ 进程对磁盘真实读的大小总数
Actual DISK WRITE 进程对磁盘真实写的大小总数
TID 线程 ID
PRIO I/O 优先级
USER 运行用户
DISK READ 每秒读磁盘的大小
DISK WRITE 每秒写磁盘的大小
SWAPIN 换入时间百分比
IO 等待 I/O 的时间百分比
COMMAND 程序运行指令,[ ] 属于内核态的进程,没有 [ ] 的是用户态进程。

  总的来说,前两行分别表示,进程的磁盘读写大小总数和磁盘真实的读写大小总数。因为缓存、缓冲区、I/O 合并等因素的影响,它们可能并不相等。剩下的部分,则是从各个角度来分别表示进程的 I/O 情况,包括线程 ID、I/O 优先级、每秒读磁盘的大小、每秒写磁盘的大小、换入和等待 I/O 的时钟百分比等

发表回复

验证码: 1 + 1 =