监控磁盘IO性能的工具

时间:2020-01-09 10:42:37  来源:igfitidea点击:

最多存储监视工具。
如何通过示例监视磁盘IO性能。
如何在Linux上检查磁盘读写情况。
使用iostat,vmstat和其他工具检查和监视Linux中的磁盘IO统计信息和磁盘状态。
如何在Linux中按进程ID监视磁盘IO。
存储监控工具。
通过示例获取Linux中磁盘读写操作的详细信息。

在本文中,将介绍各种工具以及用于监视Linux环境中磁盘IO性能的示例。

提示:

我正在运行一个虚拟进程,以使用如下所示的dd命令和压力工具执行一些读取和写入操作。

# while true; do cp loadfile loadfile1; done

1. iostat-报告磁盘IO统计信息

isoatat是sysstat rpm的一部分。
我们可以根据环境使用" yum"或者任何其他工具来安装" sysstat"。

# rpm -q sysstat
sysstat-10.1.5-17.el7.x86_64

iostat总结了每个磁盘的I/O统计信息,提供了IOPS,吞吐量,I/O请求时间和利用率的指标。
它可以由任何用户执行,通常是第一个用于监视磁盘io性能并在命令行上调查磁盘IO统计信息和问题的命令。

iostat提供了许多用于定制输出的选项。
一个有用的组合是-dxz 1,仅显示磁盘利用率(-d),扩展列(-x),跳过零度量标准的设备(-z)和每秒输出。

# iostat -dxz 1
Linux 3.10.0-1062.9.1.el7.x86_64 (rhel-fews-cc)         01/07/2017      _x86_64_        (32 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.28     1.35    2.34    8.52    36.45   510.13   100.68     0.06    5.36    3.79    5.79   0.17   0.18
dm-0              0.00     0.00    0.95    0.06     3.81     0.23     8.00     0.00    2.10    1.60   10.66   0.62   0.06
dm-1              0.00     0.00    1.65    9.81    30.58   509.90    94.31     0.06    5.32    6.07    5.19   0.12   0.14
dm-2              0.00     0.00    1.65    9.81    30.58   509.90    94.31     0.06    5.32    6.07    5.19   0.12   0.14
dm-3              0.00     0.00    1.65    9.80    30.63   508.68    94.17    10.69  933.11   12.15 1088.51   0.16   0.18

这些列概述了所应用的工作负载。
我们可以查看iostat手册页以了解每一列的含义。

2. vmstat-报告虚拟内存统计信息

vmstat是另一个监视工具,它是procps-ng rpm的一部分。
很有可能默认情况下在Linux节点上安装了" procps-ng",或者我们也可以使用" yum"手动安装它。

# rpm -q procps-ng
procps-ng-3.3.10-23.el7.x86_64

vmstat报告有关进程,内存,页面调度,块IO,陷阱,磁盘和cpu活动的信息。
其中我们将使用vmstat监视Linux中的磁盘IO性能,并使用-d间隔1秒。

# vmstat -d 1 1
disk- ------------reads------------ ------------writes----------- -----IO-----
       total merged sectors      ms  total merged sectors      ms    cur    sec
sda   667530  12447 7660380 2108711 91090178 3458386 12047478760 1506891675      0  11791
dm-0  607338      0 4858728 1760585 206130      0 1649040 5723571      0   1245
dm-1   72135      0 2626562  466444 94344918      0 12045847864 1574232872      0  11050
dm-2   72135      0 2626562  466583 94344918      0 12045847864 1574410699      0  11050
dm-3   72240      0 2630178  905647 94422613      0 12046752440 3064011073      9  12087
dm-4       0      0       0       0      0      0       0       0      0      0

获取有关磁盘活动的摘要磁盘IO统计信息

# vmstat -D 1 1
            6 disks
            3 partitions
      1492064 total reads
        12447 merged reads
     20407898 read sectors
      5711511 milli reading
    374572389 writes
      3460667 merged writes
  48208708608 written sectors
   7759736862 milli writing
            0 inprogress IO
        47247 milli spent IO

请关注vmstat的手册页,以获取受支持参数的完整列表,我们可以使用它们来监视系统资源。

3. iotop-监视磁盘IO速度

iotop专门获取磁盘统计信息,是iotop rpm的一部分。
我们可以根据环境使用" yum"或者任何其他工具来安装" iotop"。

# rpm -q iotop
iotop-0.6-4.el7.noarch

iotop监视Linux内核(需要2.6.20或者更高版本)输出的磁盘I/O使用情况信息,并按系统上的进程或者线程显示当前I/O使用情况表。

使用--onlyiotop将仅显示实际在执行I/O的进程或者线程,而不显示所有进程或者线程,因此我们可以检查和监视磁盘IO性能。

# iotop --only
Total DISK READ :       0.00 B/s | Total DISK WRITE :    1103.25 M/s
Actual DISK READ:       0.00 B/s | Actual DISK WRITE:     699.93 K/s
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND
15091 be/4 root        0.00 B/s  965.33 M/s  0.00 % 99.99 % cp loadfile loadfile1
29926 be/4 root        0.00 B/s    0.00 B/s  0.00 % 15.49 % [kworker/u64:0]
 3312 be/3 root        0.00 B/s  137.92 M/s  0.00 %  0.09 % [jbd2/dm-3-]

4. nmon-监视系统统计信息

nmon在RHEL/CentOS的默认存储库中不可用。
我们可以从EPEL存储库进行安装。
在RHEL/CentOS 7上安装整个EPELrepo

# rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

并在CentOS/RHEL 8上安装EPEL REPO

# rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm

接下来,我们可以使用yum命令安装nmon

# yum install nmon

另外,我们也可以手动安装nmon工具

# rpm -Uvh https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/n/nmon-16g-3.el7.x86_64.rpm

nmon可以显示CPU,内存,网络,磁盘(迷你图形或者数字),文件系统,NFS,主要进程,资源(Linux版本和处理器)以及Power微分区信息。

从终端执行nmon

# nmon

只显示磁盘使用情况统计信息,请按D键。

┌nmon─16g─────────────────────Hostname=rhel-fews-cc─Refresh= 2secs ───18:29.30──────────┐
│ Disk I/O ──/proc/diskstats────mostly in KB/s─────Warning:contains duplicates──────────│
│DiskName Busy    Read    Write       Xfers   Size  Peak%  Peak=R+W    InFlight         │
│sda       61%     62.0 240088.7KB/s 3712.48 64.7KB  580% 3316396.1KB/s148              │
│sda1       0%      0.0      0.0KB/s    0.0   0.0KB    0%       0.0KB/s  0              │
│sda2       0%      0.0      0.0KB/s    0.0   0.0KB    0%       0.0KB/s  0              │
│sda3      61%     62.0 240088.7KB/s 3712.48 64.7KB  580% 3316396.1KB/s148              │
│dm-0       0%     62.0      0.0KB/s   15.5   4.0KB   58%    1559.6KB/s  0              │
│dm-1      61%      0.0 242871.9KB/s 3794.90 64.0KB  580% 3314548.6KB/s218              │
│dm-2      61%      0.0 242871.9KB/s 3794.90 64.0KB  580% 3314548.6KB/s218              │
│dm-3      61%      0.0  14779.6KB/s  230.92 64.0KB  580% 3145026.3KB/s2181             │
│Totals Read-MB/s=0.2      Writes-MB/s=957.7    Transfers/sec=15261.0                   │
└───────────────────────────────────────────────────────────────────────────────────────┘

要使用图来显示磁盘使用情况统计信息

┌nmon─16g──────[H for help]───Hostname=rhel-fews-cc─Refresh= 2secs ───18:25.12──────────┐
│ Disk I/O ──/proc/diskstats────mostly in KB/s─────Warning:contains duplicates──────────│
│DiskName Busy  Read WriteMB|0          |25         |50          |75       100|         │
│sda       60%    0.4  563.8|RWWWWWWWWWWWWWWWWWWWWWWWWWWWW>                   |         │
│sda1       0%    0.0    0.0|>                                                |         │
│sda2       0%    0.0    0.0|>                                                |         │
│sda3      59%    0.4  563.8|RWWWWWWWWWWWWWWWWWWWWWWWWWWWW>                   |         │
│dm-0      22%    0.4    0.0|RRRRRRRRRRR>                                     |         │
│dm-1      41%    0.0  568.0|WWWWWWWWWWWWWWWWWWWW>                            |         │
│dm-2      41%    0.0  568.0|WWWWWWWWWWWWWWWWWWWW>                            |         │
│dm-3      60%    0.0  511.9|WWWWWWWWWWWWWWWWWWWWWWWWWWWWW>                   |         │
│Totals Read-MB/s=1.1      Writes-MB/s=2775.4   Transfers/sec=44468.8                   │
└───────────────────────────────────────────────────────────────────────────────────────┘

5.atop-先进的系统和过程监控器

我们可以使用yum再次安装" atop"(假设我们已经安装了EPEL仓库),或者我们可以手动安装" atop"来检查和监视Linux中的磁盘IO性能。

# rpm -Uvh https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/a/atop-2.4.0-4.el7.x86_64.rpm

程序" atop"是一个交互式监视器,用于查看Linux系统上的负载。
我们可以使用atop来按进程监视磁盘IO。
它显示了系统级别上最关键的硬件资源(从性能角度来看)的占用情况,即cpu,内存,磁盘和网络。

# atop

现在按" shift + d"进行磁盘活动,然后按" c"获取完整的命令名称。

PRC |  sys    6.08s |  user   0.05s  | #proc    398  |  #tslpu     1 |  #zombie    0  | #exit      4  |
CPU |  sys      54% |  user      1%  | irq       6%  |  idle   3026% |  wait    114%  | ipc     0.80  |
CPL |  avg1    0.99 |  avg5   43.05  | avg15 866.47  |  csw   122763 |  intr   90675  | numcpu    32  |
MEM |  tot   125.8G |  free  105.4G  | cache  17.8G  |  buff  230.0M |  slab  938.9M  | hptot   0.0M  |
SWP |  tot     3.7G |  free    3.7G  |               |               |  vmcom   2.7G  | vmlim  66.6G  |
LVM |     rhel-root |  busy     69%  | read       0  |  write  65586 |  MBw/s  409.6  | avio 0.10 ms  |
LVM |  pool00_tdata |  busy     66%  | read       0  |  write  63780 |  MBw/s  398.3  | avio 0.10 ms  |
LVM |  pool00-tpool |  busy     66%  | read       0  |  write  63780 |  MBw/s  398.3  | avio 0.10 ms  |
LVM |  pool00_tmeta |  busy      9%  | read     494  |  write      0 |  MBw/s    0.0  | avio 1.87 ms  |
DSK |           sda |  busy     69%  | read     494  |  write  61302 |  MBw/s  398.5  | avio 0.11 ms  |
NET |  transport    |  tcpi       3  | tcpo       2  |  udpi       0 |  udpo       0  | tcpao      0  |
  PID   TID S  DSK COMMAND-LINE (horizontal scroll with <- and -> keys)                             1/4
12652     - S  76% -bash
 3312     - S  24% jbd2/dm-3-8
27272     - S   0% kworker/u64:3
16016     - D   0% kworker/u64:1
29926     - S   0% kworker/u64:0
16287     - E   0% cp
16290     - E   0% cp

6. collectl-收集描述当前系统状态的数据

CentOS/RHEL的内部存储库中没有collectl,因此我们可以自己安装EPEL存储库,然后使用yum安装collectl或者手动安装它。

# rpm -Uvh https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/c/collectl-4.3.0-5.el7.noarch.rpm

collectl将收集描述当前系统状态的数据。
我们可以使用collectl来检查和监视Linux中的磁盘IO性能。
以下命令报告CPU和磁盘IO统计信息。
这里c和d代表CPU和磁盘。

# collectl -scd
waiting for 1 second sample...
#<----CPU[HYPER]-----><----------Disks----------->
#cpu sys inter  ctxsw KBRead  Reads KBWrit Writes
   0   0  7406   3895     92     23 342208   5347
   3   3  2616   2540     20      5  98436    657
   0   0  8802   3496    272     68 516096   8064
   0   0  1174    620     36      9  65536   1024
   2   2  7302   3290    184     46 368640   5760
   2   2 17221   6692    500    125 962688  14885

关注collectl的手册页以查看所有受支持的选项。

7. sar-监视磁盘IO性能

sar是另一种著名且广泛使用的方法,它是sysstat rpm的一部分。
我们可以根据环境使用" yum"或者任何其他工具来安装" sysstat"。

# rpm -q sysstat
sysstat-10.1.5-17.el7.x86_64

sar是一个功能强大的工具,可用于监视所有系统资源。
但是要坚持本文的主题,我们将使用-d监视磁盘IO性能1秒,间隔为1秒。

# sar -d 1 1
Linux 3.10.0-1062.9.1.el7.x86_64 (rhel-fews-cc)         01/07/2017      _x86_64_        (32 CPU)
06:43:44 PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
06:43:45 PM    dev8-0   6274.00    400.00 796672.00    127.04    142.20     22.64      0.16    100.00
06:43:45 PM  dev253-0     50.00    400.00      0.00      8.00      0.00      0.08      0.08      0.40
06:43:45 PM  dev253-1   6225.00      0.00 796800.00    128.00    143.10     22.96      0.16    100.00
06:43:45 PM  dev253-2   6225.00      0.00 796800.00    128.00    143.11     22.96      0.16    100.00
06:43:45 PM  dev253-3      0.00      0.00      0.00      0.00   4285.03      0.00      0.00    100.00

我们可以查看本文以了解所有这些列以及sarksar支持的其他选项。

8. blktrace-生成磁盘I/O的跟踪

blktraceblktracerpm的一部分,应在默认存储库中可用。
我们可以根据环境使用yum命令或者其他工具进行安装。

# rpm -qa | grep blktrace
blktrace-1.0.5-8.el7.x86_64

blktrace是用于跟踪块I/O事件的专用实用程序

每个I/O都打印了多个事件行。
我们还可以按进程监视磁盘IO。
这些列是:

  • 设备主要,次要编号

  • CPU编号

  • 序列号

  • 动作时间,以秒为单位

  • 进程ID

  • 动作标识符(请参阅blkparse(1)):Q ==排队,G ==获取请求,P ==插入,M ==合并,D ==发出,C ==完成,等等。

  • RWBS描述(请参阅本章前面的" rwbs"部分):W ==写,S ==同步,等等。

  • 地址+大小[装置]

# btrace /dev/sda
  8,3    3    50080    29.219400645 24545  A   W 86921600 + 128 <- (253,1) 85174656
  8,0    3    50081    29.219400796 24545  A   W 95783296 + 128 <- (8,3) 86921600
  8,0    3    50082    29.219400987 24545  Q   W 95783296 + 128 [kworker/u64:3]
  8,0    3    50083    29.219401336 24545  G   W 95783296 + 128 [kworker/u64:3]
  8,0    3    50084    29.219401617 24545  I   W 95783296 + 128 [kworker/u64:3]
  8,0    3    50085    29.219401811 24545  D   W 95783296 + 128 [kworker/u64:3]
<Output trimmed>
CPU0 (8,0):
 Reads Queued:         312,    9,460KiB  Writes Queued:       1,430,   91,400KiB
 Read Dispatches:      198,    9,460KiB  Write Dispatches:    1,430,   91,460KiB
 Reads Requeued:         0               Writes Requeued:         0
 Reads Completed:      198,    9,460KiB  Writes Completed:    1,430,   91,460KiB
 Read Merges:          114,    5,176KiB  Write Merges:            0,        0KiB
 Read depth:            34               Write depth:           255
 IO unplugs:           167               Timer unplugs:           0
<Output trimmed>
Throughput (R/W): 3,714KiB/s/67,320KiB/s
Events (8,0): 227,220 entries
Skips: 0 forward (0 -   0.0%)

执行结束时,我们将获得磁盘统计信息摘要以及读取和写入操作的吞吐量详细信息。

" Perf tools"是基于Linuxperf_events(又名perf)和ftrace的性能分析工具。

9. perf-tools:iolatency

" iolatency"将直方图概括了块设备的I/O延迟,并且是" perf-tools"的一部分,我们可以从以下位置下载" iolatency"脚本

# wget https://raw.githubusercontent.com/brendangregg/perf-tools/master/iolatency

提供对下载脚本的可执行权限

# chmod u+x iolatency

接下来,使用-Q选项执行脚本,以启用排队时间。
-Q选项通过基于block_rq_insert而不是block_rq_issue进行跟踪来包括块I/O排队时间:

# ./iolatency -Q
Tracing block I/O. Output every 1 seconds. Ctrl-C to end.
  >=(ms) .. <(ms) : I/O |Distribution | 0 -> 1       : 32       |#                                     |
       1 -> 2       : 0        |                                      |
       2 -> 4       : 0        |                                      |
       4 -> 8       : 0        |                                      |
       8 -> 16      : 0        |                                      |
      16 -> 32      : 5605     |######################################|
      32 -> 64      : 156      |##                                    |
^C
Ending tracing...

此处磁盘延迟介于16 32毫秒之间。

我们可以在官方github页面上获得有关iolatency的更多示例。

10. perf-tools:iosnoop-按进程监视磁盘IO

iosnoop是perf-tools中的另一个工具。
我们可以从以下路径下载iosnoop脚本

# wget https://raw.githubusercontent.com/brendangregg/perf-tools/master/iosnoop

提供对下载脚本的可执行权限

# chmod u+x iosnoop

它将跟踪磁盘I/O,包括延迟在内的详细信息。
其中我使用-p提供了cp命令的PID,其中ionoop将显示通过进程ID监视磁盘IO的等待时间值。

# ./iosnoop -p $(pidof cp)
Tracing block I/O issued by PID 14823. Ctrl-C to end.
COMM         PID    TYPE DEV      BLOCK        BYTES     LATms
cp           8893   W    8,0      1214026496   524288    24.65
cp           8893   W    8,0      1214027520   524288    24.74
cp           8893   W    8,0      1214028544   524288    24.82
cp           8893   W    8,0      1214029568   524288    24.90
cp           8893   W    8,0      1214030592   524288    24.99
^C
Ending tracing...

有关更多示例和支持的选项列表,我们可以查看官方的github页面

11. BPF工具

传统的性能工具可提供有关存储I/O的一些见解,包括IOPS速率,平均延迟和队列长度以及按进程的I/O。

BPF跟踪工具可以提供有关磁盘状态的更多信息,并可以用于Linux中的磁盘IO性能。

11.1 BPF前提条件

我们必须安装在rpms以下才能使用BPF

  • bcc

  • bpftool

  • bpftrace

可以从系统存储库中安装bcc
确保bccrpm版本与加载的内核版本匹配。
因此,我们可以将两个rpm一起安装

# yum install bcc kernel

接下来安装bpftoolsbpftrace以能够监视磁盘IO性能

# curl https://repos.baslab.org/bpftools.repo

这将下载repo文件并将其放置在/etc/yum.repos.d/bpftools.repo中。
现在,我们可以使用yum安装bpftracebpftools

# yum install bpftool bpftrace

有关安装bpftool和bpftrace的更多信息

11.2 biolatency

" biolatency"是一个BCC和" bpftrace"工具,用于显示磁盘IO统计信息,并以直方图表示延迟。
术语设备等待时间是指从向设备发出请求到完成的时间,包括在操作系统中排队的时间。
我们可以使用" biolatency"来检查磁盘统计信息并监视磁盘IO性能。

" biolatency"中的" -D"选项分别显示磁盘统计信息的直方图,以了解每种类型的性能。

# /usr/share/bcc/tools/biolatency -D
Tracing block device I/O... Hit Ctrl-C to end.
^C  <-- Press Ctrl+C after waiting for few seconds/minutes disk = 'sda' usecs : count distribution 0 -> 1          : 0        |                                        |
         2 -> 3          : 0        |                                        |
         4 -> 7          : 0        |                                        |
         8 -> 15         : 0        |                                        |
        16 -> 31         : 0        |                                        |
        32 -> 63         : 127      |                                        |
        64 -> 127        : 1101     |                                        |
       128 -> 255        : 3190     |**                                      |
       256 -> 511        : 3855     |**                                      |
       512 -> 1023       : 5222     |***                                     |
      1024 -> 2047       : 9027     |** ***                                   |
      2048 -> 4095       : 23773    |** **** **** *****                         |
      4096 -> 8191       : 1256     |                                        |

此输出显示内部磁盘/dev/sda的磁盘IO统计信息,I/O延迟通常在128到4095微秒之间

11.3 biosnoop

" biosnoop"是一个BCC和" bpftrace"工具,可为每个磁盘IO统计信息打印单行摘要。
它为每个磁盘IO统计信息打印一行输出,包括延迟(从设备问题到完成的时间)的详细信息。

这使我们可以更详细地检查磁盘IO性能:

# /usr/share/bcc/tools/biosnoop -Q
TIME(s)     COMM           PID    DISK    T SECTOR     BYTES  QUE(ms) LAT(ms)
0.000000    kworker/u64:1  4434   sda     W 708680704  65536     0.00  101.43
0.000097    kworker/u64:1  4434   sda     W 708680832  65536     0.00  101.52
0.000190    kworker/u64:1  4434   sda     W 708680960  65536     0.00  101.61
0.000252    kworker/u64:1  4434   sda     W 708681088  65536     0.00  101.66
0.000265    kworker/u64:1  4434   sda     W 708681216  65536     0.00  101.67
0.000285    kworker/u64:1  4434   sda     W 708681344  65536     0.00  101.68

" biosnoop"列为:

  • TIME:秒的I/O完成时间

  • COMM:进程名称(如果已缓存)

  • PID:进程ID,如果已缓存

  • DISK:存储设备名称

  • T:类型:R ==读,W ==写

  • SECTOR:磁盘上的地址,以512字节扇区为单位

  • BYTES:I/O的大小

  • LAT(ms):从设备问题到设备完成的I/O持续时间

11.4 biotop

" biotop"是一个类似于" top"的BCC工具,但在Linux中用于获取磁盘统计信息和磁盘IO统计信息。

biotop [options] [interval [count]]

选项包括:

  • -C:不要清除屏幕

  • -r ROWS:要打印的行数

# /usr/share/bcc/tools/biotop -C
Tracing... Output every 1 secs. Hit Ctrl-C to end
23:23:37 loadavg: 2.17 1.58 0.91 4/630 6711
PID    COMM             D MAJ MIN DISK       I/O  Kbytes  AVGms
5702   kworker/u64:2    W 8   0   sda       3285  210240   2.62
6120   kworker/u64:0    W 8   0   sda        486   31104  23.37
6709   cp               W 8   0   sda         18    9088  39.43
5702   kworker/u64:2    R 8   0   sda         36     144   1.48

列表顶部是kworker线程启动写操作:这是后台写刷新,并且此时还不知道弄脏页面的实际过程。

11.5 bitesize

bitesize是一个BCC和bpftrace工具,用于显示磁盘IO统计信息的大小。

# /usr/share/bcc/tools/bitesize
Tracing block I/O... Hit Ctrl-C to end.
^C
Process Name = kworker/u65:0
     Kbytes              : count     distribution
         0 -> 1          : 8        |** **** **** **** **** **** **** **** **** **** **|
Process Name = jbd2/dm-3-8
     Kbytes              : count     distribution
         0 -> 1          : 6        |** **** **** **** **** **** **** **** **** **** **|

该输出显示磁盘状态,即kworker线程和jbd2都在调用I/O,大部分在0到1 KB范围内。

11.6 ext4slower

ext4slower跟踪ext4文件系统并检查ext4文件系统的磁盘IO性能,然后仅打印那些超过阈值的磁盘统计信息。

其他文件系统的bcc中也存在类似的工具:btrfsslowerxfsslowerzfsslower
还有fileslower,它在VFS层上工作并跟踪所有内容(尽管开销更高)。

# /usr/share/bcc/tools/ext4slower
Tracing ext4 operations slower than 10 ms
TIME     COMM           PID    T BYTES   OFF_KB   LAT(ms) FILENAME
16:55:38 dd             23317  W 512     319      18446744073708.55 dummy_file

其中我在另一个终端上运行一个" dd"命令,以模拟人造磁盘IO统计信息