19.4. Потребление ресурсов #
19.4.1. Память #
shared_buffers
(integer
) #Задаёт объём памяти, который будет использовать сервер баз данных для буферов в разделяемой памяти. По умолчанию это обычно 128 мегабайт (
128MB
), но может быть и меньше, если конфигурация вашего ядра накладывает дополнительные ограничения (это определяется в процессе initdb). Это значение не должно быть меньше 128 килобайт. Однако для хорошей производительности обычно требуются гораздо большие значения. Если это значение задаётся без единиц измерения, оно считается заданным в блоках (размер которых равенBLCKSZ
байт, обычно это 8 КБ). Минимальное допустимое значение зависит от величиныBLCKSZ
. Задать этот параметр можно только при запуске сервера.Если вы используете выделенный сервер с объёмом ОЗУ 1 ГБ и более, разумным начальным значением
shared_buffers
будет 25% от объёма памяти. Существуют варианты нагрузки, при которых эффективны будут и ещё большие значенияshared_buffers
, но так как PostgreSQL использует и кеш операционной системы, выделять дляshared_buffers
более 40% ОЗУ вряд ли будет полезно. При увеличенииshared_buffers
обычно требуется соответственно увеличитьmax_wal_size
, чтобы растянуть процесс записи большого объёма новых или изменённых данных на более продолжительное время.В системах с объёмом ОЗУ меньше 1 ГБ стоит ограничиться меньшим процентом ОЗУ, чтобы оставить достаточно места операционной системе.
huge_pages
(enum
) #Определяет, будут ли огромные страницы запрашиваться из основной области общей памяти. Допустимые значения:
try
(по умолчанию),on
иoff
. Когда параметрhuge_pages
равенtry
, сервер будет пытаться запрашивать огромные страницы, но если это ему не удастся, вернётся к стандартному поведению. Со значениемon
, если получить огромные страницы не удастся, сервер не будет запущен. Со значениемoff
большие страницы не будут запрашиваться. Фактическое состояние огромных страниц показывается серверной переменной huge_pages_status.В настоящее время это поддерживается в Linux и в Windows. В других системах значение
try
просто игнорируется. В Linux эта поддержка обеспечивается, только когда параметрshared_memory_type
имеет значениеmmap
(по умолчанию).В результате использования огромных страниц уменьшаются таблицы страниц, и процессор тратит меньше времени на управление памятью, что приводит к увеличению быстродействия. За более подробной информацией об использовании огромных страниц в Linux обратитесь к Подразделу 18.4.5.
Огромные страницы в Windows называются большими страницами. Чтобы использовать их, необходимо дать пользователю Windows, от имени которого работает PostgreSQL, право блокировать страницы. Для назначения пользователю этого права вы можете воспользоваться средством управления групповой политикой Windows (gpedit.msc). Чтобы сервер баз данных запускался в командной строке как отдельный процесс, а не как служба Windows, приглашение командной строки должно запускаться от имени администратора или должен быть отключён механизм UAC (User Access Control, Контроль учётных записей пользователей). Когда UAC включён, в обычном командном приглашении пользователь лишается права блокировать большие страницы в памяти.
Заметьте, что этот параметр влияет только на основную область общей памяти. В операционных системах, таких как Linux, FreeBSD и Illumos огромные страницы (также называемые «суперстраницами» или «большими» страницами) могут также автоматически использоваться при обычном выделении памяти, без явного запроса со стороны PostgreSQL. В Linux это называется «прозрачными огромными страницами» (Transparent Huge Pages, THP). Известно, что это приводит к снижению быстродействия PostgreSQL в некоторых системах Linux у ряда пользователей, поэтому использовать этот механизм в настоящее время не рекомендуется (в отличие от явного использования
huge_pages
).huge_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, чтобы подготовить транзакцию можно было в каждом сеансе.Для ведомого сервера значение этого параметра должно быть больше или равно значению на ведущем. В противном случае на ведомом сервере не будут разрешены запросы.
work_mem
(integer
) #Задаёт базовый максимальный объём памяти, который будет использоваться во внутренних операциях при обработке запросов (например, для сортировки или хеш-таблиц), прежде чем будут задействованы временные файлы на диске. Если это значение задаётся без единиц измерения, оно считается заданным в килобайтах. Значение по умолчанию — четыре мегабайта (
4MB
). Заметьте, что в сложных запросах одновременно могут выполняться несколько операций сортировки и хеширования, и при этом примерно этот объём памяти может использоваться в каждой операции, прежде чем данные начнут вытесняться во временные файлы. Кроме того, такие операции могут выполняться одновременно в разных сеансах. Таким образом, общий объём памяти может многократно превосходить значениеwork_mem
; это следует учитывать, выбирая подходящее значение. Операции сортировки используются дляORDER BY
,DISTINCT
и соединений слиянием. Хеш-таблицы используются при соединениях и агрегировании по хешу, мемоизации узлов, а также обработке подзапросовIN
с применением хеша.Операции вычисления хеша обычно более требовательны к памяти, чем равнозначные им операции сортировки. Поэтому ограничение памяти для хеш-таблиц определяется произведением
work_mem
иhash_mem_multiplier
и может превышать обычный базовый объёмwork_mem
.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.
autovacuum_work_mem
(integer
) #Задаёт максимальный объём памяти, который будет использовать каждый рабочий процесс автоочистки. Если это значение задаётся без единиц измерения, оно считается заданным в килобайтах. При действующем по умолчанию значении
-1
этот объём определяется значением maintenance_work_mem. Этот параметр не влияет на поведение командыVACUUM
, выполняемой в других контекстах. Задать этот параметр можно только вpostgresql.conf
или в командной строке при запуске сервера.vacuum_buffer_usage_limit
(integer
) #Указывает размер стратегии доступа к буферам, используемой командами
VACUUM
иANALYZE
. Значение0
позволит операции использовать любое количествоshared_buffers
. В противном случае допустимые размеры варьируются от128 kB
до16 GB
. Если указанный размер превышает 1/8 размераshared_buffers
, он автоматически ограничивается этим значением. Значение по умолчанию:2 MB
. Если это значение задаётся без единиц измерения, оно считается заданным в килобайтах. Этот параметр можно задать в любой момент. Его также можно переопределить для VACUUM и ANALYZE при передаче параметраBUFFER_USAGE_LIMIT
. С большим значением параметра командыVACUUM
иANALYZE
могут выполняться быстрее, но при слишком большом значении многие полезные страницы могут вытесняться из общих буферов.logical_decoding_work_mem
(integer
) #Задаёт максимальный объём памяти, используемой для логического декодирования, после превышения которого некоторые декодированные изменения будут вымещаться на локальный диск. Тем самым ограничивается объём памяти, используемой подключениями потоковой логической репликации. По умолчанию его значение — 64 мегабайта (
64MB
). Так как каждое подключение репликации использует один буфер заданного размера, а количество таких подключений к одному серверу обычно невелико (оно ограничивается значениемmax_wal_senders
), значение данного параметра вполне можно сделать достаточно большим, намного превышающимwork_mem
, чтобы минимизировать объём вымещаемых на диск декодируемых изменений.commit_timestamp_buffers
(integer
) #Задаёт объём памяти, используемый для кеширования содержимого
pg_commit_ts
(см. Таблицу 66.1). Если значение указано без единиц измерения, оно считается заданным в блоках (размер которых равенBLCKSZ
байт, обычно это 8 КБ). Значение по умолчанию —0
, которое означает, что будет использованоshared_buffers
/512 блоков, но не более 1024 и не менее 16 блоков. Этот параметр можно задать только при запуске сервера.multixact_member_buffers
(integer
) #Задаёт объём общей памяти, используемый для кеширования содержимого
pg_multixact/members
(см. Таблицу 66.1). Если это значение задаётся без единиц измерения, оно считается заданным в блоках (размер которых равенBLCKSZ
байт, обычно это 8 КБ). Значение по умолчанию —32
. Задать этот параметр можно только при запуске сервера.multixact_offset_buffers
(integer
) #Задаёт объём общей памяти, используемый для кеширования содержимого
pg_multixact/offsets
(см. Таблицу 66.1). Если это значение задаётся без единиц измерения, оно считается заданным в блоках (размер которых равенBLCKSZ
байт, обычно это 8 КБ). Значение по умолчанию —16
. Задать этот параметр можно только при запуске сервера.notify_buffers
(integer
) #Задаёт объём общей памяти, используемый для кеширования содержимого
pg_notify
(см. Таблицу 66.1). Если значение указано без единиц измерения, оно считается заданным в блоках (размер которых равенBLCKSZ
байт, обычно это 8 КБ). Значение по умолчанию —16
. Этот параметр можно задать только при запуске сервера.serializable_buffers
(integer
) #Задаёт объём общей памяти, используемый для кеширования содержимого
pg_serial
(см. Таблицу 66.1). Если это значение задаётся без единиц измерения, оно считается заданным в блоках (размер которых равенBLCKSZ
байт, обычно это 8 КБ). Значение по умолчанию —32
. Задать этот параметр можно только при запуске сервера.subtransaction_buffers
(integer
) #Задаёт объём памяти, используемый для кеширования содержимого
pg_subtrans
(см. Таблицу 66.1). Если значение указано без единиц измерения, оно считается заданным в блоках (размер которых равенBLCKSZ
байт, обычно это 8 КБ). Значение по умолчанию —0
, которое означает, что будет использованоshared_buffers
/512 блоков, но не более 1024 и не менее 16 блоков. Этот параметр можно задать только при запуске сервера.transaction_buffers
(integer
) #Задаёт объём памяти, используемый для кеширования содержимого
pg_xact
(см. Таблицу 66.1). Если значение указано без единиц измерения, оно считается заданным в блоках (размер которых равенBLCKSZ
байт, обычно это 8 КБ). Значение по умолчанию —0
, которое означает, что будет использованоshared_buffers
/512 блоков, но не более 1024 и не менее 16 блоков. Этот параметр можно задать только при запуске сервера.max_stack_depth
(integer
) #Задаёт максимальную безопасную глубину стека для исполнителя. В идеале это значение должно равняться предельному размеру стека, ограниченному ядром (который устанавливается командой
ulimit -s
или аналогичной), за вычетом запаса примерно в мегабайт. Этот запас необходим, потому что сервер проверяет глубину стека не в каждой процедуре, а только в потенциально рекурсивных процедурах, например, при вычислении выражений. Если это значение задаётся без единиц измерения, оно считается заданным в килобайтах. Значение по умолчанию — два мегабайта (2MB
) — выбрано с большим запасом, так что риск переполнения стека минимален. Но с другой стороны, его может быть недостаточно для выполнения сложных функций. Изменить этот параметр могут только суперпользователи и пользователи с соответствующим правомSET
.Если
max_stack_depth
будет превышать фактический предел ядра, то функция с неограниченной рекурсией сможет вызвать крах отдельного процесса сервера. В системах, где PostgreSQL может определить предел, установленный ядром, он не позволит установить для этого параметра небезопасное значение. Однако эту информацию выдают не все системы, поэтому выбирать это значение следует с осторожностью.shared_memory_type
(enum
) #Выбирает механизм разделяемой памяти, используя который сервер будет работать с основной областью общей памяти, содержащей общие буферы PostgreSQL и другие общие данные. Допустимые варианты:
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
(память не выделяется). Этот параметр можно установить только при запуске сервера.
19.4.2. Диск #
temp_file_limit
(integer
) #Задаёт максимальный объём дискового пространства, который сможет использовать один процесс для временных файлов, например, при сортировке и хешировании, или для сохранения удерживаемого курсора. Транзакция, которая попытается превысить этот предел, будет отменена. Если это значение задаётся без единиц измерения, оно считается заданным в килобайтах. Значение
-1
(по умолчанию) означает, что предел отсутствует. Изменить этот параметр могут только суперпользователи и пользователи с соответствующим правомSET
.Этот параметр ограничивает общий объём, который могут занимать в момент времени все временные файлы, задействованные в данном процессе PostgreSQL. Следует отметить, что это не касается файлов явно создаваемых временных таблиц; ограничивается только объём временных файлов, которые создаются неявно при выполнении запросов.
file_copy_method
(enum
) #Задаёт метод копирования файлов. Возможные значения:
COPY
(по умолчанию) иCLONE
(если поддерживается операционной системой).Этот параметр влияет на следующие команды:
CREATE DATABASE ... STRATEGY=FILE_COPY
ALTER DATABASE ... SET TABLESPACE ...
Если установлено значение
CLONE
, используются системные вызовыcopy_file_range()
(Linux, FreeBSD) илиcopyfile
(macOS), благодаря которым ядро может совместно использовать дисковые блоки или передавать операции копирования на более низкие слои в некоторых файловых системах.max_notify_queue_pages
(integer
) #Задаёт максимальное количество выделенных страниц для очереди NOTIFY / LISTEN. Значение по умолчанию — 1048576. Для страниц размером 8 КБ позволяет использовать до 8 ГБ дискового пространства.
19.4.3. Использование ресурсов ядра #
max_files_per_process
(integer
) #Задаёт максимальное число файлов, которые могут быть одновременно открыты каждым серверным подпроцессом. В этом значении не учитываются файлы, уже открытые в процессе postmaster. Значение по умолчанию —
1000
.Если ядро реализует безопасное ограничение по процессам, об этом параметре можно не беспокоиться. Но на некоторых платформах (а именно, в большинстве систем BSD) ядро позволяет отдельному процессу открыть больше файлов, чем могут открыть несколько процессов одновременно. Если вы столкнётесь с ошибками «Too many open files» (Слишком много открытых файлов), попробуйте уменьшить это число. Задать этот параметр можно только при запуске сервера.
19.4.4. Фоновая запись #
В числе специальных процессов сервера есть процесс фоновой записи, задача которого — осуществлять запись «грязных» (новых или изменённых) общих буферов на диск. Когда количество чистых общих буферов считается недостаточным, данный процесс записывает грязные буферы в файловую систему и помечает их как чистые. Это снижает вероятность того, что серверные процессы, выполняющие запросы пользователей, не смогут найти чистые буферы и им придётся сбрасывать грязные буферы самостоятельно. Однако процесс фоновой записи увеличивает общую нагрузку на подсистему ввода-вывода, так как он может записывать неоднократно изменяемую страницу несколько раз, тогда как её можно было бы записать всего один раз в контрольной точке. Параметры, рассматриваемые в данном подразделе, позволяют настроить поведение фоновой записи для конкретных нужд.
bgwriter_delay
(integer
) #Задаёт задержку между раундами активности процесса фоновой записи. Во время раунда этот процесс осуществляет запись некоторого количества загрязнённых буферов (это настраивается следующими параметрами). Затем он засыпает на время
bgwriter_delay
, и всё повторяется снова. Однако если в пуле не остаётся загрязнённых буферов, он может быть неактивен более длительное время, не зависящее от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.5. Ввод-вывод #
backend_flush_after
(integer
) #Когда одним обслуживающим процессом записывается больше заданного объёма данных, сервер даёт указание ОС произвести запись этих данных в нижележащее хранилище. Это ограничивает объём «грязных» данных в страничном кеше ядра и уменьшает вероятность затормаживания при выполнении
fsync
в конце контрольной точки или когда ОС сбрасывает данные на диск большими порциями в фоне. Часто это значительно сокращает задержки транзакций, но бывают ситуации (особенно когда объём рабочей нагрузки больше shared_buffers, но меньше страничного кеша ОС), когда производительность может упасть. Этот параметр действует не на всех платформах. Если значение параметра задаётся без единиц измерения, оно считается заданным в блоках (размер которых равенBLCKSZ
байт, обычно это 8 КБ). Он может принимать значение от0
(при этом управление отложенной записью отключается) до 2 мегабайт (2MB
). По умолчанию он имеет значение0
, то есть это поведение отключено. (ЕслиBLCKSZ
отличен от 8 КБ, максимальное значение корректируется пропорционально.)effective_io_concurrency
(integer
) #Задаёт допустимое число параллельных операций ввода-вывода из хранилища, которое говорит PostgreSQL о том, сколько операций ввода-вывода могут быть выполнены одновременно. Чем больше это число, тем больше операций ввода-вывода будет пытаться выполнить параллельно PostgreSQL в отдельном сеансе. Допустимые значения лежат в интервале от
1
до1000
, а значение0
отключает асинхронные запросы ввода-вывода. Значение по умолчанию —16
.Если задать более высокое значение, это наибольшим образом скажется на хранилищах с высокой задержкой, в которых операции ввода-вывода в противном случае существенно затормаживаются, и на устройствах с высокими показателями ввода-вывода в секунду. Излишне высокое значение параметра может привести к задержке ввода-вывода всех запросов системы.
В системах с поддержкой подсказок предвыборки параметр
effective_io_concurrency
также управляет расстоянием предвыборки.Это значение можно переопределить для таблиц в определённом табличном пространстве, установив одноимённый параметр табличного пространства (см. ALTER TABLESPACE).
maintenance_io_concurrency
(integer
) #Этот параметр подобен
effective_io_concurrency
, но используется для операций обслуживания, которые выполняются в различных клиентских сеансах.Значение по умолчанию —
16
. Это значение можно переопределить для таблиц в определённом табличном пространстве, установив одноимённый параметр табличного пространства (см. ALTER TABLESPACE).io_max_combine_limit
(integer
) #Задаёт наибольший размер ввода-вывода в операциях, объединяющих ввод-вывод, и без вывода предупреждения ограничивает значение задаваемого пользователем параметра
io_combine_limit
. Этот параметр можно задать только вpostgresql.conf
или в командной строке при запуске сервера. Максимальное возможное значение зависит от операционной системы и размера блока, но обычно составляет 1 МБ в Unix и 128 КБ в Windows. Значение по умолчанию — 128 КБ.io_combine_limit
(integer
) #Задаёт наибольший размер ввода-вывода в операциях, объединяющих ввод-вывод. Если заданное значение превышает значение параметра
io_max_combine_limit
, без вывода предупреждения будет использовано более низкое значение. По этой причине для увеличения ввода-вывода может потребоваться увеличить значение обоих параметров. Максимальное возможное значение зависит от операционной системы и размера блока, но обычно составляет 1 МБ в Unix и 128 КБ в Windows. Значение по умолчанию — 128 КБ.io_max_concurrency
(integer
) #Задаёт максимальное количество операций ввода-вывода, которые один процесс может выполнять одновременно.
Если установлено значение по умолчанию
-1
, значение рассчитывается на основе shared_buffers и максимального числа процессов (max_connections, autovacuum_worker_slots, max_worker_processes и max_wal_senders), но не превышает64
.Этот параметр можно задать только при запуске сервера.
io_method
(enum
) #Задаёт метод выполнения асинхронного ввода-вывода. Возможные значения:
worker
(выполнять асинхронный ввод-вывод, используя рабочие процессы)io_uring
(выполнять асинхронный ввод-вывод, используя io_uring; требуется сборка с--with-liburing
или-Dliburing
)sync
(выполнять синхронно операции ввода-вывода, которые могут выполняться асинхронно)
Значение по умолчанию —
worker
.Этот параметр можно задать только при запуске сервера.
io_workers
(integer
) #Задаёт количество рабочих процессов ввода-вывода. Значение по умолчанию —
3
. Задать этот параметр можно только вpostgresql.conf
или в командной строке при запуске сервера.Этот параметр работает, только если для io_method задано значение
worker
.
19.4.6. Рабочие процессы #
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-дерева, GIN или BRIN и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
снижает вероятность блокировки рабочих процессов в случае, если ведущий процесс будет читать кортежи недостаточно быстро, но тогда ведущему приходится дожидаться запуска рабочих процессов, и только затем выдавать первые кортежи. Степень положительного или отрицательного влияния ведущего зависит от типа плана, числа рабочих процессов и длительности запроса.