如何限制 RAID1 中 NVME SSD 上的 ZFS 写入以避免磁盘快速磨损?

如何限制 RAID1 中 NVME SSD 上的 ZFS 写入以避免磁盘快速磨损?

目前我在 ZFS 上运行 Proxmox 5.3-7,其中有几个空闲的 Debian 虚拟机。我在 RAID 1 中使用两个 SSDPE2MX450G7 NVME 驱动器。运行此设置 245 天后,SMART 值非常糟糕。

SMART/Health Information (NVMe Log 0x02, NSID 0xffffffff)
Critical Warning:                   0x00
Temperature:                        27 Celsius
Available Spare:                    98%
Available Spare Threshold:          10%
Percentage Used:                    21%
Data Units Read:                    29,834,793 [15.2 TB]
Data Units Written:                 765,829,644 [392 TB]
Host Read Commands:                 341,748,298
Host Write Commands:                8,048,478,631
Controller Busy Time:               1
Power Cycles:                       27
Power On Hours:                     5,890
Unsafe Shutdowns:                   0
Media and Data Integrity Errors:    0
Error Information Log Entries:      0

我试图调试是什么消耗了这么多的写入命令,但是失败了。iotop显示平均写入速度为 400kB/s,峰值为 4MB/s。

我尝试运行 zpool iostat 并且结果看起来也不错。

zpool iostat rpool 60
capacity operations bandwidth
pool alloc free read write read write

rpool 342G 74.3G 0 91 10.0K 1.95M
rpool 342G 74.3G 0 90 7.80K 1.95M
rpool 342G 74.3G 0 107 7.60K 2.91M
rpool 342G 74.3G 0 85 22.1K 2.15M
rpool 342G 74.3G 0 92 8.47K 2.16M
rpool 342G 74.3G 0 90 6.67K 1.71M

1我决定通过回显/proc/sys/vm/block_dump和查看来查看写入/var/log/syslog。结果如下:

Jan 25 16:56:19 proxmox kernel: [505463.283056] z_wr_int_2(438): WRITE block 310505368 on nvme0n1p2 (16 sectors)
Jan 25 16:56:19 proxmox kernel: [505463.283058] z_wr_int_0(436): WRITE block 575539312 on nvme1n1p2 (16 sectors)
Jan 25 16:56:19 proxmox kernel: [505463.283075] z_wr_int_1(437): WRITE block 315902632 on nvme0n1p2 (32 sectors)
Jan 25 16:56:19 proxmox kernel: [505463.283096] z_wr_int_4(562): WRITE block 460141312 on nvme0n1p2 (8 sectors)
Jan 25 16:56:19 proxmox kernel: [505463.283108] z_wr_int_4(562): WRITE block 460141328 on nvme0n1p2 (16 sectors)
Jan 25 16:56:19 proxmox kernel: [505463.283271] z_null_iss(418): WRITE block 440 on nvme1n1p2 (8 sectors)
Jan 25 16:56:19 proxmox kernel: [505463.283315] z_null_iss(418): WRITE block 952 on nvme1n1p2 (8 sectors)
Jan 25 16:56:19 proxmox kernel: [505463.283348] z_null_iss(418): WRITE block 878030264 on nvme1n1p2 (8 sectors)
Jan 25 16:56:19 proxmox kernel: [505463.283378] z_null_iss(418): WRITE block 878030776 on nvme1n1p2 (8 sectors)
Jan 25 16:56:19 proxmox kernel: [505463.283409] z_null_iss(418): WRITE block 440 on nvme0n1p2 (8 sectors)
Jan 25 16:56:19 proxmox kernel: [505463.283442] z_null_iss(418): WRITE block 952 on nvme0n1p2 (8 sectors)
Jan 25 16:56:19 proxmox kernel: [505463.283472] z_null_iss(418): WRITE block 878030264 on nvme0n1p2 (8 sectors)
Jan 25 16:56:19 proxmox kernel: [505463.283502] z_null_iss(418): WRITE block 878030776 on nvme0n1p2 (8 sectors)
Jan 25 16:56:19 proxmox kernel: [505463.289562] z_wr_iss(434): WRITE block 460808488 on nvme1n1p2 (24 sectors)
Jan 25 16:56:19 proxmox kernel: [505463.289572] z_wr_iss(434): WRITE block 460808488 on nvme0n1p2 (24 sectors)
Jan 25 16:56:19 proxmox kernel: [505463.457366] z_wr_iss(430): WRITE block 460808744 on nvme1n1p2 (24 sectors)
Jan 25 16:56:19 proxmox kernel: [505463.457382] z_wr_iss(430): WRITE block 460808744 on nvme0n1p2 (24 sectors)
Jan 25 16:56:19 proxmox kernel: [505463.459003] z_wr_iss(431): WRITE block 460809000 on nvme1n1p2 (24 sectors)

等等。有什么方法可以限制写入次数吗?如您所见,写入的数据单元非常多,我陷入了困境,因为我不知道如何限制它。

答案1

您的实际写价被夸大的原因有很多。让我们来标出一些基本点:

  • 首先,让我们设定一个基线:从您的zpool iostat输出中,我们可以推断出每个镜像分支的连续写入流约为 1.5 MB/s。因此,在 245 天内,总共写入了 1.5*86400*245 = 32 TB;

  • 上述数字已经考虑了 ZFSrecordsize写入放大和由于首先写入 ZIL,然后在 txg_commit(对于小于的写入zfs_immediate_write_sz)而导致的双重数据写入。

鉴于上述情况,为了减少 ZFS 引起的写入放大,您应该:

  • 设置较小recordsize(即:16K);

  • logbias=throughput

  • 设置compression=lz4(按照@poige 的建议)

编辑:为了更正确地估计写入放大,请显示输出nvme intel smart-log-add /dev/nvme0

答案2

除了已经给出的减少建议之外recordsize——没有理由不使用 LZ4 压缩(zfs set compression=lz4 …默认情况下,从而进一步减小尺寸(有时非常显著)。

答案3

一些項目...

如果这是租用的服务器,那么提供商不负责设备的健康状况吗?

您的 ZFS 文件系统 ashift 值、池 txg_timeout 和其他一些参数可能需要检查。

相关内容