缓解libata触发NCQ bug的内核参数(引用自网络)
通常在存储社群都会推荐改用IT模式LSI/Broadcom SAS HBA
稳定是稳定(毕竟驱动也换成mpt*sas),但换来的自然是电老虎SAS HBA卡
对于低功耗环境下得不偿失,且多佔了一个PCI-E卡槽
部分loader型号也对SAS HBA支持度不佳
要在一般SATA接口下要解决/缓解(mitigate)NCQ bug
首先是libata.force的内核参数noncq,对应到kernel parameter(cmdline):libata.force=noncq
选择性关闭特定接口的NCQlibata.force=X.00:noncq,Y.00:noncq,Z.00:noncq…
依此类推
(X、Y对应至dmesg内的ata顺序号)
对SSD关闭NCQ TRIM可以使用:libata.force=noncqtrim
(部分SSD可能需要加入trim_zero?)
对SSD使用noncq也有noncqtrim的效果,但会完全关闭NCQ
寻找ata顺序号的方式(例):
root@NAS:~# dmesg | grep -i ‘ata[0-9]+.00’
[ 12.325844] ata1.00: FORCE: horkage modified (noncq)
[ 12.330834] ata2.00: ATA-9: ST2000NM0033-9ZM175, SN03, max UDMA/133
[ 12.337106] ata2.00: 3907029168 sectors, multi 0: LBA48 NCQ (depth 31/32), AA
[ 12.344246] ata2.00: SN: TESTTEST
[ 12.348548] ata1.00: ATA-8: WDC WD2001FFSX-68JNUN0, 81.00A81, max UDMA/133
[ 12.355429] ata1.00: 3907029168 sectors, multi 0: LBA48 NCQ (not used)
[ 12.361959] ata1.00: SN: WD-TESTTESTTEST
[ 12.366773] ata1.00: configured for UDMA/133
[ 12.371208] ata2.00: configured for UDMA/133
上述为找寻ata顺序号的方式
ata1已使用libata.force=1.00:noncq关闭NCQ,此时dmesg显示:
ata1.00: FORCE: horkage modified (noncq)
ata1.00: 3907029168 sectors, multi 0: LBA48 NCQ (not used)
// 即NCQ关闭成功
另一方式不用重开,直接在系统下对/sys/block…的queue_depth写入1
依照上游记载此方式确实可让libata关闭NCQ
但有硬盘热插拔或不知道盘符(打乱),必须手动寻找并执行的缺点
可在计划任务设定为开机触发echo 1 > /sys/block/sdN/device/queue_depth ; echo 1 > /sys/block/sdM/device/queue_depth ; echo 1…
依此类推
或使用这个script将所有能找到的盘符queue_depth都写入1
优点是重建loader不会有忘记加入kernel parameter造成触发NCQ bug,可当双重保险
但对SSD NCQ TRIM来说就不行了,有回报对queue_depth写入1也无效的情况
只得使用libata内核参数强制关闭NCQ TRIM
另外在/var.defaults/lib/diskaction/diskaction.xml也有列出一些SSD、HDD的缓解措施
不过没有和上游libata-core.c同步的样子,除非自有内核有backport这些黑名单
例如我也怀疑NCQ TRIM bug和这篇遇到Micron 1100降级有关
https://xpenology.com/forum/topic/70001-main-and-important-918-fake-error-from-ssd-most-likely-synology-compatibility-need-2tb-working-urgently-help-please/
从libata-core.c可以看到Micron 1100要关闭NCQ TRIM和启用TRIM以后写入0的功能{ "Micron_1100_*", NULL, ATA_HORKAGE_NO_NCQ_TRIM | ATA_HORKAGE_ZERO_AFTER_TRIM, },
diskaction.xml在消费版本的MX300就有指定关闭TRIM功能,但并未包含Micron 1100
结语:
libata有特定NCQ bug,触发时可能造成硬盘性能异常后被阵列剔除
要检测可以在dmesg寻找有无FPDMA QUEUED错误信息。
解决办法: