目前我在 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;上述数字已经考虑了 ZFS
recordsize
写入放大和由于首先写入 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 和其他一些参数可能需要检查。