Продолжаю изучать конфигурационные параметры PostgreSQL (конкретно сейчас – PostgreSQL 10). В этот раз рассмотрю очень важный параметр shared_buffers.
Конфигурационные параметры PostgreSQL лежат в каталоге с данными (PGDATA) в файле postgresql.conf.
- Параметр: shared_buffers
- Раздел: Использование ресурсов / Память
- Изменение: Требует перезагрузки сервера
- Принимаемое значение: integer
- Минимальное значение: 16 (128 кБ)
- Максимальное значение: 1073741823 блоков (~8586 Гб)
- Значение по умолчанию: 128МБ. А точнее: 16384 страниц по 8 кБ
- Особенность: последние значения, которые не кратны восьми, отбрасываются. То есть, если задать значение в кБ: 129 (130, 131 и до 135 включительно), значения свыше 128 и до 136 не будут учтены.
- Взаимосвязь: Параметр shared_buffers связан с параметром ядра linuxshmmax. С параметрами ядра я не разбирался еще. Но параметр kernel.shmmax в ОС должен быть больше, чем shared_buffers в PostgreSQL.
- Описание: В параметре shared_buffers устанавливается количество буферов в общей памяти, используемых сервером PostgreSQL.
Процессы, порождаемые при подключении клиента к PostgreSQL (максимальное количество таких процессов указывается в параметре max_connections), должны где-то хранить те строки, которые получают с диска (и те строки, которые собираются на диск записать) – хранят их в восьмикилобайтных (по умолчанию) блоках в совместной памяти – в shared_buffers.
PostgreSQL использует двойное кэширование данных – сначала в кэше ОС, а потом уже в собственном кэше. Так что не нужно устанавливать в shared_buffers всю доступную оперативную память.
Какой-то идеального значения для shared_buffers нет. Нужно смотреть на вашу нагрузку – какой объем базы, сколько подключений, какой сложности будут запросы и т.д. Оптимальное стартовое значение для начала экспериментов по настройке shared_buffers – четверть от доступной оперативной памяти.
- Как посмотреть
- Команда SHOW shared_buffers (отработает как для psql, так и в pgAdmin), автоматически выдает значение в килобайтах-мегабайтах:
-
- Запросом: select * from pg_settings s where name = ‘shared_buffers’, обратите внимание на поле В поле setting хранится значение, которое еще нужно умножить на unit, чтобы получить значение к кБ или МБ (что автоматом выдает SHOW shared_buffers):
- Эксперименты:
Хотел опубликовать описание параметра shared_buffers и свои эксперименты с ним в одной статье. Но получилось слишком много материала, поэтому решил разбит – эксперименты отдельно опубликовать. Завтра это сделаю.
Leave a Reply