19.4. Потребление ресурсов
19.4.1. Память
shared_buffers(integer)Задаёт объём памяти, который будет использовать сервер баз данных для буферов в разделяемой памяти. По умолчанию это обычно 128 мегабайт (
128MB), но может быть и меньше, если конфигурация вашего ядра накладывает дополнительные ограничения (это определяется в процессе initdb). Это значение не должно быть меньше 128 килобайт. Однако для хорошей производительности обычно требуются гораздо большие значения. Если это значение задаётся без единиц измерения, оно считается заданным в блоках (размер которых равенBLCKSZбайт, обычно это 8 КБ). Минимальное допустимое значение зависит от величиныBLCKSZ. Задать этот параметр можно только при запуске сервера.Если вы используете выделенный сервер с объёмом ОЗУ 1 ГБ и более, разумным начальным значением
shared_buffersбудет 25% от объёма памяти. Существуют варианты нагрузки, при которых эффективны будут и ещё большие значенияshared_buffers, но так как Postgres Pro использует и кеш операционной системы, выделять дляshared_buffersболее 40% ОЗУ вряд ли будет полезно. При увеличенииshared_buffersобычно требуется соответственно увеличитьmax_wal_size, чтобы растянуть процесс записи большого объёма новых или изменённых данных на более продолжительное время.В системах с объёмом ОЗУ меньше 1 ГБ стоит ограничиться меньшим процентом ОЗУ, чтобы оставить достаточно места операционной системе.
huge_pages(enum)Определяет, будут ли огромные страницы запрашиваться из основной области общей памяти. Допустимые значения:
try(по умолчанию),onиoff. Задать этот параметр можно только при запуске сервера. Когда параметрhuge_pagesравенtry, сервер будет пытаться запрашивать огромные страницы, но если это ему не удастся, он вернётся к стандартному поведению. Со значениемon, если получить огромные страницы не удастся, сервер не будет запущен. Со значениемoffбольшие страницы не будут запрашиваться.В настоящее время это поддерживается в Linux и в Windows. В других системах значение
tryпросто игнорируется. В Linux эта поддержка обеспечивается, только когда параметрshared_memory_typeимеет значениеmmap(по умолчанию).В результате использования огромных страниц уменьшаются таблицы страниц, и процессор тратит меньше времени на управление памятью, что приводит к увеличению быстродействия. За более подробной информацией об использовании огромных страниц в Linux обратитесь к Подразделу 18.4.5.
Огромные страницы в Windows называются большими страницами. Чтобы использовать их, необходимо дать пользователю Windows, от имени которого работает Postgres Pro, право блокировать страницы. Для назначения пользователю этого права вы можете воспользоваться средством управления групповой политикой Windows (gpedit.msc). Чтобы сервер баз данных запускался в командной строке как отдельный процесс, а не как служба Windows, приглашение командной строки должно запускаться от имени администратора или должен быть отключён механизм UAC (User Access Control, Контроль учётных записей пользователей). Когда UAC включён, в обычном командном приглашении пользователь лишается права блокировать большие страницы в памяти.
Заметьте, что этот параметр влияет только на основную область общей памяти. В операционных системах, таких как Linux, FreeBSD и Illumos огромные страницы (также называемые «суперстраницами» или «большими» страницами) могут также автоматически использоваться при обычном выделении памяти, без явного запроса со стороны Postgres Pro. В Linux это называется «прозрачными огромными страницами» (Transparent Huge Pages, THP). Известно, что это приводит к снижению быстродействия Postgres Pro в некоторых системах Linux у ряда пользователей, поэтому использовать этот механизм в настоящее время не рекомендуется (в отличие от явного использования
huge_pages).xml_parse_huge(boolean)Позволяет увеличить объём памяти, выделяемой для обработки XML-данных. По умолчанию выделяется 10 МБ на один узел. При включении
xml_parse_hugeэто значение можно увеличить до 1 ГБ.По умолчанию:
offhuge_page_size(integer)Задаёт размер огромных страниц, если их использование включено параметром huge_pages. Значение по умолчанию — ноль (
0). При таком значении будет использоваться размер огромных страниц, заданный в системе по умолчанию. Этот параметр можно установить только при запуске сервера.На современных 64-битных серверных платформах доступны, в частности, следующие размеры страниц:
2MBи1GB(Intel и AMD),16MBи16GB(IBM POWER), и64kB,2MB,32MBи1GB(ARM). Подробнее использование и администрирование огромных страниц освещается в Подразделе 18.4.5.Отличные от нуля значения в настоящее время поддерживаются только в Linux.
temp_buffers(integer)Задаёт максимальный объём памяти, выделяемой для временных буферов в каждом сеансе. Эти существующие только в рамках сеанса буферы используются исключительно для работы с временными таблицами. Если это значение задаётся без единиц измерения, оно считается заданным в блоках (размер которых равен
BLCKSZбайт, обычно это 8 КБ). Значение по умолчанию — 8 мегабайт (8MB). (ЕслиBLCKSZотличен от 8 КБ, значение по умолчанию корректируется пропорционально.) Этот параметр можно изменить в отдельном сеансе, но только до первого обращения к временным таблицам; после этого изменения его значения не будут влиять на текущий сеанс.Сеанс выделяет временные буферы по мере необходимости до достижения предела, заданного параметром
temp_buffers. Если сеанс не задействует временные буферы, то для него хранятся только дескрипторы буферов, которые занимают около 64 байт (в количествеtemp_buffers). Однако если буфер действительно используется, он будет дополнительно занимать 8192 байта (илиBLCKSZбайт, в общем случае).max_prepared_transactions(integer)Задаёт максимальное число транзакций, которые могут одновременно находиться в «подготовленном» состоянии (см. PREPARE TRANSACTION). При нулевом значении (по умолчанию) механизм подготовленных транзакций отключается. Задать этот параметр можно только при запуске сервера.
Если использовать транзакции не планируется, этот параметр следует обнулить, чтобы не допустить непреднамеренного создания подготовленных транзакций. Если же подготовленные транзакции применяются, то
max_prepared_transactions, вероятно, должен быть не меньше, чем max_connections, чтобы подготовить транзакцию можно было в каждом сеансе.Для ведомого сервера значение этого параметра должно быть больше или равно значению на ведущем. В противном случае на ведомом сервере не будут разрешены запросы.
max_autonomous_transactions(integer)Задаёт максимально возможное число автономных транзакций, которые могут выполняться одновременно во всех сеансах сервера Postgres Pro. При превышении этого значения возникает ошибка с сообщением, что автономная транзакция не может быть начата.
По умолчанию: 100
work_mem(integer)Задаёт базовый максимальный объём памяти, который будет использоваться во внутренних операциях при обработке запросов (например, для сортировки или хеш-таблиц), прежде чем будут задействованы временные файлы на диске. Если это значение задаётся без единиц измерения, оно считается заданным в килобайтах. Значение по умолчанию — четыре мегабайта (
4MB). Заметьте, что в сложных запросах одновременно могут выполняться несколько операций сортировки и хеширования, и при этом примерно этот объём памяти может использоваться в каждой операции, прежде чем данные начнут вытесняться во временные файлы. Кроме того, такие операции могут выполняться одновременно в разных сеансах. Таким образом, общий объём памяти может многократно превосходить значениеwork_mem; это следует учитывать, выбирая подходящее значение. Операции сортировки используются дляORDER BY,DISTINCTи соединений слиянием. Хеш-таблицы используются при соединениях и агрегировании по хешу, мемоизации узлов, а также обработке подзапросовINс применением хеша.Операции вычисления хеша обычно более требовательны к памяти, чем равнозначные им операции сортировки. Поэтому ограничение памяти для хеш-таблиц определяется произведением
work_memиhash_mem_multiplierи может превышать обычный базовый объёмwork_mem.Примечание
Планировщик Postgres Pro может некорректно оценить размер хеш-таблицы при операциях вычисления хеша. Если одна или несколько порций данных в хеш-таблице настолько большие, что не помещаются в выделенную память, превышая ограничение по памяти, и при этом данные в хеш-таблице невозможно поделить на большее количество порций, планировщик будет пытаться разместить каждую порцию в памяти, даже если её размер превышает упомянутое ограничение.
Таким образом, при операциях вычисления хеша для больших наборов данных потребление памяти может резко возрастать, если данные в полученных хеш-таблицах невозможно разделить на достаточное количество порций.
hash_mem_multiplier(floating point)Используется для определения максимального объёма памяти, который может выделяться для операций с хешированием. Итоговый объём определяется произведением
work_memиhash_mem_multiplier. Значение по умолчанию равно 2.0, то есть для операций с хешированием может использоваться объём, вдвое превышающий базовое значениеwork_mem.Значение
hash_mem_multiplierимеет смысл увеличить, когда постоянно наблюдается вытеснение данных на диск при выполнении запросов, а прямолинейное увеличениеwork_memприводит к дефициту памяти (обычно проявляющемуся в ошибках «нехватка памяти»). В этих случаях действующее по умолчанию значение 2.0 обычно является оптимальным при смешанной нагрузке, а значения 2.0–8.0 могут быть эффективны там, гдеwork_memуже увеличено до 40 Мбайт или более.maintenance_work_mem(integer)Задаёт максимальный объём памяти для операций обслуживания БД, в частности
VACUUM,CREATE INDEXиALTER TABLE ADD FOREIGN KEY. Если это значение задаётся без единиц измерения, оно считается заданным в килобайтах. Значение по умолчанию — 64 мегабайта (64MB). Так как в один момент времени в сеансе может выполняться только одна такая операция и обычно они не запускаются параллельно, это значение вполне может быть гораздо большеwork_mem. Увеличение этого значения может привести к ускорению операций очистки и восстановления БД из копии.Учтите, что когда выполняется автоочистка, этот объём может быть выделен autovacuum_max_workers раз, поэтому не стоит устанавливать значение по умолчанию слишком большим. Возможно, будет лучше управлять объёмом памяти для автоочистки отдельно, изменяя autovacuum_work_mem.
Заметьте, что для сбора идентификаторов мёртвых кортежей
VACUUMможет использовать не более1GBпамяти.autovacuum_work_mem(integer)Задаёт максимальный объём памяти, который будет использовать каждый рабочий процесс автоочистки. Если это значение задаётся без единиц измерения, оно считается заданным в килобайтах. При действующем по умолчанию значении
-1этот объём определяется значением maintenance_work_mem. Этот параметр не влияет на поведение командыVACUUM, выполняемой в других контекстах. Задать этот параметр можно только вpostgresql.confили в командной строке при запуске сервера.Для сбора идентификаторов мёртвых кортежей автоочистка может использовать максимум
1GBпамяти, поэтому увеличениеautovacuum_work_memдо большего значения не повлияет на количество мёртвых кортежей, которые автоочистка может собрать при сканировании таблицы.logical_decoding_work_mem(integer)Задаёт максимальный объём памяти, используемой для логического декодирования, после превышения которого некоторые декодированные изменения будут вымещаться на локальный диск. Тем самым ограничивается объём памяти, используемой подключениями потоковой логической репликации. По умолчанию его значение — 64 мегабайта (
64MB). Так как каждое подключение репликации использует один буфер заданного размера, а количество таких подключений к одному серверу обычно невелико (оно ограничивается значениемmax_wal_senders), значение данного параметра вполне можно сделать достаточно большим, намного превышающимwork_mem, чтобы минимизировать объём вымещаемых на диск декодируемых изменений.slru_buffers_size_scale(integer)Задаёт степень двойки для управления размером SLRU-буферов в разделяемой памяти. Размер буферов вычисляется по формулам в таблице ниже и не может превышать
размер. Например, приshared_buffers/ 8 kB / 256shared_buffers = 128MBмаксимальный размер буфера составит128 MB / 8 kB / 256= 64 элемента.Таблица 19.1. Размеры SLRU-буферов
Буфер Значение Буфер смещений мультитранзакций 32 * (2 ^ slru_buffers_size_scale)Буфер данных о членах мультитранзакций 64 * (2 ^ slru_buffers_size_scale)Буфер данных о подтранзакциях 64 * (2 ^ slru_buffers_size_scale)Буфер сообщений NOTIFY 32 * (2 ^ slru_buffers_size_scale)Буфер данных о конфликтах сериализуемых транзакций 32 * (2 ^ slru_buffers_size_scale)Буфер clog (буфер состояния транзакций) 128 * (2 ^ slru_buffers_size_scale)Буфер времени фиксации транзакций 128 * (2 ^ slru_buffers_size_scale)Значение по умолчанию —
2. Этот параметр может принимать значения от0до9, задать его можно только при запуске сервера.max_stack_depth(integer)Задаёт максимальную безопасную глубину стека для исполнителя. В идеале это значение должно равняться предельному размеру стека, ограниченному ядром (который устанавливается командой
ulimit -sили аналогичной), за вычетом запаса примерно в мегабайт. Этот запас необходим, потому что сервер проверяет глубину стека не в каждой процедуре, а только в потенциально рекурсивных процедурах, например, при вычислении выражений. Если это значение задаётся без единиц измерения, оно считается заданным в килобайтах. Значение по умолчанию — два мегабайта (2MB) — выбрано с большим запасом, так что риск переполнения стека минимален. Но с другой стороны, его может быть недостаточно для выполнения сложных функций. Изменить этот параметр могут только суперпользователи и пользователи с соответствующим правомSET.Если
max_stack_depthбудет превышать фактический предел ядра, то функция с неограниченной рекурсией сможет вызвать крах отдельного процесса сервера. В системах, где Postgres Pro может определить предел, установленный ядром, он не позволит установить для этого параметра небезопасное значение. Однако эту информацию выдают не все системы, поэтому выбирать это значение следует с осторожностью.shared_memory_type(enum)Выбирает механизм разделяемой памяти, используя который сервер будет работать с основной областью общей памяти, содержащей общие буферы Postgres Pro и другие общие данные. Допустимые варианты:
mmap(для выделения анонимных блоков разделяемой памяти с помощьюmmap),sysv(для выделения разделяемой памяти System V функциейshmget) иwindows(для выделения разделяемой памяти в Windows). Не все варианты поддерживаются на разных платформах; первый из поддерживаемых данной платформой вариантов становится для неё вариантом по умолчанию. Применятьsysv, который нигде не выбирается по умолчанию, вообще не рекомендуется, так как для выделения большого объёма памяти (см. Подраздел 18.4.1) обычно требуется нестандартная настройка ядра. Задать этот параметр можно только при запуске сервера.dynamic_shared_memory_type(enum)Выбирает механизм динамической разделяемой памяти, который будет использоваться сервером. Допустимые варианты:
posix(для выделения разделяемой памяти POSIX функциейshm_open),sysv(для выделения разделяемой памяти System V функциейshmget),windows(для выделения разделяемой памяти в Windows) иmmap(для эмуляции разделяемой памяти через отображение в память файлов, хранящихся в каталоге данных). Не все варианты поддерживаются на разных платформах; по умолчанию обычно выбирается первый из поддерживаемых данной платформой вариантов. Применятьmmap, который нигде не выбирается по умолчанию, вообще не рекомендуется, так как операционная система может периодически записывать на диск изменённые страницы, что создаст дополнительную нагрузку; однако это может быть полезно для отладки, когда каталогpg_dynshmemнаходится на RAM-диске или когда другие механизмы разделяемой памяти недоступны. Задать этот параметр можно только при запуске сервера.min_dynamic_shared_memory(integer)Задаёт объём памяти, который должен быть выделен при запуске сервера для параллельных запросов. Если выделен недостаточный объём памяти или она уже занята одновременно выполняющимися запросами, новые параллельные запросы временно запрашивают дополнительную разделяемую память у операционной системы согласно значению
dynamic_shared_memory_type(это может приводить к замедлению вследствие накладных расходов на управление памятью). На выделение памяти в соответствии с указаниемmin_dynamic_shared_memoryвлияет параметрhuge_pagesв тех операционных системах, где он поддерживается; в системе, поддерживающей автоматическое управление большими страницами, их использование вероятнее всего даст положительный эффект. Значение по умолчанию —0(память не выделяется). Этот параметр можно установить только при запуске сервера.plan_cache_lru_memsize(integer)Задаёт максимальный объём памяти, который могут занимать планы подготовленных операторов. Наличие такого ограничения полезно для сеансов, создающих множество подготовленных операторов, так как без него эти операторы могут занимать слишком много памяти. При достижении заданного предела Postgres Pro Enterprise вытесняет из памяти общие планы для операторов, которые давно не использовались, сохраняя только разобранные запросы. Если такой оператор будет вызван в дальнейшем, его анализ и планирование будут произведены повторно. Чтобы по мере возможности сохранять в памяти планы для всех подготовленных операторов, задайте для этого параметра значение
0. Если значение этого параметра задаётся без единиц измерения, оно считается заданным в килобайтах. Стоит отметить, что общий объём памяти, занимаемый сохранёнными запросами, может быть больше значения этого параметра, поскольку он ограничивает только объём построенных планов.Если этот параметр задаётся вместе с plan_cache_lru_size, действовать будет ограничение, достигаемое первым.
По умолчанию: 8 МБ
plan_cache_lru_size(integer)Действует подобно plan_cache_lru_memsize, но ограничивает количество подготовленных операторов, а не их объём в памяти. Нулевое значение снимает данное ограничение.
Если этот параметр задаётся вместе с plan_cache_lru_memsize, действовать будет ограничение, достигаемое первым.
По умолчанию: 0
max_backend_memory(integer)Задаёт максимальный объём памяти, который может быть выделен обслуживающему процессу. Нулевое значение снимает данное ограничение.
Если для этого параметра задано ненулевое значение, Postgres Pro отслеживает выделение памяти в контекстах памяти и, когда обслуживающий процесс пытается выделить памяти больше, чем указано в этом ограничении, выделение памяти завершается с ошибкой. Если это происходит внутри транзакции, она прерывается так же, как при других ошибках транзакций. Кроме того, в журнал сервера записывается сообщение.
Этот параметр не устанавливает жёсткое ограничение на общее потребление памяти обслуживающим процессом. Напротив, он служит для предотвращения потенциальных остановов сервера из-за нехватки памяти, требующих его ручного перезапуска. Чтобы избежать таких сбоев, параметр позволяет детерминированно ограничивать потребление памяти клиентами. При выборе значения этого параметра попробуйте перемножить значения параметров
max_backend_memoryи max_connections, чтобы оценить примерное потребление памяти всеми обслуживающими процессами.Обратите внимание, что если установить для этого параметра низкое значение, может снизиться производительность операций обслуживания, таких как создание индекса. Таким образом, рекомендуется задавать значение не ниже maintenance_work_mem.
По умолчанию: 0
19.4.2. Диск
temp_file_limit(integer)Задаёт максимальный объём дискового пространства, который сможет использовать один процесс для временных файлов, например, при сортировке и хешировании, или для сохранения удерживаемого курсора. Транзакция, которая попытается превысить этот предел, будет отменена. Если это значение задаётся без единиц измерения, оно считается заданным в килобайтах. Значение
-1(по умолчанию) означает, что предел отсутствует. Изменить этот параметр могут только суперпользователи и пользователи с соответствующим правомSET.Этот параметр ограничивает общий объём, который могут занимать в момент времени все временные файлы, задействованные в данном процессе Postgres Pro. Следует отметить, что это не касается файлов явно создаваемых временных таблиц; ограничивается только объём временных файлов, которые создаются неявно при выполнении запросов.
19.4.3. Использование ресурсов ядра
max_files_per_process(integer)Задаёт максимальное число файлов, которые могут быть одновременно открыты каждым серверным подпроцессом. Значение по умолчанию — 1000 файлов. Если ядро реализует безопасное ограничение по процессам, об этом параметре можно не беспокоиться. Но на некоторых платформах (а именно, в большинстве систем BSD) ядро позволяет отдельному процессу открыть больше файлов, чем могут открыть несколько процессов одновременно. Если вы столкнётесь с ошибками «Too many open files» (Слишком много открытых файлов), попробуйте уменьшить это число. Задать этот параметр можно только при запуске сервера.
19.4.4. Задержка очистки по стоимости
Во время выполнения команд VACUUM и ANALYZE система ведёт внутренний счётчик, в котором суммирует оцениваемую стоимость различных выполняемых операций ввода-вывода. Когда накопленная стоимость превышает предел (vacuum_cost_limit), процесс, выполняющий эту операцию, засыпает на некоторое время (vacuum_cost_delay). Затем счётчик сбрасывается и процесс продолжается.
Данный подход реализован для того, чтобы администраторы могли снизить влияние этих команд на параллельную работу с базой, за счёт уменьшения нагрузки на подсистему ввода-вывода. Очень часто не имеет значения, насколько быстро выполнятся команды обслуживания (например, VACUUM и ANALYZE), но очень важно, чтобы они как можно меньше влияли на выполнение других операций с базой данных. Администраторы имеют возможность управлять этим, настраивая задержку очистки по стоимости.
По умолчанию этот режим отключён для выполняемых вручную команд VACUUM. Чтобы включить его, нужно установить в vacuum_cost_delay ненулевое значение.
vacuum_cost_delay(floating point)Продолжительность времени, в течение которого будет простаивать процесс, превысивший предел стоимости. Если это значение задаётся без единиц измерения, оно считается заданным в миллисекундах. Значение по умолчанию равно нулю, то есть задержка очистки отсутствует. При положительных значениях интенсивность очистки будет зависеть от стоимости.
При настройке интенсивности очистки для
vacuum_cost_delayобычно выбираются довольно небольшие значения, вплоть до 1 миллисекунды и меньше. Хотя вvacuum_cost_delayможно задавать дробные значения в миллисекундах, такие задержки могут быть неточными на старых платформах. На таких платформах для увеличения интенсивностиVACUUMпо сравнению с уровнем, обеспечиваемым при задержке 1 мс, потребуется настраивать другие параметры стоимости очистки. Тем не менее имеет смысл выбирать настолько малую задержкуvacuum_cost_delay, насколько может обеспечить платформа; большие задержки не будут полезны.vacuum_cost_page_hit(integer)Примерная стоимость очистки буфера, оказавшегося в общем кеше. Это подразумевает блокировку пула буферов, поиск в хеш-таблице и сканирование содержимого страницы. По умолчанию этот параметр равен одному.
vacuum_cost_page_miss(integer)Примерная стоимость очистки буфера, который нужно прочитать с диска. Это подразумевает блокировку пула буферов, поиск в хеш-таблице, чтение требуемого блока с диска и сканирование его содержимого. По умолчанию этот параметр равен 2.
vacuum_cost_page_dirty(integer)Примерная стоимость очистки, при которой изменяется блок, не модифицированный ранее. В неё включается дополнительная стоимость ввода-вывода, связанная с записью изменённого блока на диск. По умолчанию этот параметр равен 20.
vacuum_cost_limit(integer)Общая стоимость, при накоплении которой процесс очистки будет засыпать. По умолчанию этот параметр равен 200.
Примечание
Некоторые операции устанавливают критические блокировки и поэтому должны завершаться как можно быстрее. Во время таких операций задержка очистки по стоимости не осуществляется, так что накопленная за это время стоимость может намного превышать установленный предел. Во избежание ненужных длительных задержек в таких случаях, фактическая задержка вычисляется по формуле vacuum_cost_delay * accumulated_balance / vacuum_cost_limit и ограничивается максимумом, равным vacuum_cost_delay * 4.
19.4.5. Фоновая запись
В числе специальных процессов сервера есть процесс фоновой записи, задача которого — осуществлять запись «грязных» (новых или изменённых) общих буферов на диск. Когда количество чистых общих буферов считается недостаточным, данный процесс записывает грязные буферы в файловую систему и помечает их как чистые. Это снижает вероятность того, что серверные процессы, выполняющие запросы пользователей, не смогут найти чистые буферы и им придётся сбрасывать грязные буферы самостоятельно. Однако процесс фоновой записи увеличивает общую нагрузку на подсистему ввода-вывода, так как он может записывать неоднократно изменяемую страницу несколько раз, тогда как её можно было бы записать всего один раз в контрольной точке. Параметры, рассматриваемые в данном подразделе, позволяют настроить поведение фоновой записи для конкретных нужд.
bgwriter_delay(integer)Задаёт задержку между раундами активности процесса фоновой записи. Во время раунда этот процесс осуществляет запись некоторого количества загрязнённых буферов (это настраивается следующими параметрами). Затем он засыпает на время
bgwriter_delay, и всё повторяется снова. Однако если в пуле не остаётся загрязнённых буферов, он может быть неактивен более длительное время. Если это значение задаётся без единиц измерения, оно считается заданным в миллисекундах. По умолчанию этот параметр равен 200 миллисекундам (200ms). Заметьте, что во многих системах разрешение таймера составляет 10 мс, поэтому если задать вbgwriter_delayзначение, не кратное 10, фактически будет получен тот же результат, что и со следующим за ним кратным 10. Задать этот параметр можно только вpostgresql.confили в командной строке при запуске сервера.bgwriter_lru_maxpages(integer)Задаёт максимальное число буферов, которое сможет записать процесс фоновой записи за раунд активности. При нулевом значении фоновая запись отключается. (Учтите, что на контрольные точки, которые управляются отдельным вспомогательным процессом, это не влияет.) По умолчанию значение этого параметра — 100 буферов. Задать этот параметр можно только в
postgresql.confили в командной строке при запуске сервера.bgwriter_lru_multiplier(floating point)Число загрязнённых буферов, записываемых в очередном раунде, зависит от того, сколько новых буферов требовалось серверным процессам в предыдущих раундах. Средняя недавняя потребность умножается на
bgwriter_lru_multiplierи предполагается, что именно столько буферов потребуется на следующем раунде. Процесс фоновой записи будет записывать на диск и освобождать буферы, пока число чистых буферов не достигнет целевого значения. (При этом число буферов, записываемых за раунд, ограничивается сверху параметромbgwriter_lru_maxpages.) Таким образом, со множителем, равным 1.0, записывается ровно столько буферов, сколько требуется по предположению («точно по плану»). Увеличение этого множителя даёт некоторую страховку от резких скачков потребностей, тогда как уменьшение отражает намерение оставить некоторый объём записи для серверных процессов. По умолчанию он равен 2.0. Этот параметр можно установить только в файлеpostgresql.confили в командной строке при запуске сервера.bgwriter_flush_after(integer)Когда процессом фоновой записи записывается больше заданного объёма данных, сервер даёт указание ОС произвести запись этих данных в нижележащее хранилище. Это ограничивает объём «грязных» данных в страничном кеше ядра и уменьшает вероятность затормаживания при выполнении
fsyncв конце контрольной точки или когда ОС сбрасывает данные на диск большими порциями в фоне. Часто это значительно уменьшает задержки транзакций, но бывают ситуации (особенно когда объём рабочей нагрузки больше shared_buffers, но меньше страничного кеша ОС), когда производительность может упасть. Этот параметр действует не на всех платформах. Если значение параметра задаётся без единиц измерения, оно считается заданным в блоках (размер которых равенBLCKSZбайт, обычно это 8 КБ). Он может принимать значение от0(при этом управление отложенной записью отключается) до 2 мегабайт (2MB). Значение по умолчанию —512kBв Linux и0в других ОС. (ЕслиBLCKSZотличен от 8 КБ, значение по умолчанию и максимум корректируются пропорционально.) Задать этот параметр можно только вpostgresql.confили в командной строке при запуске сервера.
С маленькими значениями bgwriter_lru_maxpages и bgwriter_lru_multiplier уменьшается активность ввода-вывода со стороны процесса фоновой записи, но увеличивается вероятность того, что запись придётся производить непосредственно серверным процессам, что замедлит выполнение запросов.
19.4.6. Асинхронное поведение
backend_flush_after(integer)Когда одним обслуживающим процессом записывается больше заданного объёма данных, сервер даёт указание ОС произвести запись этих данных в нижележащее хранилище. Это ограничивает объём «грязных» данных в страничном кеше ядра и уменьшает вероятность затормаживания при выполнении
fsyncв конце контрольной точки или когда ОС сбрасывает данные на диск большими порциями в фоне. Часто это значительно сокращает задержки транзакций, но бывают ситуации (особенно когда объём рабочей нагрузки больше shared_buffers, но меньше страничного кеша ОС), когда производительность может упасть. Этот параметр действует не на всех платформах. Если значение параметра задаётся без единиц измерения, оно считается заданным в блоках (размер которых равенBLCKSZбайт, обычно это 8 КБ). Он может принимать значение от0(при этом управление отложенной записью отключается) до 2 мегабайт (2MB). По умолчанию он имеет значение0, то есть это поведение отключено. (ЕслиBLCKSZотличен от 8 КБ, максимальное значение корректируется пропорционально.)effective_io_concurrency(integer)Задаёт допустимое число параллельных операций ввода-вывода, которое говорит Postgres Pro о том, сколько операций ввода-вывода могут быть выполнены одновременно. Чем больше это число, тем больше операций ввода-вывода будет пытаться выполнить параллельно Postgres Pro в отдельном сеансе. Допустимые значения лежат в интервале от 1 до 1000, а нулевое значение отключает асинхронные запросы ввода-вывода. В настоящее время этот параметр влияет только на сканирование по битовой карте.
Для магнитных носителей хорошим начальным значением этого параметра будет число отдельных дисков, составляющих массив RAID 0 или RAID 1, в котором размещена база данных. (Для RAID 5 следует исключить один диск (как диск с чётностью).) Однако если база данных часто обрабатывает множество запросов в различных сеансах, и при небольших значениях дисковый массив может быть полностью загружен. Если продолжать увеличивать это значение при полной загрузке дисков, это приведёт только к увеличению нагрузки на процессор. Диски SSD и другие виды хранилища в памяти часто могут обрабатывать множество параллельных запросов, так что оптимальным числом может быть несколько сотен.
Асинхронный ввод-вывод зависит от эффективности функции
posix_fadvise, которая отсутствует в некоторых операционных системах. В случае её отсутствия попытка задать для этого параметра любое ненулевое значение приведёт к ошибке. В некоторых системах (например, в Solaris), эта функция присутствует, но на самом деле ничего не делает.Значение по умолчанию равно 1 в системах, где это поддерживается, и 0 в остальных. Это значение можно переопределить для таблиц в определённом табличном пространстве, установив одноимённый параметр табличного пространства (см. ALTER TABLESPACE).
maintenance_io_concurrency(integer)Этот параметр подобен
effective_io_concurrency, но используется для операций обслуживания, которые выполняются в различных клиентских сеансах.Значение по умолчанию равно 10 в системах, где это поддерживается, и 0 в остальных. Это значение можно переопределить для таблиц в определённом табличном пространстве, установив одноимённый параметр табличного пространства (см. ALTER TABLESPACE).
max_worker_processes(integer)Задаёт максимальное число фоновых процессов, которое можно запустить в текущей системе. Этот параметр можно задать только при запуске сервера. Значение по умолчанию — 8.
Для ведомого сервера значение этого параметра должно быть больше или равно значению на ведущем. В противном случае на ведомом сервере не будут разрешены запросы.
Одновременно с изменением этого значения также может быть полезно изменить max_parallel_workers, max_parallel_maintenance_workers, и max_parallel_workers_per_gather.
max_parallel_workers_per_gather(integer)Задаёт максимальное число рабочих процессов, которые могут запускаться одним узлом
GatherилиGather Merge. Параллельные рабочие процессы берутся из пула процессов, контролируемого параметром max_worker_processes, в количестве, ограничиваемом значением max_parallel_workers. Учтите, что запрошенное количество рабочих процессов может быть недоступно во время выполнения. В этом случае план будет выполняться с меньшим числом процессов, что может быть неэффективно. Значение по умолчанию — 2. Значение 0 отключает параллельное выполнение запросов.Учтите, что параллельные запросы могут потреблять значительно больше ресурсов, чем не параллельные, так как каждый рабочий процесс является отдельным процессом и оказывает на систему примерно такое же влияние, как дополнительный пользовательский сеанс. Это следует учитывать, выбирая значение этого параметра, а также настраивая другие параметры, управляющие использованием ресурсов, например work_mem. Ограничения ресурсов, такие как
work_mem, применяются к каждому рабочему процессу отдельно, что означает, что общая нагрузка для всех процессов может оказаться гораздо больше, чем при обычном использовании одного процесса. Например, параллельный запрос, задействующий 4 рабочих процесса, может использовать в 5 раз больше времени процессора, объёма памяти, ввода-вывода и т. д., по сравнению с запросом, не задействующим рабочие процессы вовсе.За дополнительными сведениями о параллельных запросах обратитесь к Главе 15.
max_parallel_maintenance_workers(integer)Задаёт максимальное число рабочих процессов, которые могут запускаться одной служебной командой. В настоящее время параллельные процессы может использовать только
CREATE INDEXпри построении индекса-B-дерева иVACUUMбез указанияFULL. Параллельные рабочие процессы берутся из пула процессов, контролируемого параметром max_worker_processes, в количестве, ограничиваемом значением max_parallel_workers. Учтите, что запрошенное количество рабочих процессов может быть недоступно во время выполнения. В этом случае служебная операция будет выполняться с меньшим числом процессов, чем ожидалось. Значение по умолчанию — 2. Значение 0 отключает использование параллельных исполнителей служебными командами.Заметьте, что параллельно выполняемые служебные команды не должны потреблять значительно больше памяти, чем равнозначные непараллельные операции. Это отличает их от параллельных запросов, при выполнении которых ограничения ресурсов действуют на отдельные рабочие процессы. Для параллельных служебных команд ограничение ресурсов
maintenance_work_memсчитается действующим на команду в целом, вне зависимости от числа параллельных рабочих процессов. Тем не менее параллельные служебные команды могут гораздо больше нагружать процессор и каналы ввода-вывода.max_parallel_workers(integer)Задаёт максимальное число рабочих процессов, которое система сможет поддерживать для параллельных операций. Значение по умолчанию — 8. При увеличении или уменьшения этого значения также может иметь смысл скорректировать max_parallel_maintenance_workers и max_parallel_workers_per_gather. Заметьте, что значение данного параметра, превышающее max_worker_processes, не будет действовать, так как параллельные рабочие процессы берутся из пула рабочих процессов, ограничиваемого этим параметром.
parallel_leader_participation(boolean)Позволяет ведущему процессу выполнять план запроса ниже узлов
GatherиGather Merge, не ожидая рабочие процессы. По умолчанию этот параметр включён (on). Значениеoffснижает вероятность блокировки рабочих процессов в случае, если ведущий процесс будет читать кортежи недостаточно быстро, но тогда ведущему приходится дожидаться запуска рабочих процессов, и только затем выдавать первые кортежи. Степень положительного или отрицательного влияния ведущего зависит от типа плана, числа рабочих процессов и длительности запроса.old_snapshot_threshold(integer)Задаёт минимальное время, в течение которого можно пользоваться снимком состояния для запроса без риска получить ошибку
снимок слишком стар. Данные, потерявшие актуальность и пребывающие в этом состоянии дольше заданного времени, могут быть вычищены. Это предотвращает раздувание из-за снимков, которые остаются задействованными долгое время. Во избежание получения некорректных результатов из-за очистки данных, которые должны были бы наблюдаться в таком снимке, клиенту будет выдана ошибка, если возраст снимка превысит заданный предел и из этого снимка будет запрошена страница, изменённая со времени его создания.Если это значение задаётся без единиц измерения, оно считается заданным в минутах. Значение
-1(по умолчанию) отключает это поведение, фактически делая предельный срок снимков бесконечным. Этот параметр можно задать только при запуске сервера.Значение
-1(по умолчанию) отключает это поведение. Полезные для производственной среды значения могут лежать в интервале от нескольких часов до нескольких дней. Заданное значение округляется до минут, а минимальные значения (например,0или1min) допускаются только потому, что они могут быть полезны при тестировании. Хотя допустимым будет и значение60d(60 дней), учтите, что при многих видах нагрузки критичное раздувание базы или зацикливание идентификаторов транзакций на уровне страниц может происходить в намного меньших временных отрезках.Когда это ограничение действует, освобождённое пространство в конце отношения не может быть отдано операционной системе, так как при этом будет удалена информация, необходимая для выявления условия «снимок слишком стар». Всё пространство, выделенное отношению, останется связанным с ним до тех пор, пока не будет освобождено явно (например, с помощью команды
VACUUM FULL).Установка этого параметра не гарантирует, что обозначенная ошибка будет выдаваться при всех возможных обстоятельствах. На самом деле, если можно получить корректные результаты, например, из курсора, материализовавшего результирующий набор, ошибка не будет выдана, даже если нижележащие строки в целевой таблице были ликвидированы при очистке. Некоторые таблицы, например системные каталоги, не могут быть безопасно очищены в сжатые сроки, так что на них этот параметр не распространяется. Для таких таблиц этот параметр не сокращает раздувание, но и не чреват ошибкой «снимок слишком стар» при сканировании.
19.4.7. Приоритизация
usage_tracking_interval(integer)Задаёт интервал времени в секундах для подсчёта статистики использования. В зависимости от этой статистики Postgres Pro Enterprise может ограничивать использование ресурсов каждым сеансом в соответствии с политикой приоритизации, настраиваемой параметрами session_cpu_weight, session_ioread_weight и session_iowrite_weight.
При положительном значении этого параметра запускается фоновый рабочий процесс, собирающий статистику по использованию процессора, количеству локальных и разделяемых блоков, прочитываемых обслуживающими процессами, а также количеству локальных и разделяемых блоков, загрязняемых ими. Не следует устанавливать для этого параметра маленькие значения, так как частый сбор статистики может сказаться на производительности.
По умолчанию действует значение 0, при котором сбор статистики и приоритизация ресурсов отключается.
Задать этот параметр можно только в
postgresql.confили в командной строке при запуске сервера.session_cpu_weight(integer)Задаёт вес использования процессора для текущего сеанса. Возможные значения:
1,2,4и8. Чем выше значение, тем больше ресурсов сможет использовать сеанс по сравнению с сеансами, имеющими меньший вес.Чтобы этот параметр действовал, значение usage_tracking_interval должно быть больше нуля. Использование ресурсов планируется, исходя из статистики, собранной за предыдущий интервал, длительность которого определяет параметр usage_tracking_interval. Если все сеансы имеют одинаковый вес, Postgres Pro Enterprise не приоритизирует использование ресурсов.
По умолчанию:
4session_ioread_weight(integer)Задаёт вес чтения локальных и разделяемых блоков для текущего сеанса. Возможные значения:
1,2,4и8. Чем выше значение, тем больше ресурсов сможет использовать сеанс по сравнению с сеансами, имеющими меньший вес.Чтобы этот параметр действовал, значение usage_tracking_interval должно быть больше нуля. Использование ресурсов планируется, исходя из статистики, собранной за предыдущий интервал, длительность которого определяет параметр usage_tracking_interval. Если все сеансы имеют одинаковый вес, Postgres Pro Enterprise не приоритизирует использование ресурсов.
По умолчанию:
4session_iowrite_weight(integer)Задаёт вес записи локальных и разделяемых блоков для текущего сеанса. Возможные значения:
1,2,4и8. Чем выше значение, тем больше ресурсов сможет использовать сеанс по сравнению с сеансами, имеющими меньший вес.Чтобы этот параметр действовал, значение usage_tracking_interval должно быть больше нуля. Использование ресурсов планируется, исходя из статистики, собранной за предыдущий интервал, длительность которого определяет параметр usage_tracking_interval. Если все сеансы имеют одинаковый вес, Postgres Pro Enterprise не приоритизирует использование ресурсов.
По умолчанию:
4
19.4. Resource Consumption
19.4.1. Memory
shared_buffers(integer)Sets the amount of memory the database server uses for shared memory buffers. The default is typically 128 megabytes (
128MB), but might be less if your kernel settings will not support it (as determined during initdb). This setting must be at least 128 kilobytes. However, settings significantly higher than the minimum are usually needed for good performance. If this value is specified without units, it is taken as blocks, that isBLCKSZbytes, typically 8kB. (Non-default values ofBLCKSZchange the minimum value.) This parameter can only be set at server start.If you have a dedicated database server with 1GB or more of RAM, a reasonable starting value for
shared_buffersis 25% of the memory in your system. There are some workloads where even larger settings forshared_buffersare effective, but because Postgres Pro also relies on the operating system cache, it is unlikely that an allocation of more than 40% of RAM toshared_bufferswill work better than a smaller amount. Larger settings forshared_buffersusually require a corresponding increase inmax_wal_size, in order to spread out the process of writing large quantities of new or changed data over a longer period of time.On systems with less than 1GB of RAM, a smaller percentage of RAM is appropriate, so as to leave adequate space for the operating system.
huge_pages(enum)Controls whether huge pages are requested for the main shared memory area. Valid values are
try(the default),on, andoff. This parameter can only be set at server start. Withhuge_pagesset totry, the server will try to request huge pages, but fall back to the default if that fails. Withon, failure to request huge pages will prevent the server from starting up. Withoff, huge pages will not be requested.At present, this setting is supported only on Linux and Windows. The setting is ignored on other systems when set to
try. On Linux, it is only supported whenshared_memory_typeis set tommap(the default).The use of huge pages results in smaller page tables and less CPU time spent on memory management, increasing performance. For more details about using huge pages on Linux, see Section 18.4.5.
Huge pages are known as large pages on Windows. To use them, you need to assign the user right “Lock pages in memory” to the Windows user account that runs Postgres Pro. You can use Windows Group Policy tool (gpedit.msc) to assign the user right “Lock pages in memory”. To start the database server on the command prompt as a standalone process, not as a Windows service, the command prompt must be run as an administrator or User Access Control (UAC) must be disabled. When the UAC is enabled, the normal command prompt revokes the user right “Lock pages in memory” when started.
Note that this setting only affects the main shared memory area. Operating systems such as Linux, FreeBSD, and Illumos can also use huge pages (also known as “super” pages or “large” pages) automatically for normal memory allocation, without an explicit request from Postgres Pro. On Linux, this is called “transparent huge pages” (THP). That feature has been known to cause performance degradation with Postgres Pro for some users on some Linux versions, so its use is currently discouraged (unlike explicit use of
huge_pages).xml_parse_huge(boolean)Allows allocating more memory for processing XML data. By default, the maximum amount of memory allocated per node is 10 MB. With
xml_parse_hugeenabled, this limit is increased to 1 GB.Default:
offhuge_page_size(integer)Controls the size of huge pages, when they are enabled with huge_pages. The default is zero (
0). When set to0, the default huge page size on the system will be used. This parameter can only be set at server start.Some commonly available page sizes on modern 64 bit server architectures include:
2MBand1GB(Intel and AMD),16MBand16GB(IBM POWER), and64kB,2MB,32MBand1GB(ARM). For more information about usage and support, see Section 18.4.5.Non-default settings are currently supported only on Linux.
temp_buffers(integer)Sets the maximum amount of memory used for temporary buffers within each database session. These are session-local buffers used only for access to temporary tables. If this value is specified without units, it is taken as blocks, that is
BLCKSZbytes, typically 8kB. The default is eight megabytes (8MB). (IfBLCKSZis not 8kB, the default value scales proportionally to it.) This setting can be changed within individual sessions, but only before the first use of temporary tables within the session; subsequent attempts to change the value will have no effect on that session.A session will allocate temporary buffers as needed up to the limit given by
temp_buffers. The cost of setting a large value in sessions that do not actually need many temporary buffers is only a buffer descriptor, or about 64 bytes, per increment intemp_buffers. However if a buffer is actually used an additional 8192 bytes will be consumed for it (or in general,BLCKSZbytes).max_prepared_transactions(integer)Sets the maximum number of transactions that can be in the “prepared” state simultaneously (see PREPARE TRANSACTION). Setting this parameter to zero (which is the default) disables the prepared-transaction feature. This parameter can only be set at server start.
If you are not planning to use prepared transactions, this parameter should be set to zero to prevent accidental creation of prepared transactions. If you are using prepared transactions, you will probably want
max_prepared_transactionsto be at least as large as max_connections, so that every session can have a prepared transaction pending.When running a standby server, you must set this parameter to the same or higher value than on the primary server. Otherwise, queries will not be allowed in the standby server.
max_autonomous_transactions(integer)Sets the maximum number of autonomous transactions that can be used simultaneously in all sessions of a Postgres Pro instance. If this value is exceeded, the error is raised that an autonomous transaction cannot be started.
Default: 100
work_mem(integer)Sets the base maximum amount of memory to be used by a query operation (such as a sort or hash table) before writing to temporary disk files. If this value is specified without units, it is taken as kilobytes. The default value is four megabytes (
4MB). Note that a complex query might perform several sort and hash operations at the same time, with each operation generally being allowed to use as much memory as this value specifies before it starts to write data into temporary files. Also, several running sessions could be doing such operations concurrently. Therefore, the total memory used could be many times the value ofwork_mem; it is necessary to keep this fact in mind when choosing the value. Sort operations are used forORDER BY,DISTINCT, and merge joins. Hash tables are used in hash joins, hash-based aggregation, memoize nodes and hash-based processing ofINsubqueries.Hash-based operations are generally more sensitive to memory availability than equivalent sort-based operations. The memory limit for a hash table is computed by multiplying
work_membyhash_mem_multiplier. This makes it possible for hash-based operations to use an amount of memory that exceeds the usualwork_membase amount.Note
The Postgres Pro planner may incorrectly estimate the hash table size when doing hash-based operations. If the hash table is organized in a such manner that one or several batches are so big that they do not fit into the allocated memory, exceeding the memory limit, and the hash table can not be splitted into more batches, then the planner will try to place each batch into the memory in order to complete the query even if a single batch exceeds the aforementioned limit.
Therefore, the memory consumption could dramatically increase when doing hash-based operations on large datasets that produce hash tables, which can not be splitted into a large number of batches.
hash_mem_multiplier(floating point)Used to compute the maximum amount of memory that hash-based operations can use. The final limit is determined by multiplying
work_membyhash_mem_multiplier. The default value is 2.0, which makes hash-based operations use twice the usualwork_membase amount.Consider increasing
hash_mem_multiplierin environments where spilling by query operations is a regular occurrence, especially when simply increasingwork_memresults in memory pressure (memory pressure typically takes the form of intermittent out of memory errors). The default setting of 2.0 is often effective with mixed workloads. Higher settings in the range of 2.0 - 8.0 or more may be effective in environments wherework_memhas already been increased to 40MB or more.maintenance_work_mem(integer)Specifies the maximum amount of memory to be used by maintenance operations, such as
VACUUM,CREATE INDEX, andALTER TABLE ADD FOREIGN KEY. If this value is specified without units, it is taken as kilobytes. It defaults to 64 megabytes (64MB). Since only one of these operations can be executed at a time by a database session, and an installation normally doesn't have many of them running concurrently, it's safe to set this value significantly larger thanwork_mem. Larger settings might improve performance for vacuuming and for restoring database dumps.Note that when autovacuum runs, up to autovacuum_max_workers times this memory may be allocated, so be careful not to set the default value too high. It may be useful to control for this by separately setting autovacuum_work_mem.
Note that for the collection of dead tuple identifiers,
VACUUMis only able to utilize up to a maximum of1GBof memory.autovacuum_work_mem(integer)Specifies the maximum amount of memory to be used by each autovacuum worker process. If this value is specified without units, it is taken as kilobytes. It defaults to -1, indicating that the value of maintenance_work_mem should be used instead. The setting has no effect on the behavior of
VACUUMwhen run in other contexts. This parameter can only be set in thepostgresql.conffile or on the server command line.For the collection of dead tuple identifiers, autovacuum is only able to utilize up to a maximum of
1GBof memory, so settingautovacuum_work_memto a value higher than that has no effect on the number of dead tuples that autovacuum can collect while scanning a table.logical_decoding_work_mem(integer)Specifies the maximum amount of memory to be used by logical decoding, before some of the decoded changes are written to local disk. This limits the amount of memory used by logical streaming replication connections. It defaults to 64 megabytes (
64MB). Since each replication connection only uses a single buffer of this size, and an installation normally doesn't have many such connections concurrently (as limited bymax_wal_senders), it's safe to set this value significantly higher thanwork_mem, reducing the amount of decoded changes written to disk.slru_buffers_size_scale(integer)Specifies the power of two for scaling the size of SLRU shared memory buffers. The buffer size is calculated according to the table below and cannot exceed
. For example, ifshared_bufferssize / 8kB / 256shared_buffers = 128MB, the maximum buffer size would be128 MB / 8 kB / 256= 64 elements.Table 19.1. SLRU Buffers Sizes
Buffer Value Multixact offset buffer 32 * (2 ^ slru_buffers_size_scale)Multixact member buffer 64 * (2 ^ slru_buffers_size_scale)Sub-transaction buffer 64 * (2 ^ slru_buffers_size_scale)NOTIFY message buffer 32 * (2 ^ slru_buffers_size_scale)Serializable transaction conflict buffer 32 * (2 ^ slru_buffers_size_scale)Clog (transaction status) buffer 128 * (2 ^ slru_buffers_size_scale)Commit timestamp buffer 128 * (2 ^ slru_buffers_size_scale)The default value is
2. The valid range is between0and9. This parameter can only be set at server start.max_stack_depth(integer)Specifies the maximum safe depth of the server's execution stack. The ideal setting for this parameter is the actual stack size limit enforced by the kernel (as set by
ulimit -sor local equivalent), less a safety margin of a megabyte or so. The safety margin is needed because the stack depth is not checked in every routine in the server, but only in key potentially-recursive routines. If this value is specified without units, it is taken as kilobytes. The default setting is two megabytes (2MB), which is conservatively small and unlikely to risk crashes. However, it might be too small to allow execution of complex functions. Only superusers and users with the appropriateSETprivilege can change this setting.Setting
max_stack_depthhigher than the actual kernel limit will mean that a runaway recursive function can crash an individual backend process. On platforms where Postgres Pro can determine the kernel limit, the server will not allow this variable to be set to an unsafe value. However, not all platforms provide the information, so caution is recommended in selecting a value.shared_memory_type(enum)Specifies the shared memory implementation that the server should use for the main shared memory region that holds Postgres Pro's shared buffers and other shared data. Possible values are
mmap(for anonymous shared memory allocated usingmmap),sysv(for System V shared memory allocated viashmget) andwindows(for Windows shared memory). Not all values are supported on all platforms; the first supported option is the default for that platform. The use of thesysvoption, which is not the default on any platform, is generally discouraged because it typically requires non-default kernel settings to allow for large allocations (see Section 18.4.1). This parameter can only be set at server start.dynamic_shared_memory_type(enum)Specifies the dynamic shared memory implementation that the server should use. Possible values are
posix(for POSIX shared memory allocated usingshm_open),sysv(for System V shared memory allocated viashmget),windows(for Windows shared memory), andmmap(to simulate shared memory using memory-mapped files stored in the data directory). Not all values are supported on all platforms; the first supported option is usually the default for that platform. The use of themmapoption, which is not the default on any platform, is generally discouraged because the operating system may write modified pages back to disk repeatedly, increasing system I/O load; however, it may be useful for debugging, when thepg_dynshmemdirectory is stored on a RAM disk, or when other shared memory facilities are not available. This parameter can only be set at server start.min_dynamic_shared_memory(integer)Specifies the amount of memory that should be allocated at server startup for use by parallel queries. When this memory region is insufficient or exhausted by concurrent queries, new parallel queries try to allocate extra shared memory temporarily from the operating system using the method configured with
dynamic_shared_memory_type, which may be slower due to memory management overheads. Memory that is allocated at startup withmin_dynamic_shared_memoryis affected by thehuge_pagessetting on operating systems where that is supported, and may be more likely to benefit from larger pages on operating systems where that is managed automatically. The default value is0(none). This parameter can only be set at server start.plan_cache_lru_memsize(integer)Specifies the maximum amount of memory that can be used by plans of prepared statements. Having such a limit is useful for sessions with multiple prepared statements that may otherwise use too much memory. If this limit is reached, Postgres Pro Enterprise evicts the generic plans of the least recently used statements from memory, keeping only the corresponding parsed queries. If such a statement is called again later, it has to be analyzed and planned again. To keep plans in memory for all prepared statements as long as possible, set this parameter to
0. If the value for this parameter is specified without units, it is taken as kilobytes. It is worth noting that the total amount of memory used by the saved queries may be larger than the value of this parameter because it takes into account only the generated plans.If this parameter is set together with plan_cache_lru_size, the first reached limit takes effect.
Default: 8MB
plan_cache_lru_size(integer)Same as plan_cache_lru_memsize, but limits the number of prepared statements instead of the memory size. Zero means no limit.
If this parameter is set together with plan_cache_lru_memsize, the first reached limit takes effect.
Default: 0
max_backend_memory(integer)Specifies the maximum amount of memory that can be allocated to a backend. Zero means no limit.
If this parameter is set to a non-zero value, Postgres Pro tracks memory allocations within memory contexts and when a backend attempts to allocate memory beyond the specified limit, the allocation fails with an error. If this happens inside a transaction, the transaction is aborted in the same way as for other transaction errors. Additionally, an error message is written to the server log.
This parameter does not impose a hard limit on the total memory consumption of a backend. Instead, it serves to prevent potential server crashes caused by out-of-memory (OOM) conditions, which would otherwise require a manual server restart following such failures. To avoid these crashes, this parameter provides a deterministic way of limiting memory consumption by clients. When choosing a value for this parameter, consider multiplying the value of
max_backend_memoryby max_connections to calculate the memory allocation estimate for all backends.Note that setting a low value for this configuration parameter may reduce the performance of maintenance operations, such as index creation. Therefore, it is advisable to set this parameter to a value no lower than maintenance_work_mem.
Default: 0
19.4.2. Disk
temp_file_limit(integer)Specifies the maximum amount of disk space that a process can use for temporary files, such as sort and hash temporary files, or the storage file for a held cursor. A transaction attempting to exceed this limit will be canceled. If this value is specified without units, it is taken as kilobytes.
-1(the default) means no limit. Only superusers and users with the appropriateSETprivilege can change this setting.This setting constrains the total space used at any instant by all temporary files used by a given Postgres Pro process. It should be noted that disk space used for explicit temporary tables, as opposed to temporary files used behind-the-scenes in query execution, does not count against this limit.
19.4.3. Kernel Resource Usage
max_files_per_process(integer)Sets the maximum number of simultaneously open files allowed to each server subprocess. The default is one thousand files. If the kernel is enforcing a safe per-process limit, you don't need to worry about this setting. But on some platforms (notably, most BSD systems), the kernel will allow individual processes to open many more files than the system can actually support if many processes all try to open that many files. If you find yourself seeing “Too many open files” failures, try reducing this setting. This parameter can only be set at server start.
19.4.4. Cost-based Vacuum Delay
During the execution of VACUUM and ANALYZE commands, the system maintains an internal counter that keeps track of the estimated cost of the various I/O operations that are performed. When the accumulated cost reaches a limit (specified by vacuum_cost_limit), the process performing the operation will sleep for a short period of time, as specified by vacuum_cost_delay. Then it will reset the counter and continue execution.
The intent of this feature is to allow administrators to reduce the I/O impact of these commands on concurrent database activity. There are many situations where it is not important that maintenance commands like VACUUM and ANALYZE finish quickly; however, it is usually very important that these commands do not significantly interfere with the ability of the system to perform other database operations. Cost-based vacuum delay provides a way for administrators to achieve this.
This feature is disabled by default for manually issued VACUUM commands. To enable it, set the vacuum_cost_delay variable to a nonzero value.
vacuum_cost_delay(floating point)The amount of time that the process will sleep when the cost limit has been exceeded. If this value is specified without units, it is taken as milliseconds. The default value is zero, which disables the cost-based vacuum delay feature. Positive values enable cost-based vacuuming.
When using cost-based vacuuming, appropriate values for
vacuum_cost_delayare usually quite small, perhaps less than 1 millisecond. Whilevacuum_cost_delaycan be set to fractional-millisecond values, such delays may not be measured accurately on older platforms. On such platforms, increasingVACUUM's throttled resource consumption above what you get at 1ms will require changing the other vacuum cost parameters. You should, nonetheless, keepvacuum_cost_delayas small as your platform will consistently measure; large delays are not helpful.vacuum_cost_page_hit(integer)The estimated cost for vacuuming a buffer found in the shared buffer cache. It represents the cost to lock the buffer pool, lookup the shared hash table and scan the content of the page. The default value is one.
vacuum_cost_page_miss(integer)The estimated cost for vacuuming a buffer that has to be read from disk. This represents the effort to lock the buffer pool, lookup the shared hash table, read the desired block in from the disk and scan its content. The default value is 2.
vacuum_cost_page_dirty(integer)The estimated cost charged when vacuum modifies a block that was previously clean. It represents the extra I/O required to flush the dirty block out to disk again. The default value is 20.
vacuum_cost_limit(integer)The accumulated cost that will cause the vacuuming process to sleep. The default value is 200.
Note
There are certain operations that hold critical locks and should therefore complete as quickly as possible. Cost-based vacuum delays do not occur during such operations. Therefore it is possible that the cost accumulates far higher than the specified limit. To avoid uselessly long delays in such cases, the actual delay is calculated as vacuum_cost_delay * accumulated_balance / vacuum_cost_limit with a maximum of vacuum_cost_delay * 4.
19.4.5. Background Writer
There is a separate server process called the background writer, whose function is to issue writes of “dirty” (new or modified) shared buffers. When the number of clean shared buffers appears to be insufficient, the background writer writes some dirty buffers to the file system and marks them as clean. This reduces the likelihood that server processes handling user queries will be unable to find clean buffers and have to write dirty buffers themselves. However, the background writer does cause a net overall increase in I/O load, because while a repeatedly-dirtied page might otherwise be written only once per checkpoint interval, the background writer might write it several times as it is dirtied in the same interval. The parameters discussed in this subsection can be used to tune the behavior for local needs.
bgwriter_delay(integer)Specifies the delay between activity rounds for the background writer. In each round the writer issues writes for some number of dirty buffers (controllable by the following parameters). It then sleeps for the length of
bgwriter_delay, and repeats. When there are no dirty buffers in the buffer pool, though, it goes into a longer sleep regardless ofbgwriter_delay. If this value is specified without units, it is taken as milliseconds. The default value is 200 milliseconds (200ms). Note that on many systems, the effective resolution of sleep delays is 10 milliseconds; settingbgwriter_delayto a value that is not a multiple of 10 might have the same results as setting it to the next higher multiple of 10. This parameter can only be set in thepostgresql.conffile or on the server command line.bgwriter_lru_maxpages(integer)In each round, no more than this many buffers will be written by the background writer. Setting this to zero disables background writing. (Note that checkpoints, which are managed by a separate, dedicated auxiliary process, are unaffected.) The default value is 100 buffers. This parameter can only be set in the
postgresql.conffile or on the server command line.bgwriter_lru_multiplier(floating point)The number of dirty buffers written in each round is based on the number of new buffers that have been needed by server processes during recent rounds. The average recent need is multiplied by
bgwriter_lru_multiplierto arrive at an estimate of the number of buffers that will be needed during the next round. Dirty buffers are written until there are that many clean, reusable buffers available. (However, no more thanbgwriter_lru_maxpagesbuffers will be written per round.) Thus, a setting of 1.0 represents a “just in time” policy of writing exactly the number of buffers predicted to be needed. Larger values provide some cushion against spikes in demand, while smaller values intentionally leave writes to be done by server processes. The default is 2.0. This parameter can only be set in thepostgresql.conffile or on the server command line.bgwriter_flush_after(integer)Whenever more than this amount of data has been written by the background writer, attempt to force the OS to issue these writes to the underlying storage. Doing so will limit the amount of dirty data in the kernel's page cache, reducing the likelihood of stalls when an
fsyncis issued at the end of a checkpoint, or when the OS writes data back in larger batches in the background. Often that will result in greatly reduced transaction latency, but there also are some cases, especially with workloads that are bigger than shared_buffers, but smaller than the OS's page cache, where performance might degrade. This setting may have no effect on some platforms. If this value is specified without units, it is taken as blocks, that isBLCKSZbytes, typically 8kB. The valid range is between0, which disables forced writeback, and2MB. The default is512kBon Linux,0elsewhere. (IfBLCKSZis not 8kB, the default and maximum values scale proportionally to it.) This parameter can only be set in thepostgresql.conffile or on the server command line.
Smaller values of bgwriter_lru_maxpages and bgwriter_lru_multiplier reduce the extra I/O load caused by the background writer, but make it more likely that server processes will have to issue writes for themselves, delaying interactive queries.
19.4.6. Asynchronous Behavior
backend_flush_after(integer)Whenever more than this amount of data has been written by a single backend, attempt to force the OS to issue these writes to the underlying storage. Doing so will limit the amount of dirty data in the kernel's page cache, reducing the likelihood of stalls when an
fsyncis issued at the end of a checkpoint, or when the OS writes data back in larger batches in the background. Often that will result in greatly reduced transaction latency, but there also are some cases, especially with workloads that are bigger than shared_buffers, but smaller than the OS's page cache, where performance might degrade. This setting may have no effect on some platforms. If this value is specified without units, it is taken as blocks, that isBLCKSZbytes, typically 8kB. The valid range is between0, which disables forced writeback, and2MB. The default is0, i.e., no forced writeback. (IfBLCKSZis not 8kB, the maximum value scales proportionally to it.)effective_io_concurrency(integer)Sets the number of concurrent disk I/O operations that Postgres Pro expects can be executed simultaneously. Raising this value will increase the number of I/O operations that any individual Postgres Pro session attempts to initiate in parallel. The allowed range is 1 to 1000, or zero to disable issuance of asynchronous I/O requests. Currently, this setting only affects bitmap heap scans.
For magnetic drives, a good starting point for this setting is the number of separate drives comprising a RAID 0 stripe or RAID 1 mirror being used for the database. (For RAID 5 the parity drive should not be counted.) However, if the database is often busy with multiple queries issued in concurrent sessions, lower values may be sufficient to keep the disk array busy. A value higher than needed to keep the disks busy will only result in extra CPU overhead. SSDs and other memory-based storage can often process many concurrent requests, so the best value might be in the hundreds.
Asynchronous I/O depends on an effective
posix_fadvisefunction, which some operating systems lack. If the function is not present then setting this parameter to anything but zero will result in an error. On some operating systems (e.g., Solaris), the function is present but does not actually do anything.The default is 1 on supported systems, otherwise 0. This value can be overridden for tables in a particular tablespace by setting the tablespace parameter of the same name (see ALTER TABLESPACE).
maintenance_io_concurrency(integer)Similar to
effective_io_concurrency, but used for maintenance work that is done on behalf of many client sessions.The default is 10 on supported systems, otherwise 0. This value can be overridden for tables in a particular tablespace by setting the tablespace parameter of the same name (see ALTER TABLESPACE).
max_worker_processes(integer)Sets the maximum number of background processes that the system can support. This parameter can only be set at server start. The default is 8.
When running a standby server, you must set this parameter to the same or higher value than on the primary server. Otherwise, queries will not be allowed in the standby server.
When changing this value, consider also adjusting max_parallel_workers, max_parallel_maintenance_workers, and max_parallel_workers_per_gather.
max_parallel_workers_per_gather(integer)Sets the maximum number of workers that can be started by a single
GatherorGather Mergenode. Parallel workers are taken from the pool of processes established by max_worker_processes, limited by max_parallel_workers. Note that the requested number of workers may not actually be available at run time. If this occurs, the plan will run with fewer workers than expected, which may be inefficient. The default value is 2. Setting this value to 0 disables parallel query execution.Note that parallel queries may consume very substantially more resources than non-parallel queries, because each worker process is a completely separate process which has roughly the same impact on the system as an additional user session. This should be taken into account when choosing a value for this setting, as well as when configuring other settings that control resource utilization, such as work_mem. Resource limits such as
work_memare applied individually to each worker, which means the total utilization may be much higher across all processes than it would normally be for any single process. For example, a parallel query using 4 workers may use up to 5 times as much CPU time, memory, I/O bandwidth, and so forth as a query which uses no workers at all.For more information on parallel query, see Chapter 15.
max_parallel_maintenance_workers(integer)Sets the maximum number of parallel workers that can be started by a single utility command. Currently, the parallel utility commands that support the use of parallel workers are
CREATE INDEXonly when building a B-tree index, andVACUUMwithoutFULLoption. Parallel workers are taken from the pool of processes established by max_worker_processes, limited by max_parallel_workers. Note that the requested number of workers may not actually be available at run time. If this occurs, the utility operation will run with fewer workers than expected. The default value is 2. Setting this value to 0 disables the use of parallel workers by utility commands.Note that parallel utility commands should not consume substantially more memory than equivalent non-parallel operations. This strategy differs from that of parallel query, where resource limits generally apply per worker process. Parallel utility commands treat the resource limit
maintenance_work_memas a limit to be applied to the entire utility command, regardless of the number of parallel worker processes. However, parallel utility commands may still consume substantially more CPU resources and I/O bandwidth.max_parallel_workers(integer)Sets the maximum number of workers that the system can support for parallel operations. The default value is 8. When increasing or decreasing this value, consider also adjusting max_parallel_maintenance_workers and max_parallel_workers_per_gather. Also, note that a setting for this value which is higher than max_worker_processes will have no effect, since parallel workers are taken from the pool of worker processes established by that setting.
-
parallel_leader_participation(boolean) Allows the leader process to execute the query plan under
GatherandGather Mergenodes instead of waiting for worker processes. The default ison. Setting this value tooffreduces the likelihood that workers will become blocked because the leader is not reading tuples fast enough, but requires the leader process to wait for worker processes to start up before the first tuples can be produced. The degree to which the leader can help or hinder performance depends on the plan type, number of workers and query duration.old_snapshot_threshold(integer)Sets the minimum amount of time that a query snapshot can be used without risk of a “snapshot too old” error occurring when using the snapshot. Data that has been dead for longer than this threshold is allowed to be vacuumed away. This can help prevent bloat in the face of snapshots which remain in use for a long time. To prevent incorrect results due to cleanup of data which would otherwise be visible to the snapshot, an error is generated when the snapshot is older than this threshold and the snapshot is used to read a page which has been modified since the snapshot was built.
If this value is specified without units, it is taken as minutes. A value of
-1(the default) disables this feature, effectively setting the snapshot age limit to infinity. This parameter can only be set at server start.Useful values for production work probably range from a small number of hours to a few days. Small values (such as
0or1min) are only allowed because they may sometimes be useful for testing. While a setting as high as60dis allowed, please note that in many workloads extreme bloat or page-level transaction ID wraparound may occur in much shorter time frames.When this feature is enabled, freed space at the end of a relation cannot be released to the operating system, since that could remove information needed to detect the “snapshot too old” condition. All space allocated to a relation remains associated with that relation for reuse only within that relation unless explicitly freed (for example, with
VACUUM FULL).This setting does not attempt to guarantee that an error will be generated under any particular circumstances. In fact, if the correct results can be generated from (for example) a cursor which has materialized a result set, no error will be generated even if the underlying rows in the referenced table have been vacuumed away. Some tables cannot safely be vacuumed early, and so will not be affected by this setting, such as system catalogs. For such tables this setting will neither reduce bloat nor create a possibility of a “snapshot too old” error on scanning.
19.4.7. Prioritization
usage_tracking_interval(integer)Sets the time interval, in seconds, for calculating usage statistics. Based on this statistics, Postgres Pro Enterprise can control resource usage for each session in accordance with the prioritization policy configured by session_cpu_weight, session_ioread_weight, and session_iowrite_weight parameters.
When set to a positive value, this parameter starts a background worker that collects statistics on CPU time, the number of local and shared blocks read by the backends, and the number of local and shared blocks dirtied by the backends. Avoid setting this parameter to a small value as frequent statistic collection can cause overhead.
The default value is zero, which disables statistics collection and resource prioritization.
This parameter can only be set in the
postgresql.conffile or on the server command line.session_cpu_weight(integer)Sets CPU usage weight for the current session. Possible values are
1,2,4, and8. The higher the value, the more resources the session can use as compared to sessions with lower weights.The usage_tracking_interval parameter must be set to a positive value for this setting to take effect. Resource usage is planned based on the statistics collected for the previous interval defined by usage_tracking_interval. If all sessions have the same weight, Postgres Pro Enterprise does not prioritize resource usage.
Default:
4session_ioread_weight(integer)Sets the weight for reading local and shared blocks for the current session. Possible values are
1,2,4, and8. The higher the value, the more resources the session can use as compared to sessions with lower weights.The usage_tracking_interval parameter must be set to a positive value for this setting to take effect. Resource usage is planned based on the statistics collected for the previous interval defined by usage_tracking_interval. If all sessions have the same weight, Postgres Pro Enterprise does not prioritize resource usage.
Default:
4session_iowrite_weight(integer)Sets the weight for writing to local and shared blocks for the current session. Possible values are
1,2,4, and8. The higher the value, the more resources the session can use as compared to sessions with lower weights.The usage_tracking_interval parameter must be set to a positive value for this setting to take effect. Resource usage is planned based on the statistics collected for the previous interval defined by usage_tracking_interval. If all sessions have the same weight, Postgres Pro Enterprise does not prioritize resource usage.
Default:
4