You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux环境下Dell R720搭配PERC H310 Mini控制器与Seagate Nytro SAS SSD执行BLKDISCARD时出现I/O错误的排查求助

Linux环境下Dell R720搭配PERC H310 Mini控制器与Seagate Nytro SAS SSD执行BLKDISCARD时出现I/O错误的排查求助

大家好,我最近遇到了一个SSD相关的I/O错误问题,想请各位帮忙分析排查:

我手里有一台Dell R720服务器,搭配的是PERC H310 Mini(LSI 2008 MegaRAID)控制器,刚装上4块全新的Seagate Nytro XS1600LE70045 1.6TB SAS SSD,目前把它们配置成独立磁盘,用来做Linux软件RAID(先别纠结软件RAID和硬件RAID的优劣,这个话题和当前问题无关)。

目前的情况是:

  • 单盘的读写操作都正常,没有报错
  • 分区和格式化Ext4也能成功,但格式化过程中会触发一条内核错误,日志如下:
[15962.216694] sd 0:0:3:0: [sdd] tag#0 FAILED Result: hostbyte=DID_ERROR driverbyte=DRIVER_OK
[15962.216698] sd 0:0:3:0: [sdd] tag#0 CDB: Unmap/Read sub-channel 42 00 00 00 00 00 00 00 18 00
[15962.216699] print_req_error: I/O error, dev sdd, sector 27469824
  • 用smartctl -a检查硬盘,没有发现任何硬件层面的错误

更严重的是,当我组装RAID设备并尝试格式化时,这个错误会爆发成几千条,这些错误看起来像是超时,每隔1秒就会出现在内核日志里,还会拖慢和硬盘的其他通信,包括smartctl命令的执行速度。

我用strace分析了mkfs.ext4的执行过程:

  • 在单个分区上执行时,BLKDISCARD调用失败后,mkfs.ext4就不再重试了
  • 在md设备上执行时,第一次BLKDISCARD返回0,但之后会发出更多BLKDISCARD命令,而内核驱动这边全部失败

我的内核版本是Linux 4.19.23 x86_64。

现在我除了头疼格式化要等几十分钟(最后还是能成功)之外,更担心的是:是不是我的硬件或软件链路根本无法正确执行BLKDISCARD命令?如果是这样的话,SSD的性能恐怕会大打折扣。有没有人了解Dell R720+PERC H310 Mini+SAS Nytro硬盘(硬盘是12Gbps规格,但控制器是6Gbps)+Linux 4.19.23这个组合,执行BLKDISCARD(也就是TRIM)会不会有兼容性问题?


更新信息

  • PERC H310控制器的固件版本是20.13.3-0001
  • 后来了解到TRIM是SATA专属命令,SAS硬盘并不支持,对应的SAS命令是UNMAP,我用命令行工具sg_unmap测试也失败了,报了同样的I/O错误:
$ sg_unmap --lba=1 --num=1 -f /dev/sdb
unmap: transport: Host_status=0x07 [DID_ERROR]
sg_unmap failed: Transport error

对应的dmesg日志:

[ 1284.253975] sd 0:0:1:0: [sdb] tag#0 FAILED Result: hostbyte=DID_ERROR driverbyte=DRIVER_OK
[ 1284.253979] sd 0:0:1:0: [sdb] tag#0 CDB: Unmap/Read sub-channel 42 00 00 00 00 00 00 00 18 00
[ 1284.253981] print_req_error: I/O error, dev sdb, sector 0
  • 我还换了Kernel 4.19.307测试,情况没有任何改善

相关硬件信息(lshw输出)

*-pci:3
description: PCI bridge
product: Xeon E5/Core i7 IIO PCI Express Root Port 2c
vendor: Intel Corporation
physical id: 2.2
bus info: pci@0000:00:02.2
version: 07
width: 32 bits
clock: 33MHz
capabilities: pci msi pciexpress pm normal_decode bus_master cap_list
configuration: driver=pcieport
resources: irq:24 ioport:f000(size=4096) memory:dd000000-ddffffff
*-storage
description: RAID bus controller
product: MegaRAID SAS 2008 [Falcon]
vendor: LSI Logic / Symbios Logic
physical id: 0
bus info: pci@0000:03:00.0
logical name: scsi0
version: 03
width: 64 bits
clock: 33MHz
capabilities: storage pm pciexpress vpd msi msix bus_master cap_list rom
configuration: driver=megaraid_sas latency=0
resources: irq:26 ioport:fc00(size=256) memory:ddffc000-ddffffff memory:ddf80000-ddfbffff memory:dd000000-dd01ffff
...
*-disk:1
description: SCSI Disk
physical id: 0.1.0
bus info: scsi@0:0.1.0
logical name: /dev/sdb
size: 1490GiB (1600GB)
capabilities: gpt-1.00 partitioned partitioned:gpt
configuration: guid=f46bd41c-6e46-4c0c-b19f-ea2d3fe79f86

strace跟踪结果

单分区上执行mkfs.ext4的关键日志:

ioctl(3, BLKDISCARDZEROES, 0)           = 0
pread(3, "01\245\5\0\200\211\26\231y \1\256\6.\26%1\245\5\0\0\0\0\2\0\0\0\2\0\0\0"..., 1024, 1024) = 1024
close(3)                                = 0
access("/var/lib/e2fsprogs", W_OK)      = -1 ENOENT (No such file or directory)
open("/dev/sdd4", O_RDWR|O_EXCL)        = 3
stat("/dev/sdd4", {st_mode=S_IFBLK|0660, st_rdev=makedev(8, 52), ...}) = 0
ioctl(3, BLKDISCARDZEROES, 0)           = 0
ioctl(3, BLKROGET, 0)                   = 0
mmap(NULL, 376832, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f06c4527000
ioctl(3, BLKDISCARD, {0, 7ffc9a2a78a0}) = -1 EIO (Input/output error)
pwrite(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 3072, 1024) = 3072

md设备上执行mkfs.ext4的关键日志:

ioctl(3, BLKDISCARDZEROES, 0)           = 0
pread(3, "\0\0\24\0\0\360O\0003\377\3\0\257\2N\0\365\377\23\0\0\0\0\0\2\0\0\0\2\0\0\0"..., 1024, 1024) = 1024
close(3)                                = 0
access("/var/lib/e2fsprogs", W_OK)      = -1 ENOENT (No such file or directory)
open("/dev/md125", O_RDWR|O_EXCL)       = 3
stat("/dev/md125", {st_mode=S_IFBLK|0660, st_rdev=makedev(9, 125), ...}) = 0
ioctl(3, BLKDISCARDZEROES, 0)           = 0
ioctl(3, BLKROGET, 0)                   = 0
uname({sys="Linux", node="cildat1", ...}) = 0
ioctl(3, BLKDISCARD, {0, 7ffd8c6d0930}) = 0
write(1, "Discarding device blocks: ", 26Discarding device blocks: ) = 26
write(1, "   4096/5238784", 15   4096/5238784)         = 15
write(1, "\10\10\10\10\10\10\10\10\10\10\10\1) = 150\10", 15
ioctl(3, BLKDISCARD, {1000000, 7ffd8c6d0930})

备注:内容来源于stack exchange,提问作者M Conrad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 08:53:01