Рейтинг:2

Диск ZFS с фрагментацией Postgresql быстро с приложением, интенсивно записывающим

флаг in

Я запускаю приложение с большим объемом записи, в котором я храню свой Postgresql в ZFS.Как правило, это работает хорошо, но я обнаружил, что мой пул ZFS сильно фрагментирован. Я даже создал новый пул ZFS и переместил туда данные с помощью zfs send/recv, чтобы дефрагментировать все пространство и попробовать некоторые новые настройки, которые могли бы ограничить фрагментацию, но безрезультатно.

Я не уверен, что происходит. Приложение в основном делает UPDATE, но Postgres должен иметь возможность повторно использовать пространство, уже находящееся на диске (поскольку оно создает мертвые кортежи и автоматически очищает их, оно будет повторно использовать эти страницы). Я вижу, что выделенное пространство в основном остается прежним, поэтому использование диска не увеличивается. Однако природа ZFS COW, по-видимому, заставляет файловую систему использовать свободное пространство и сильно фрагментировать его.

Таким образом, примерно после 15 млн операций интенсивной записи фрагментация пула ZFS снизилась с 0% (начальная) до 14%. Это не может быть так, как должно быть:

НАЗВАНИЕ РАЗМЕР ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
postgres_data 149G 89.0G 60.0G - - 14% 59% 1.00x ОНЛАЙН -
postgres_wal 9.50G 289M 9.22G - - 0% 2% 1.00x ОНЛАЙН -

(примечание: за то время, что я пишу этот пост, фрагментация выросла до 16%. Здесь что-то не так.)

Некоторые заметки о моей реализации:

  • У меня есть WAL в отдельном пуле, теоретически запись констант в WAL не приведет к фрагментации основного хранилища данных. Видимо это не работает.
  • Я также пытался настроить его с помощью синхронизация = отключена на теории, что ЗИЛ превращает мой диск в швейцарский сыр. Тоже без разницы.
  • в настоящее время я использую logbias = пропускная способность. Я видел противоречивые советы по этому поводу; официальные документы предполагают, что для postgres следует использовать пропускная способность, пока очень полезное руководство говорит, что «logbias = пропускная способность будет фрагментировать каждый. Отдельный. Блок. Записанный в ваш пул». Итак, в моем исходном пуле (сейчас уже не используется, т.к. он фрагментирован до 80%) я изначально использовал logbias=задержка но это явно также фрагментировало весь диск.
  • Я использую асинхронный = 9 потому что физический диск (это облачное хранилище) имеет размер блока 512.

Мои полные настройки zfs:

НАЗВАНИЕ СВОЙСТВО ЗНАЧЕНИЕ ИСТОЧНИК
файловая система типа postgres_data/data —
postgres_data/создание данных Вт 17 мая 23:36 2022 -
postgres_data/используемые данные 88.9G -
postgres_data/данные доступны 55,4G -
postgres_data/данные ссылаются на 88.9G -
postgres_data/data коэффициент сжатия 1,98x -
postgres_data/data смонтирован да -
postgres_data/квота данных нет по умолчанию
postgres_data/резервирование данных нет по умолчанию
postgres_data/data размер записи 8K унаследован от postgres_data
postgres_data/точка монтирования данных /var/lib/postgresql локальная
postgres_data/data sharenfs отключено по умолчанию
контрольная сумма postgres_data/data по умолчанию
postgres_data/сжатие данных zstd унаследовано от postgres_data
postgres_data/data время отключения унаследовано от postgres_data
устройства postgres_data/data по умолчанию
postgres_data/data exec по умолчанию
postgres_data/data setuid по умолчанию
postgres_data/data только для чтения выключено по умолчанию
postgres_data/data отключено по умолчанию
postgres_data/data snapdir скрытый по умолчанию
postgres_data/data aclmode отбросить по умолчанию
postgres_data/data aclinherit ограничено по умолчанию
postgres_data/data createtxg 619 -
postgres_data/data может монтироваться по умолчанию
postgres_data/data xattr sa унаследован от postgres_data
postgres_data/data копирует 1 по умолчанию
postgres_data/data версии 5 -
postgres_data/data utf8only выключено -
postgres_data/нормализация данных нет -
postgres_data/data чувствителен к регистру -
postgres_data/data vscan выключен по умолчанию
postgres_data/data nbmand выкл по умолчанию
postgres_data/datasharesmb выкл. по умолчанию
postgres_data/data refquota нет по умолчанию
postgres_data/data refreservation нет по умолчанию
postgres_data/data 10551245409099064921 -
postgres_data/data primarycache все по умолчанию
postgres_data/datasecondarycache все по умолчанию
postgres_data/data usedbysnapshots 0B —
postgres_data/данные, используемые набором данных 88.9G —
postgres_data/данные, используемые детьми 0B -
postgres_data/data usedbyrefreservation 0B -
postgres_data/data logbias пропускная способность локальная
postgres_data/данные objsetid 595 -
postgres_data/дедупликация данных отключена по умолчанию
postgres_data/data mlslabel нет по умолчанию
postgres_data/синхронизация данных отключена локально
postgres_data/data dnodesize устаревший по умолчанию
postgres_data/data refcompressratio 1,98x -
postgres_data/данные записаны 88.9G -
postgres_data/data логично использовать 176G -
postgres_data/data с логической ссылкой 176G —
postgres_data/data volmode по умолчанию по умолчанию
postgres_data/data filesystem_limit нет по умолчанию
postgres_data/data snapshot_limit нет по умолчанию
postgres_data/data filesystem_count нет по умолчанию
postgres_data/data snapshot_count нет по умолчанию
postgres_data/data snapdev скрытый по умолчанию
postgres_data/data acltype выкл. по умолчанию
postgres_data/data context нет по умолчанию
postgres_data/data fscontext нет по умолчанию
postgres_data/data defcontext нет по умолчанию
postgres_data/data rootcontext нет по умолчанию
postgres_data/data relatime выключен по умолчанию
postgres_data/data redundant_metadata больше всего унаследовано от postgres_data
postgres_data/data overlay по умолчанию
postgres_data/шифрование данных выключено по умолчанию
postgres_data/data keylocation нет по умолчанию
postgres_data/data формат ключа нет по умолчанию
postgres_data/data pbkdf2iters 0 по умолчанию
postgres_data/data special_small_blocks 0 по умолчанию
Рейтинг:1
флаг ng

ФРАГ означает не то, что вы думаете.

Это представление того, насколько фрагментировано ваше свободное пространство. Это не способ показать, насколько фрагментированы ваши фактические данные.

На практике не беспокойтесь об этом значении, если у вас действительно мало места или проблемы с производительностью.

Вам следует отменить некоторые из ваших изменений, так как они могут негативно сказаться на вашей фактической рабочей нагрузке.

Небольшой размер записи 8k также способствует этому (рассмотрите значение по умолчанию 128k или что-то большее, чем 8k)

Видеть: https://utcc.utoronto.ca/~cks/space/blog/solaris/ZFSZpoolFragmentationMeaning

Видеть: https://bun.uptrace.dev/postgres/tuning-zfs-aws-ebs.html#zfs-recordsize

флаг in
Верно, я знаю, что это фрагментация свободного пространства. Я удивлен, что он поднимается так высоко. Раньше у меня были проблемы со скоростью при обновлении моей основной таблицы, и я был убежден (может быть, неправильно?), что этому способствовала фрагментация свободного пространства. RE: размер записи, он должен соответствовать размеру страницы PostgreSQL. Это проблема?
ewwhite avatar
флаг ng
Пожалуйста, смотрите ссылки.Я не рекомендую значение размера записи ZFS 8 КБ для Postgres.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.