Я запускаю приложение с большим объемом записи, в котором я храню свой 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 по умолчанию