Почему мой пул ZFS тратит 97% своего времени на чтение цели и только 3% на операцию записи?
Это сбивает с толку меня, и я не знаю способа углубиться в то, что на самом деле делает ZFS.
Я использую чистую установку FreeNAS 11.1 с быстрым пулом ZFS (импортированные зеркала на быстрых 7200) и отдельным SSD UFS для тестирования. Конфиг в значительной степени "из коробки".
SSD содержит 4 файла размером 16 -120 ГБ, скопированных с помощью консоли в пул. Пул дедуплицирован (стоит: 4-кратная экономия, размер 12 ТБ на диске), а система имеет много оперативной памяти (128 ГБ ECC) и быстрый Xeon. Памяти вполне достаточно - zdb
показывает, что пул имеет в общей сложности 121M блоков (544 байта каждый на диске, 175 байтов каждый в ОЗУ), поэтому весь DDT составляет всего около 20,3 ГБ (около 1,7 ГБ на ТБ данных).
Но когда я копирую файлы в пул, я вижу это в zpool iostat
:
Это делает цикл из минут чтения низкого уровня и краткого всплеска записей. Прочитанная часть показана на рис. Общая скорость записи для задачи также невелика - пул пуст на 45%/10 ТБ и изначально может записывать со скоростью 300–500 МБ / с.
Не зная, как проверять, я подозреваю, что низкоуровневые чтения - это чтение DDT и других метаданных, так как они не загружаются в ARC (или постоянно выталкиваются из ARC при записи данных файла). Может быть.
Возможно, он обнаружил попадания дедупликации, так что не так много написано, только я не помню ни одной дублированной версии этих файлов, и он делает то же самое из /dev/random, насколько я помню (я проверю это и скоро обновлю). Может быть. Нет настоящей идеи.
Что я могу сделать, чтобы разобраться в том, что происходит более точно, с целью его оптимизации?
Обновление ОЗУ и дедупликация:
Я обновил Q, чтобы показать размер ДДТ после первоначального комментария. ОЗУ дедупликации часто указывается как 5 ГБ на ТБ х 4, но это основано на примере, который действительно не очень подходит для дедупликации. Вы должны рассчитать количество блоков, умноженное на байты на запись. "X 4", часто цитируемый, является просто "мягким" ограничением по умолчанию (по умолчанию ZFS ограничивает метаданные до 25% ARC, если не указано, что нужно использовать больше - эта система предназначена для дедупликации, и я добавил 64 ГБ, которые можно использовать для ускорения кэширование метаданных).
Так что в этом бассейне zdb
подтверждает, что весь ДДТ должен иметь только 1,7 ГБ на ТБ, а не 5 ГБ на ТБ (всего 20 ГБ), и я рад предоставить метаданные 70% ARC, а не 25% (80 ГБ из 123 ГБ).
При таком размере не нужно извлекать из ARC ничего, кроме "мертвого" содержимого файла. Поэтому я пытаюсь на самом деле проверить ZFS, чтобы выяснить, что происходит, и поэтому я могу видеть эффект от любых изменений, которые я делаю, потому что я действительно очень удивлен его огромным количеством "низкого уровня чтения", и ищу способ проверить и подтвердить реальность того, что он думает, что делает.