计算和验证磁盘接收了多少 I/O 的最佳方法是什么?

计算和验证磁盘接收了多少 I/O 的最佳方法是什么?

我试图找出我们是否获得了从 SCSI 或 SAN LUN 写入和/或读取数据的预期 I/O?

在这个测试环境中,我有一个 Ubuntu 14.04.5 LTS 服务器,并且从 FC 端口上的 SAN 存储团队获得了单个路径上的单个 LUN。

我们请求了 6000 个 I/O,然而,问题在于我们强烈感觉到请求的 I/O 没有在该 SAN LUN 上收到,但存储团队表示他们已经给出了那么多 I/O。

因此,为了向他们证明他们这边出了问题,我需要知道如何捕获或检查实际收到的 I/O 数量与请求的数量相比是多少?

有人能帮我吗?提前谢谢大家,抱歉我的英语不好。

答案1

要实时监控特定磁盘或分区的读/写吞吐量,可以使用该工具nmon。它显示每个分区/磁盘的绝对数据速率,并估计每个分区/磁盘的繁忙程度(百分比),包括一个漂亮的条形图。

您可以使用以下方式安装:

sudo apt install nmon

之后,可以按 调用它,然后nmonD显示磁盘监视器,也可以按 运行它,NMON=d nmon直接显示磁盘监视器而无需进一步输入。默认情况下,刷新率为 2 秒,但您可以使用参数手动更改-s,例如nmon -s 11 秒。要退出nmon,请按QCtrl+ C

以下是其样例:

┌nmon─14g─────────────────────Hostname=type40mark3──Refresh= 6secs ───16:26.08─┐
│ Disk I/O ──/proc/diskstats────mostly in KB/s─────Warning:contains duplicates─│
│DiskName Busy  Read WriteMB|0          |25         |50          |75       100|│
│sda        0%    0.0    0.0|>                                                |│
│sda1       0%    0.0    0.0|>                                                |│
│sda2       0%    0.0    0.0|>                                                |│
│sda3       0%    0.0    0.0|>                                                |│
│sda4       0%    0.0    0.0|>                                                |│
│sda5       0%    0.0    0.0|>                                                |│
│sdb       49%  230.5    0.0|RRRRRRRRRRRRRRRRRRRRRRRRR                        >│
│sdb1      15%   75.0    0.0|RRRRRRRR                                     >   |│
│sdb2       4%   16.7    0.0|RR    >                                          |│
│sdb3       0%    2.7    0.0|R>                                               |│
│sdb4      30%  135.9    0.0|RRRRRRRRRRRRRRR                         >        |│
│sdb5       0%    0.0    0.0|>                                                |│
│sdb6       0%    0.0    0.0|>                                                |│
│dm-0       0%    0.0    0.0|>                                                |│
│Totals Read-MB/s=460.7    Writes-MB/s=0.1      Transfers/sec=469.0            │                                                                     
└──────────────────────────────────────────────────────────────────────────────┘

或者,如果您只是想对任何磁盘进行“速度测试”,您可以使用该hdparm工具:

sudo hdparm -t /dev/sda

这将从指定设备(此处/dev/sda)读取约 3 秒,然后显示数据速率。请注意,它执行“缓冲读取”,但不使用磁盘缓存。使用-T代替 来-t测试从磁盘缓存读取的速度。

但是您无法通过这种方式测试或确定写入速度。

答案2

I/O 性能将受到块设备配置的影响。有关块设备调优的一个很好的参考是这里其中包括队列深度、I/O 调度程序、预读和分区对齐等设置。请注意,该页面显示的是其存储阵列的默认值;您的默认值可能大不相同。

获取块设备配置,以便您可以在测试后重置它们:

    cat /sys/block/lun0/queue/nr_requests
    cat /sys/block/lun0/queue/scheduler
    cat /sys/block/lun0/queue/read_ahead_kb

设置块设备参数进行测试:

    echo noop > /sys/block/lun0/queue/scheduler

队列深度是块设备所宣传的任何内容,对于顺序读取测试来说并不重要,简单的 NOOP FIFO I/O 调度程序,我们不关心提前读取远程流读取。

以非破坏性的方式检查 IOPS:

    dd if=/dev/lun0 of=/dev/null bs=4k iflag=direct status=progress

其中 /dev/lun0 是多路径虚拟磁盘设备。iflags=direct 绕过服务器的缓存。

6,000 IOPS 和 4k 块大小应提供 24.57 MiB/秒的吞吐量。实际 IOPS 是吞吐量/块大小。在任何具有寻道时间的介质上,随机读取 IOPS 都会更差。使用 4k 块大小,因为测试的是 IOPS,而不是吞吐量,

6,000 IOPS @ 4k 应该是 24.57 MiB/秒(6,000 * 4 KiB)。

相关内容