Отсутствие поддержки TRIM - будут ли тесты постепенно замедляться на ZFS + SSD?
Контекст: я нахожусь на Toshiba 512 ГБ NVMe (модель: KXG50ZNV512G)
Я вижу это странное поведение при тестировании Postgres на ZFS-on-Linux (через pgbench
), где второй и третий прогоны теста прогрессивно медленнее, чем первый прогон.
Вот что происходит:
client=1 | 770 => 697 | 10% reduction in TPS
client=4 | 2717 => 2180 | 24% reduction in TPS
client=8 | 4579 => 3339 | 37% reduction in TPS
client=12 | 4219 => 4175 | 01% reduction in TPS
client=48 | 5902 => 5623 | 05% reduction in TPS
client=96 | 7094 => 6739 | 05% reduction in TPS
Я перезапускаю эти тесты, и первые цифры показывают, что 3-й прогон медленнее, чем 1-й, а 4-й медленнее, чем 3-й.
Может ли это быть вызвано отсутствием поддержки TRIM в ZFS-on-Linux - https://github.com/zfsonlinux/zfs/pull/8255?
2 ответа
Вместо отсутствующей поддержки TRIM (чей дефицит производительности вы часто можете избежать, просто оставив ~10% нераспределенного пространства в конце диска), скорее всего, вас поражает поведение ZFS CoW.
По сути, при работе с пустым набором данных вы можете писать без необходимости чтения / изменения / записи, потому что, ну, вы еще мало что написали. Когда вы действительно переписываете данные (как в следующих тестах), вы будете постепенно увеличивать количество операций чтения / изменения / записи, что приведет к усилению чтения и записи (и снижению производительности).
Чтобы проверить, так ли это, просто используйте zpool iostat
для записи общего числа операций чтения / записи на первых трех запусках: если вы видите, что второй и третий команды передают увеличенное количество переданных байтов, у вас есть подтверждение того, что написано выше.
Вы можете проверить, включена ли ваша автоматическая обрезка в этом пуле.
zpool получает автоматическую обрезку [имя пула]
Включение этого параметра может улучшить производительность. Если нет, вы можете попробовать включить его с помощью:
zpool set autotrim=on [имя пула]
Также может помочь оставление 10% пустого пространства. Однако, если SSD не новый, вам придется сжать существующий раздел, чтобы оставить 10% пустого места. После этого вам также необходимо выполнить команду «blkdiscard» для этого пустого места. Обратите внимание, что blkdiscard — опасная команда, которая может уничтожить существующие данные, если вы введете неправильный адрес. На существующем SSD делать это не рекомендуется.