我的软件 RAID6 的 I/O 经常冻结大约 30 秒,之后一切恢复正常。
冻结结束后,这将被放入系统日志中:
Mar 14 18:43:57 server kernel: [35649.816060] sd 5:0:23:0: [sdy] CDB: Read(10): 28 00 6c 52 68 58 00 04 00 00
Mar 14 18:43:58 server kernel: [35651.149020] mptbase: ioc0: LogInfo(0x31140000): Originator={PL}, Code={IO Executed}, SubCode(0x0000) cb_idx mptscsih_io_done
Mar 14 18:43:58 server kernel: [35651.151962] mptscsih: ioc0: task abort: SUCCESS (rv=2002) (sc=ffff8807b02dfe80)
Mar 14 18:43:58 server kernel: [35651.151967] mptscsih: ioc0: attempting task abort! (sc=ffff88002a7f30c0)
Mar 14 18:43:58 server kernel: [35651.151972] sd 5:0:23:0: [sdy] CDB: Read(10): 28 00 6c 52 6c 58 00 04 00 00
Mar 14 18:43:58 server kernel: [35651.151981] mptscsih: ioc0: task abort: SUCCESS (rv=2002) (sc=ffff88002a7f30c0)
Mar 14 18:43:58 server kernel: [35651.151984] mptscsih: ioc0: attempting task abort! (sc=ffff8804120e5ec0)
Mar 14 18:43:58 server kernel: [35651.151988] sd 5:0:23:0: [sdy] CDB: Read(10): 28 00 6c 52 70 58 00 04 00 00
Mar 14 18:43:58 server kernel: [35651.151996] mptscsih: ioc0: task abort: SUCCESS (rv=2002) (sc=ffff8804120e5ec0)
Mar 14 18:43:58 server kernel: [35651.151999] mptscsih: ioc0: attempting task abort! (sc=ffff880154afb280)
Mar 14 18:43:58 server kernel: [35651.152020] sd 5:0:23:0: [sdy] CDB: Read(10): 28 00 6c 52 74 58 00 04 00 00
Mar 14 18:43:58 server kernel: [35651.152029] mptscsih: ioc0: task abort: SUCCESS (rv=2002) (sc=ffff880154afb280)
我用 google 搜索了该错误,有人建议尝试使用 1.5Gbps 而不是 3.0Gbps。使用lsiutil
我改变了链接速度:
# lsiutil -p 1 -i
Firmware Settings
-----------------
SAS WWID: 500605b002c0f680
Multi-pathing: Disabled
SATA Native Command Queuing: Enabled
SATA Write Caching: Enabled
SATA Maximum Queue Depth: 32
Device Missing Report Delay: 0 seconds
Device Missing I/O Delay: 0 seconds
Phy Parameters for Phynum: 0 1 2 3 4 5 6 7
Link Enabled: Yes Yes Yes Yes Yes Yes Yes Yes
Link Min Rate: 1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5
Link Max Rate: 1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5
SSP Initiator Enabled: Yes Yes Yes Yes Yes Yes Yes Yes
SSP Target Enabled: No No No No No No No No
Port Configuration: Auto Auto Auto Auto Auto Auto Auto Auto
Target IDs per enclosure: 1
Persistent mapping: Enabled
Physical mapping type: None
Target ID 0 reserved for boot: No
Starting slot (direct attach): 0
Target IDs (physical mapping): 8
Interrupt Coalescing: Enabled, timeout is 16 us, depth is 4
那没有帮助。
我尝试将“设备丢失 I/O 延迟”更改为 32。这也没有帮助。
我尝试将 /sys/class/scsi_device/*/device/timeout 从 30 更改为 100,然后更改为 3。全部失败。
$ uname -a
Linux server 3.2.0-0.bpo.1-amd64 #1 SMP Sat Feb 11 08:41:32 UTC 2012 x86_64 GNU/Linux
$ grep LSISAS1068E /var/log/messages
Mar 13 15:47:44 server kernel: [ 21.082363] scsi5 : ioc0: LSISAS1068E B3, FwRev=01210000h, Ports=1, MaxQ=483, IRQ=45
$ modinfo mptscsih
filename: /lib/modules/3.2.0-0.bpo.1-amd64/kernel/drivers/message/fusion/mptscsih.ko
version: 3.04.20
license: GPL
description: Fusion MPT SCSI Host driver
author: LSI Corporation
srcversion: 85D42A00FEBA3C95555E3AF
depends: scsi_mod,mptbase
intree: Y
vermagic: 3.2.0-0.bpo.1-amd64 SMP mod_unload modversions
$ cat /sys/block/sdae/device/model
ST3000DM001-9YN1
$ cat /sys/block/sdae/device/rev
CC4C
如果只有读取或写入操作,则该问题极少发生:我可以毫无问题地读取或写入 1 TB。当有以下情况时,问题似乎就会出现两个都读和写操作。在 raid6 上,如果您写入的文件小于条带大小并且尚未缓存条带(在这种情况下必须读取条带以计算新的校验和),则会发生这种情况。
该系统不是虚拟机。
是什么导致了这个问题?如何摆脱这 30 秒的冻结状态?
编辑:附加测试
我找到了一个不错的测试集,似乎引发了这个问题。它包含小于条带大小的文件,从而强制重新计算奇偶校验,从而强制将大量读取与写入结合起来。
我必须承认,我不认为队列调度程序会对这个问题产生任何影响。我错了。很明显,deadline
比其他人差很多。但它们都不能解决问题。
# cat /sys/block/sdaa/queue/scheduler
noop deadline [cfq]
更改调度程序会noop
导致问题在 100-120 秒后出现。
parallel echo noop \> {} ::: /sys/block/sd*/queue/scheduler
更改调度程序会deadline
导致问题在 20-30 秒后出现。
parallel echo deadline \> {} ::: /sys/block/sd*/queue/scheduler
更改调度程序会cfq
导致问题在 120-300 秒后出现。
parallel echo cfq \> {} ::: /sys/block/sd*/queue/scheduler
编辑2
由于调度程序有影响,我在想问题是否是由在一个时间范围内请求太多引起的。我可以以某种方式限制每秒发送的请求数量吗?
答案1
这LSI 的 MPTSCSIH 驱动程序发行说明看起来很有趣。
Major Changes For Version 2.06.75.00-1
Release Date: 12/10/2007
General Changes
Functionality
• Task Aborts for commands to a Volume are returned as FAILED and not sent to FW.
您的驱动程序是哪个版本? ( modinfo mptscsih
)
使用此链接希捷有关 Barracuda 3 TB 硬盘的固件信息。您必须输入序列号才能获取详细信息。
更新:尝试smartctl -i /dev/sdaa
一下我刚刚在 SCSI 和 SATA 上测试了它并通过这种方式获得了序列号。
答案2
您是否尝试过更改 I/O 调度程序?
mccoy:/sys/block/sdb/queue # cat scheduler
noop anticipatory deadline [cfq]
mccoy:/sys/block/sdb/queue # echo noop > scheduler
mccoy:/sys/block/sdb/queue # cat scheduler
[noop] anticipatory deadline cfq
对于“当前”大多数系统来说,默认值通常是 CFQ。
要比较 I/O 调度程序,请执行以下操作:
阅读测试:
# echo 3 > /proc/sys/vm/drop_caches
这将确保您正在测试磁盘而不是 RAM 的缓存页面,这将刷新缓存。
编写测试:
同时多次复制您的文件。一旦写入完成,发出一个sync
如果您正在测试两者,您可能需要在复制完成后drop_caches
致电。sync
除了调度程序之外,每个调度程序还有可调参数。但是,快速测试是更改调度程序并重试。如果您有一个好的控制器,noop
会将“I/O 调度”卸载给它,并且不执行任何操作系统级别的数据调度。
不管怎样,值得一试,而且只需要花点时间echo
就能恢复原样。
答案3
我通过购买SAS2008卡解决了这个问题。它仍然在日志中抱怨一点,但它永远不会阻塞磁盘 I/O。我还测试过它支持 4 TB SATA 驱动器,而 LSI-SAS1068E 仅支持 2 TB。
由于我将把 LSI-SAS1068E 退还给卖家,因此我无法尝试其他建议。因此我在这里结束这个问题。