Назад | Перейти на главную страницу

Как ограничить запись ZFS на твердотельный накопитель NVME в RAID1, чтобы избежать быстрого износа диска?

В настоящее время я запускаю Proxmox 5.3-7 на ZFS с несколькими неработающими виртуальными машинами debian. Я использую два диска SSDPE2MX450G7 NVME в массиве RAID 1. После 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 КБ / с с выбросами 4 МБ / с.

Я пробовал запустить 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)

и так далее. Есть ли способ ограничить количество записей? Как видите, написанные единицы данных возмутительны, и я застрял, потому что у меня нет идей, как их ограничить.

В дополнение к уже данным советам по сокращению recordsize - нет причин не использовать сжатие LZ4 (zfs set compression=lz4 …) также по умолчанию, таким образом уменьшая размер еще больше (а иногда и очень значительно).

Несколько предметов ...

Если это арендованный сервер, разве провайдер не несет ответственности за исправность оборудования?

Значения смещения файловой системы ZFS, пул txg_timeout и некоторые другие параметры могут иметь смысл проверить.

Существуют разные причины, по которым ваши настоящие записи были настолько раздутыми. Отметим базовую точку:

  • Во-первых, позвольте установить базовый уровень: от вашего zpool iostat вывод, мы можем вывести непрерывный поток записи ~ 1,5 МБ / с на каждую из ветвей зеркала. Таким образом, за 245 дней получается 1,5 * 86400 * 245 = 32 ТБ записанных данных;

  • число выше уже учитывает как ZFS recordsize усиление записи и двойная запись данных из-за первой записи в ZIL, затем в txg_commit (для записей меньше zfs_immediate_write_sz).

С учетом сказанного выше, чтобы уменьшить усиление записи, вызванное ZFS, вам следует:

  • установить небольшой recordsize (например: 16 КБ);

  • устанавливать logbias=throughput

  • устанавливать compression=lz4 (как предлагает @poige)

РЕДАКТИРОВАТЬ: чтобы более правильно оценить усиление записи, покажите вывод nvme intel smart-log-add /dev/nvme0