在配备 SAS Seagate Nytro 的 Linux Dell R720 上,BLKDISCARD 期间出现 I/O 错误

在配备 SAS Seagate Nytro 的 Linux Dell R720 上,BLKDISCARD 期间出现 I/O 错误

我有一台配备 PERC H310 Mini(LSI 2008 MegaRAID)控制器的 Dell R720,我刚刚在其中装载了 4 个新的 Seagate Nytro XS1600LE70045 1.6TB SSD,配置为 Linux 软件 raid 的单独磁盘。(请暂时忽略软件 raid 与硬件 raid 的争论,解释与主题无关)

我可以顺利地读取和写入所有驱动器,没有任何错误。我可以成功地使用 Ext4 对其进行分区和格式化,但在 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 后,似乎普通分区上的 BLKDISCARD 失败,然后 mkfs.ext4 不再尝试。但是,当它在 md 设备上运行 BLKDISCARD 时,BLKDISCARD 返回 0,然后它发出更多 BLKDISCARD 命令,同时内核驱动程序使它们全部失败。我的内核是 Linux 4.19.23,x86_64

除了必须等待数十分钟才能让所有 I/O 错误流出(mkfs.ext4 最终成功)的烦人问题之外,我想知道这是否意味着我的硬件或软件链中的某些东西根本无法正确发出 BLKDISCARD 命令?在这种情况下,SSD 的性能可能不会那么好。

是否有人知道运行 Linux 4.19.23 的配备 PERC H310 Mini 和 SAS Nytro 驱动器(在本例中为 12GB/秒,连接到 6GB/秒的控制器)的 Dell R720 是否会在发出 BLKDISCARD(修剪)命令时出现问题?

更新

PERC H310 的固件版本为 20.13.3-0001。

TRIM 是 SATA 命令,SAS 驱动器不太可能支持该命令。SAS 等效命令是“UNMAP”,可从命令行实用程序调用sg_unmap。sg_unmap 命令在我的系统上也失败,并出现相同的 I/O 错误。

还使用内核 4.19.307 进行了测试,但没有变化。

sg_unmap

$ sg_unmap --lba=1 --num=1 -f /dev/sdb
unmap: transport: Host_status=0x07 [DID_ERROR]

sg_unmap failed: Transport error
$ dmesg | tail
[ 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

瘦身

        *-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, BLKALIGNOFF, 0)                = 0
ioctl(3, BLKIOMIN, 4096)                = 0
ioctl(3, BLKIOOPT, 0)                   = 0
ioctl(3, BLKPBSZGET, 4096)              = 0
ioctl(3, BLKSSZGET, 512)                = 0
close(3)                                = 0
access("/sys/fs/ext4/features/lazy_itable_init", R_OK) = 0
open("/dev/sdd4", O_RDONLY|O_EXCL)      = 3
stat("/dev/sdd4", {st_mode=S_IFBLK|0660, st_rdev=makedev(8, 52), ...}) = 0
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
stat("/dev/random", {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 9), ...}) = 0
open("/dev/urandom", O_RDONLY|O_CLOEXEC) = 4
fcntl(4, F_GETFD)                       = 0x1 (flags FD_CLOEXEC)
fcntl(4, F_SETFD, FD_CLOEXEC)           = 0
getuid()                                = 0
getppid()                               = 19277
read(4, "(=\233R-\333\371\3*}\357\205\226\31&t", 16) = 16
close(4)                                = 0
gettid()                                = 19281
stat("/dev/random", {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 9), ...}) = 0
open("/dev/urandom", O_RDONLY|O_CLOEXEC) = 4
fcntl(4, F_GETFD)                       = 0x1 (flags FD_CLOEXEC)
fcntl(4, F_SETFD, FD_CLOEXEC)           = 0
getuid()                                = 0
getppid()                               = 19277
read(4, "\264\27\315\3155X\376\220\355\347\353\366\26\237\214!", 16) = 16
close(4)                                = 0
gettid()                                = 19281
write(1, "Creating filesystem with 3781099"..., 65Creating filesystem with 378109952 4k blocks and 94712112 inodes

strace mkfs.ext4在 md 设备上:

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}

答案1

当处于 RAID 模式(IR 模式)时,基于 LSI 2008 的卡(即 PERC H3xx)不支持修剪/丢弃传递。您需要使用 IT 模式下的固件重新刷新卡以启用修剪/丢弃。

但请注意:

  • 你将失去供应商的官方支持
  • 您将无法访问任何 HW-RAID 模式
  • 磁盘/阵列上已存储的所有数据都将丢失
  • 如果刷新过程中出现任何问题,你的卡可能会变砖

因此,如果您真的需要修剪/丢弃,或者您是否可以在 SSD 上保留更多的临时空间以便垃圾收集工作,请小心并再三考虑。

相关内容