如何在磁盘 Wear 中限制ZFS写入,如何限制在 NVME SSD上写入?

分享于 

6分钟阅读

互联网

 

问题:

目前我正在ZFS上运行 Proxmox 5.3 -7,空闲的debian虚拟机很少。 我在 RAID 1中使用两个 SSDPE2MX450G7 NVME驱动器。 在 245天运行这里设置后,S.M. A.R.T 值非常糟糕。


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 显示 400 kb/s 平均写入 4 mb/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写入;

  • 上面的数字已经考虑到 ZFS recordsize 写入放大和双数据写入,因为首先写入 ZIL,然后是 txg_commit ( 用于小于 zfs_immediate_write_sz的写入)。

要减少zfs引起的写入放大,你应该:

  • 设置一个小 recordsize ( IE: 16 ) ;

  • 设置 logbias=throughput

  • 设置 compression=lz4 ( 如 @poige) 所建议的那样)

编辑:要更准确地估计写入放大,请显示 nvme intel smart-log-add/dev/nvme0


回答 2:

有几个项目。

如果是租用服务器,则供应商不是负责设备健康的供应商?

你的ZFS 文件系统 ashift值。池txg_timeout和一些其他参数可能对评审有意义。


回答 3:

除了已经给出了减少 recordsize —的建议之外,没有理由不使用LZ4压缩( zfs set compression=lz4 … ) 同样,在默认情况下,,从而减少了大小,甚至更高。



磁盘  Limit  RAPI  ZFS  RAID  NVM  
相关文章