2

Оптимизация Linux для PostgreSQL: рекомендации

Серия СУБД PostgreSQL

Взято с основного технического канала Postgres DBA (возможны правки в исходной статье).

От кэша в памяти до планировщика CPU: полный путь к производительности

От кэша в памяти до планировщика CPU: полный путь к производительности

На основе экспериментальных данных и анализа представлено руководство по оптимизации ядра Linux для серверов PostgreSQL, испытывающих высокую нагрузку с преобладанием операций чтения — типичную для аналитических запросов, отчётов и систем обработки данных. Цель настройки — полностью раскрыть потенциал современного оборудования путём точной коррекции ключевых параметров, отвечающих за работу с памятью, дисковыми операциями и распределением задач процессора. Особое внимание уделяется использованию высокоскоростных накопителей SSD/NVMe и значительных объёмов оперативной памяти для снижения задержек и повышения эффективности кэширования данных.

По итогам проведенных экспериментов и на основании анализа результатов

10 ключевых параметров операционной системы Linux для read-heavy (нагрузки с преобладанием чтения) работы PostgreSQL . Их оптимизация позволит максимально использовать кэширование, снизить задержки ввода-вывода и эффективно распределить ресурсы процессора.

Для удобства параметры разделены по категориям: память, ввод-вывод и планировщик процессов. Рекомендуемые значения ориентированы на современное оборудование (SSD/NVMe) и значительный объем оперативной памяти.

🗂️ Память

Huge Pages (Огромные страницы)

Описание: Уменьшает нагрузку на TLB процессора и фрагментацию памяти, повышая производительность операций с большими объемами данных (например, shared_buffers).

Рекомендуемое значение: Включить явно (vm.nr_hugepages в sysctl и huge_pages = on в PostgreSQL). Отключить Transparent Huge Pages (THP).

Shared Memory Limits (shmmax, shmall)

Описание: Определяют максимальный размер одного сегмента и общий объем разделяемой памяти. Необходимы для выделения shared_buffers PostgreSQL.

Рекомендуемое значение: kernel.shmmax ≥ размер shared_buffers. kernel.shmall ≥ общий объем разделяемой памяти / размер страницы.

vm.swappiness

Описание: Склонность ядра к выгрузке страниц памяти на диск (своп). Низкое значение помогает удерживать кэш БД в RAM.

Рекомендуемое значение: 1 (минимальное) — 10.

vm.overcommit_memory

Описание: Стратегия выделения памяти. Вариант 2 предотвращает "OOM Killer" из-за чрезмерной памяти, выделенной процессам.

Рекомендуемое значение: 2 (рекомендовано для серверов БД).

Политика управления "грязными" страницами (dirty_*)

Описание: Контролирует, как часто модифицированные данные в памяти записываются на диск. Оптимизация снижает пики ввода-вывода.

Рекомендуемое значение: Использовать абсолютные значения в байтах для точного контроля (например, vm.dirty_background_bytes=67108864, vm.dirty_bytes=536870912). Для read-heavy нагрузки можно немного увеличить лимиты.

💾 Ввод-вывод (I/O) и Файловая система

noatime/nodiratime для точки монтирования данных

Описание: Отключает запись времени последнего доступа к файлу, экономя дисковые операции.

Рекомендуемое значение: Добавить опции noatime,nodiratime в /etc/fstab для раздела с данными PostgreSQL.

kernel.sched_migration_cost_ns

Описание: Время, в течение которого планировщик будет держать задачу на том же CPU перед миграцией. Снижение может улучшить балансировку нагрузки для параллельных процессов PostgreSQL.

Рекомендуемое значение: Экспериментально, например 50000 (50 мкс) для систем с несколькими ядрами.

Read Ahead для Logical Volume

Описание: Объем данных, которые система предзагружает с диска при последовательном чтении. Для read-heavy и OLAP полезно.

Рекомендуемое значение: Включить и увеличить значение (например, до 16384 КБ) для томов с данными БД.

⚙️ Планировщик и Лимиты ОС

Регулятор CPU и энергосбережение

Описание: Гарантирует, что процессоры работают на максимальной частоте, исключая задержки из-за энергосбережения.

Рекомендуемое значение: Установить регулятор в performance и отключить балансировку NUMA (kernel.numa_balancing=0), если нет разнородного доступа к памяти.

Лимиты на количество файлов и процессов (nofile, nproc)

Описание: Максимальное число одновременно открытых файлов и процессов для пользователя postgres. Критично при высоком max_connections.

Рекомендуемое значение: Значительно увеличить (например, soft/hard nofile = 500000, nproc = 500000).

💎 Рекомендации для read-heavy нагрузки

Для нагрузок, где чтение сильно преобладает над записью (например, отчетные системы, аналитика), сделайте акцент на следующем:

  1. Память и кэширование: Максимально увеличить shared_buffers (до 25-40% RAM), обязательно включите Huge Pages. Установите низкий vm.swappiness (1-10).

  2. Планировщик процессов: Настроить kernel.sched_migration_cost_ns для лучшего распределения параллельных запросов. Установить регулятор CPU в performance.

  3. Автоочистка (Autovacuum): Агрессивность может быть частично отключена, так как данные редко меняются. Это экономит CPU-циклы. Однако плановый VACUUM (например, по cron) в период низкой нагрузки необходим.

🛠️ Практические шаги по настройке

  1. Проверка текущих значений: sysctl -a | grep <параметр> и tuned-adm active для просмотра текущей конфигурации.

  2. Применение настроек:

  3. Через tuned (рекомендуется для RHEL/CentOS): Создать пользовательский профиль, как в , и активировать его командой tuned-adm profile <имя_профиля>.

  4. Через sysctl: Добавить параметры в файл /etc/sysctl.d/99-postgresql.conf и выполните sysctl -p.

  5. Настройка Huge Pages: Рассчитать необходимое количество: (shared_buffers + другие затраты) / 2MB. Установитб через vm.nr_hugepages в sysctl и huge_pages = on в postgresql.conf.

  6. Монтирование с noatime: Отредактировать /etc/fstab, добавив опции к разделу с данными, и перемонтировать (mount -o remount /path).

  7. Увеличение лимитов ОС: Отредактировать файл /etc/security/limits.d/postgresql.conf и настроить службы в systemd (если используется).

  8. Перезагрузка: Перезагрузить сервер для применения всех изменений, особенно связанных с Huge Pages и tuned.

Итог

Для PostgreSQL с нагрузкой, где преобладает чтение, критически важны настройки, уменьшающие латентность ввода-вывода и максимизирующие использование оперативной памяти под кэш.

Ключевые шаги: обязательное включение Huge Pages, увеличение shared_buffers, снижение swappiness, отключение ненужных обновлений атрибутов файлов (noatime), настройка планировщика процессов и регулятора CPU на режим производительности, а также увеличение системных лимитов. Агрессивность autovacuum может быть снижена для экономии ресурсов.

Postgres DBA

191 пост27 подписчиков

Правила сообщества

Пока действуют стандартные правила Пикабу.

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества