Skip to content

Всё о GUC по порядку: block_size

Автор: Christophe Pettus, All Your GUCs in a Row: block_size


Параметр, который вы не можете изменить. block_size находится в разделе «Предустановленные параметры» (Preset Options) документации, вместе со своими «кузенами» только для чтения, такими как data_checksums, wal_block_size и server_version. Он сообщает размер страницы PostgreSQL — фундаментальной единицы хранения на диске и учёта в буферном пуле. Значение по умолчанию — 8192 байта. Он доступен только для чтения во время выполнения, может быть установлен только во время компиляции PostgreSQL, а его изменение после создания кластера означает, что нужно начать всё заново с новым кластером.


Так зачем же он вообще в pg_settings? Потому что всё в базе данных измеряется в единицах этого размера.

Что на самом деле означает 8 КБ


shared_buffers = 4 ГБ? Это 524 288 страниц по 8 КБ каждая. pg_class.relpages для таблицы размером 100 МБ? 12 800. Стоимость в EXPLAIN, измеряемая в «обращениях к страницам»? Та же единица. Порог в 1 ГБ для TOAST на ширину строки? Производный от размера блока. Максимальная ширина строки до того, как включается TOAST (~2 КБ)? Одна четверть страницы. Максимальное количество кортежей индекса B-дерева на страницу? Функция размера блока и размера кортежа. Всё в PostgreSQL, на некотором уровне, представляет собой целочисленное количество страниц, а страница имеет размер 8 КБ.


Вот почему этот параметр находится в pg_settings. Инструменты, расширения и операторы должны знать, в каких единицах они работают. Параметр раскрывает ответ.



Когда вы могли бы захотеть его изменить


На практике: никогда. В теории:



  • Более крупные блоки (16 КБ, 32 КБ) означают меньше страниц на отношение, меньше уровней индекса, лучшее пакетирование последовательного ввода-вывода и меньшие накладные расходы на учёт на страницу. Некоторые аналитические форки PostgreSQL поставляются со значением по умолчанию 32 КБ именно по этим причинам. Цена — больше потраченного впустую пространства на частично заполненных страницах, более высокий порог TOAST (более длинные строки остаются внутри строки, что иногда помогает, а иногда вредит) и несовместимость с каждым стандартным пакетом PostgreSQL, настройкой репликации и инструментом резервного копирования, которые вы могли бы захотеть использовать.

  • Меньшие блоки (1 КБ, 2 КБ, 4 КБ) в основном представляют исторический интерес. Они были полезны, когда сектора дисков были маленькими, а памяти было мало. Сегодня они не дают практически никаких преимуществ и создают много дополнительных накладных расходов.


Допустимые значения, согласно --with-blocksize на этапе компиляции: 1, 2, 4, 8, 16 и 32 КБ. Значение по умолчанию было 8 КБ на протяжении всей истории PostgreSQL, которую кто-либо из читающих вероятно помнит.



Почему почти никто его не меняет


Три причины, по нарастающей серьёзности:



  1. Это время компиляции. Пакеты дистрибутивов (Debian, Red Hat, EDB, RDS, Aurora) поставляются с 8 КБ. Изменение означает компиляцию PostgreSQL самостоятельно и отказ от управления пакетами.

  2. Это несовместимо со всем. Вы не можете обновить кластер 8 КБ до кластера 32 КБ на месте. Вы не можете выполнять потоковую репликацию между кластерами с разными размерами блоков. pg_dump/pg_restore работает, но это ваш единственный путь миграции, и ваши инструменты должны его поддерживать.

  3. Расширения предполагают 8 КБ. Многие расширения жёстко кодируют предположения о размере страницы, расположении кортежей или поведении TOAST. Чем дальше вы отклоняетесь от значения по умолчанию, тем интереснее становится матрица совместимости ваших расширений.



Рекомендация: Посмотрите на значение. Убедитесь, что оно равно 8192. Двигайтесь дальше. Параметр block_size существует для того, чтобы инструменты мониторинга, планировщики запросов и операторы могли знать единицу измерения, в которой они работают, — а не для того, чтобы вы могли его изменить. Если вы действительно хотите другое значение, вы занимаетесь чем-то достаточно специализированным, и эта статья в блоге — не то место, где вы должны получать советы.



Trackbacks

No Trackbacks

Comments

Display comments as Linear | Threaded

No comments

The author does not allow comments to this entry

Add Comment

Enclosing asterisks marks text as bold (*word*), underscore are made via _word_.
Standard emoticons like :-) and ;-) are converted to images.

To prevent automated Bots from commentspamming, please enter the string you see in the image below in the appropriate input box. Your comment will only be submitted if the strings match. Please ensure that your browser supports and accepts cookies, or your comment cannot be verified correctly.
CAPTCHA

Form options

Submitted comments will be subject to moderation before being displayed.