如何减少 IO 等待时间和重试次数,以便操作系统不会不断尝试写入故障驱动器?
我有一个系统,用于制作演示内容的副本,并将其借给客户并保存到常规 SATA 桌面硬盘上。我们通过 SAS 同时连接多个驱动器,并使用脚本将内容复制到它们。
因为驱动器被借出,有时有些驱动器会损坏,但我不知道它们是否已损坏,因此下次在复制操作中重用该驱动器时,当系统重试该驱动器的 IO 时,它会减慢其他驱动器的速度。有时,我可能需要几个小时才能注意到损坏的驱动器并将其删除。卸下驱动器后,其余驱动器开始以正常速度写入。
我不关心恢复坏驱动器。我只需要清除它们,这样它们就不会减慢其他一切的速度。
我还在研究坏块和 smartmontools,并考虑在开始写作之前对驱动器进行预检查。
操作系统:Ubuntu Linux (12.04 lts)
答案1
我以前没有使用过这个可调参数,但你可能想调整呃_超时(错误处理超时)有问题的驱动器:
[root@localhost device]# cat /sys/block/sda/device/eh_timeout
10
[root@localhost device]#
上面显示sda
设置为 10 秒。来自红帽知识库:
在某些存储配置(例如,具有许多 LUN 的配置)中,SCSI 错误处理代码可能会花费大量时间向无响应的存储设备发出 TEST UNIT READY 等命令。 SCSI 设备对象中添加了新的 sysfs 参数 eh_timeout,该参数允许配置 SCSI 错误处理代码使用的 TEST UNIT READY 和 REQUEST SENSE 命令的超时值。这减少了检查这些无响应设备所花费的时间。 eh_timeout 的默认值为 10 秒,这是添加此功能之前使用的超时值。
答案2
监视/sys/block/<dev>/stat
您感兴趣的设备并比较第 10 个参数 (io_ticks)。
例如,ticks = io_ticks - prev_ticks / seconds_deltatime / 10
这是磁盘用于等待磁盘 io 的可用时间的百分比。
当然,接近 100% 值得检查,或者变得非常聪明,将其与所有磁盘的平均值进行比较,并选择高于平均值的任何磁盘。
请参阅块层统计文档。
或者使用 Munin 之类的东西并将其绘制成图表。如果它超过阈值(例如 90% 或任何您的图表显示的良好警报数字),您可以让 Munin 发出警报。
例如,请参阅这两个 Munin 图,显示 /dev/sdi 需要查看。在此示例中,如果 /dev/sdi 是数组的一部分,则整个数组都会因此受到影响。
如果您查看周图,您会发现 /dev/sdc 也可能很慢。
我应该补充一点,上面的 /dev/sdi 并没有损坏,它只是一个缓慢的磁盘(实际上是一个绿色磁盘,有人添加到企业级SATA磁盘阵列中),这降低了阵列的速度。实际发生故障的磁盘会像拇指酸痛一样突出。
总之,如果有时间的话,我可能会使用脚本,但是如果我只是想要一个快速的解决方案并且连接到服务器很容易,那么 Munin 就可以了。