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
相关产品推荐
相关产品推荐

