Сообщество - Postgres DBA

Postgres DBA

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

Популярные теги в сообществе:

2

PG_EXPECTO + PGPRO_PWR : Синергия мониторинга и анализа: новые возможности диагностики и оптимизации СУБД

Серия СУБД PostgreSQL

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

От ожиданий — к ожидаемым результатам.

От ожиданий — к ожидаемым результатам.

Отслеживание метрик и анализ отдельных инцидентов часто не дают полной картины работы СУБД. Интеграция двух мощных инструментов — pgpro_pwr, собирающего детальную статистику, и pg_expecto, анализирующего события ожидания, — создает качественно новый уровень контроля. Этот симбиоз превращает разрозненные данные в последовательные и понятные сценарии для проактивного управления, глубокой диагностики и интеллектуальной оптимизации PostgreSQL.

Вопрос нейросети

Подготовь список новых возможностей и выгод от возможной интеграции комплексов pg_expecto и pgro_pwr

Ответ нейросети

Основываясь на возможностях pg_expecto и pgpro_pwr (или pgro_pwr), их интеграция может создать мощную платформу для управления производительностью PostgreSQL. Вот ключевые преимущества, сгруппированные по категориям.

🚨 Улучшенная диагностика и решение инцидентов

  • Контекстный анализ инцидентов: pg_expecto может использовать снимки нагрузки pgpro_pwr для сравнения состояния СУБД до и после инцидента, что помогает точнее определить причину проблем.

  • Автоматический поиск «виновников»: При падении производительности интегрированная система сможет автоматически сформировать список проблемных SQL-запросов, основываясь на корреляционном анализе ожиданий и данных о наиболее ресурсоемких операциях из pgpro_pwr.

  • Сквозной анализ «от железа до запроса»: Интеграция позволяет связать аномалии в метриках инфраструктуры (например, дисковый ввод/вывод, память) с конкретными событиями ожидания в СУБД и итоговыми медленными запросами.

🧠 Интеллектуальная оптимизация с помощью ИИ

  • Семантический анализ запросов: pg_expecto может автоматически готовить структурированные промпты для нейросетей (GPT, Claude), включая текст проблемных запросов, планы выполнения и статистику из pgpro_pwr. Это позволяет получать качественные рекомендации по оптимизации запросов, рефакторингу JOIN и условий WHERE.

  • Выявление паттернов: Нейросеть может анализировать множество запросов, выявленных pgpro_pwr, и находить общие проблемные паттерны (например, отсутствие индексов, неоптимальные соединения), давая сводные рекомендации.

  • Обоснованные рекомендации по настройке: Вместо общих советов система сможет давать конкретные рекомендации по параметрам PostgreSQL (shared_buffers, work_mem и др.), основанные на фактической нагрузке и статистике использования ресурсов.

🔮 Проактивный мониторинг и прогнозирование

  • Профили «нормального» состояния: На основе исторических снимков pgpro_pwr можно создать «цифровой двойник» СУБД в оптимальном состоянии, pg_expecto сможет отслеживать отклонения ключевых метрик от этого профиля.

  • Автоматическое создание инцидентов: Любое значимое отклонение может автоматически регистрироваться как событие в системах мониторинга (Zabbix, Grafana), сокращая время обнаружения проблем.

  • Предсказание деградации: Анализируя тенденции в данных pgpro_pwr (рост определенных ожиданий, изменение паттернов запросов), система может предупреждать о потенциальных проблемах до того, как они повлияют на пользователей.

⚙️ Операционная эффективность и автоматизация

  • Сокращение времени на анализ (MTTR): Автоматизация сбора данных, анализа и подготовки выводов значительно ускоряет расследование инцидентов.

  • Централизованное хранилище и отчетность: pgpro_pwr выступает как надежное хранилище детальной исторической статистики, а pg_expecto предоставляет интеллектуальный слой для работы с этими данными и генерации понятных отчетов.

  • Снижение порога вхождения для специалистов: Интегрированная система может направлять менее опытных инженеров, предлагая им не только данные, но и готовые гипотезы и шаги для проверки.

Пример практического сценария работы интеграции

  1. Выявление: Zabbix фиксирует рост времени отклика приложения.

  2. Сбор данных: pg_expecto автоматически запрашивает у pgpro_pwr снимок статистики за период инцидента и сравнивает его с предыдущим периодом.

  3. Анализ: Система обнаруживает резкий рост ожиданий типа IPC (межпроцессное взаимодействие) и коррелирующий с ним рост операций ввода/вывода на файловой системе /data.

  4. Поиск причины: Автоматически формируется список SQL-запросов, которые чаще всего вызывали эти ожидания.

  5. Генерация решения: Тексты запросов, их планы выполнения и контекст передаются нейросети, которая предлагает добавить конкретный недостающий индекс и приводит пример кода.

  6. Верификация: После применения изменений система продолжает мониторить метрики, подтверждая восстановление производительности.

Важные уточнения

  • Объединение сильных сторон: pgpro_pwr — это мощный источник детализированных данных, а pg_expecto интеллектуальный аналитический движок. Их интеграция позволяет не только видеть, что происходит, но и понимать, почему и что с этим делать.

  • Решение фундаментальной проблемы: Интеграция помогает ответить на сложный вопрос из поисковых результатов: что в цифрах означает «нормально» и «ненормально» для конкретной СУБД, основываясь не на общих шаблонах, а на ее собственной истории и характеристиках нагрузки.

  • Отсутствие «серебряной пули»: Важно помнить, что даже интегрированная система не заменит опыт администратора. Она призвана усилить его возможности, взяв на рутинную работу по сбору и первичному анализу данных, но итоговые решения и эксперименты должны проводиться под контролем специалиста.

Итог

Интеграция pg_expecto и pgpro_pwr формирует замкнутый цикл управления производительностью: от сбора детальной статистики и выявления аномалий до автоматизированного поиска root-cause и генерации рекомендаций по оптимизации. Это значительно сокращает время на диагностику (MTTR), позволяет перейти от реактивного к проактивному мониторингу и открывает путь к использованию ИИ для анализа паттернов и настройки СУБД, усиливая экспертов, а не заменяя их.

Показать полностью
4

PG_EXPECTO: Чек-лист проверки инфраструктуры Linux по результатам нагрузочного тестирования PostgreSQL

Серия СУБД PostgreSQL

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

От хаоса к порядку: настройка Linux для рекордов СУБД

От хаоса к порядку: настройка Linux для рекордов СУБД

Данный чек-лист представляет собой структурированное руководство по оптимизации операционной системы Linux для развертывания высоконагруженных систем управления базами данных (СУБД). Он основан на анализе критических проблем производительности, таких как высокий I/O wait, блокировка процессов и неэффективное использование памяти. Материал систематизирован по приоритетам — от критических изменений, без которых невозможна стабильная работа, до тонкой настройки для достижения максимальной эффективности. Следуя этим рекомендациям, администраторы смогут значительно повысить отказоустойчивость и скорость отклика инфраструктуры, особенно в средах с интенсивной транзакционной (OLTP) или аналитической (OLAP) нагрузкой.

ЧЕК-ЛИСТ ПАРАМЕТРОВ LINUX ДЛЯ ОПТИМИЗАЦИИ ИНФРАСТРУКТУРЫ СУБД

КРИТИЧЕСКИЙ УРОВЕНЬ (High Priority)

Параметры, напрямую влияющие на критические проблемы: высокий I/O wait, процессы в состоянии D, нехватка RAM.

vm.dirty_ratio

Команда проверки: sysctl vm.dirty_ratio
Целевое значение: 10-15
Обоснование: Ключевой параметр! Определяет порог, при котором процессы блокируются на запись. Высокое значение (20-30) приводит к накоплению "грязных" страниц и массовым блокировкам (состояние D).

vm.dirty_background_ratio

Команда проверки: sysctl vm.dirty_background_ratio
Целевое значение: 3-5
Обоснование: Порог фоновой записи. Слишком высокое значение откладывает запись, затем вызывает "взрывную" нагрузку. Для OLAP-нагрузки с большими чтениями нужен более агрессивный фоновый сброс.

I/O Scheduler для дисков данных

Команда проверки: cat /sys/block/vd[d,x]/queue/scheduler
Целевое значение: none (noop) для KVM/VirtIO
Обоснование: В виртуальной среде (KVM) планировщик none (noop) минимизирует накладные расходы, передавая запросы гипервизору. mq-deadline или kyber могут создавать излишнюю очередь.

vm.swappiness

Команда проверки: sysctl vm.swappiness
Целевое значение: 1-10
Обоснование: При почти полной загрузке RAM (free <5%) система может начать готовиться к свопингу. Резкое снижение заставляет ядро в первую очередь сбрасывать кэш файловой системы, а не искать кандидатов на своп.

vm.dirty_expire_centisecs

Команда проверки: sysctl vm.dirty_expire_centisecs
Целевое значение: 1000-1500 (10-15 секунд)
Обоснование: Время жизни "грязной" страницы. Уменьшение делает запись более частой, но менее объемной "пачками", что сглаживает нагрузку на диск и снижает пики wa.

ВЫСОКИЙ УРОВЕНЬ (Medium Priority)

Параметры, влияющие на общую производительность и стабильность под нагрузкой.

Ограничение открытых файлов (nofile) для пользователя postgres

Команда проверки: su - postgres -c 'ulimit -n'
Целевое значение: 65535
Обоснование: При max_connections=1000 и большом количестве таблиц/индексов PostgreSQL может быстро исчерпать лимит. Это вызовет ошибки "Too many open files".

vm.vfs_cache_pressure

Команда проверки: sysctl vm.vfs_cache_pressure
Целевое значение: 50-80
Обоснование: Управляет тенденцией ядра к высвобождению памяти, занятой кэшем inode и dentry. Уменьшение значения сохраняет кэш файловой системы дольше, что полезно для OLAP с частыми чтениями.

Параметры монтирования для /data, /wal, /log

Команда проверки: mount | grep -E "(data|wal|log)"
Целевое значение: noatime,nodiratime,barrier=0 (если диск с батарейным кэшем)
Обоснование: noatime исключает запись времени доступа, снижая нагрузку на запись. barrier=0 отключает барьеры для дисков с батарейным кэшем (только если уверены в надежности).

CPU Governor

Команда проверки: cpupower frequency-info | grep governor
Целевое значение: performance
Обоснование: Фиксирует CPU на максимальной частоте, исключая задержки на переключение частот. Критично для виртуальных машин, где гипервизор может "тормозить" CPU в powersave.

Кеш hugepages (опционально)

Команда проверки: grep HugePages /proc/meminfo
Целевое значение: Рассчитать исходя из shared_buffers (например, для shared_buffers=2GB выделить 1GB hugepages)
Обоснование: Уменьшает накладные расходы на управление памятью, но требует настройки PostgreSQL (параметр huge_pages).

СРЕДНИЙ УРОВЕНЬ (Low Priority)

Параметры "тонкой настройки" или для устранения потенциальных проблем.

net.core.somaxconn

Команда проверки: sysctl net.core.somaxconn
Целевое значение: 1024
Обоснование: Максимальный размер очереди принятых соединений. При пиковых подключениях к БД может предотвратить отказы.

net.ipv4.tcp_tw_reuse

Команда проверки: sysctl net.ipv4.tcp_tw_reuse
Целевое значение: 1
Обоснование: Позволяет переиспользовать сокеты в состоянии TIME_WAIT для исходящих соединений. Снижает нагрузку на сетевой стек при активной работе.

vm.min_free_kbytes

Команда проверки: sysctl vm.min_free_kbytes
Целевое значение: 262144 (256MB)
Обоснование: Минимальный объем свободной памяти для ядра. Увеличение может предотвратить deadlock при нехватке памяти, но слишком высокое значение уменьшает доступную память для процессов.

Ограничение процессов (nproc) для пользователя postgres

Команда проверки: su - postgres -c 'ulimit -u'
Целевое значение: 4096-8192
Обоснование: С учетом max_connections=1000 и фоновых процессов autovacuum (max_workers=4) может потребоваться увеличение.

ДИАГНОСТИЧЕСКИЕ ПАРАМЕТРЫ (Для сбора информации перед оптимизацией)

Текущая нагрузка I/O

Команда проверки: iostat -dx 2 5 или iotop -o
Что оценивать: Утилизация дисков (%util), очередь (avgqu-sz), время отклика (await). Сравнить /data vs /wal.

Статистика dirty pages

Команда проверки: cat /proc/vmstat | grep -E "(dirty|writeback)"
Что оценивать: nr_dirty, nr_writeback. Если nr_dirty постоянно близко к лимиту — нужна оптимизация vm.dirty_*.

Pressure Stall Information (PSI)

Команда проверки: cat /proc/pressure/io или cat /proc/pressure/memory
Что оценивать: Показывает, как процессы страдают от нехватки I/O или памяти. Значения >10% указывают на серьезные проблемы.

Конфигурация дисковых очередей

Команда проверки: cat /sys/block/vdd/queue/nr_requests и cat /sys/block/vdd/queue/read_ahead_kb
Что оценивать: Глубина очереди (128-256 нормально) и readahead (для OLAP можно увеличить до 4096-8192).

ПРИОРИТЕТЫ И ПОРЯДОК ПРОВЕРКИ:

  1. Сначала диагностика (пункты 15-18) — понять текущее состояние системы.

  2. Критические параметры (1-5) — начинать оптимизацию с них, особенно с vm.dirty_* и I/O Scheduler.

  3. Высокие параметры (6-10) — проверить и настроить после стабилизации I/O.

  4. Средние параметры (11-14) — тонкая настройка после решения основных проблем.

ВАЖНЫЕ ПРЕДУПРЕЖДЕНИЯ:

  • Изменяйте параметры по одному и тестируйте после каждого изменения (нагрузочный тест аналогичный "Эксперименту-8").

  • Сохраняйте бэкапы конфигураций (sysctl -a > /root/sysctl_backup.conf, /etc/security/limits.conf.bak).

  • Для виртуальной среды (KVM) некоторые параметры могут контролироваться гипервизором (например, I/O Scheduler на хосте). Согласуйте изменения с администраторами виртуальной инфраструктуры.

  • Параметры файловой системы (barrier=0) применяйте только если диск имеет батарейный кэш (BBU) или вы готовы к риску потери данных при сбое питания.

Итог

Чек-лист охватывает ключевые аспекты настройки Linux для оптимальной работы СУБД, выделяя четыре уровня вмешательства: диагностика, критическая, высокая и средняя настройка.

Основное внимание уделяется управлению вводом-выводом (I/O) и памятью — параметрам vm.dirty_*, выбору планировщика дисков и настройке свопа. Регулировка этих параметров позволяет избежать лавинообразных блокировок и сгладить пиковую нагрузку на дисковую подсистему.

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

Все изменения требуют поэтапного внедрения, тестирования и учета особенностей среды (виртуализация, оборудование).

Показать полностью
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 может быть снижена для экономии ресурсов.

Показать полностью
3

PG_EXPECTO: Оптимизация вместо апгрейда - практический кейс увеличения производительности СУБД PostgreSQL на 65% через настройку ОС

Серия СУБД PostgreSQL

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

От latency — к velocity: как тонкая настройка IO разогнала PostgreSQL на 65%.

От latency — к velocity: как тонкая настройка IO разогнала PostgreSQL на 65%.

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

Данная статья — это практический разбор реального кейса, где скрупулёзная настройка параметров подсистемы ввода-вывода, кэширования и планировщика задач Linux позволила поднять производительность PostgreSQL на впечатляющие 65%. Без замены железа, без увеличения лицензий, только за счёт грамотной оптимизации «фундамента», на котором работает СУБД. Мы пройдём по всем ключевым экспериментам, от базовых значений до финального результата, и покажем, какие именно настройки стали решающими в этой «бесплатной» победе над latency.

Тестовая среда, инструменты и конфигурация СУБД:

  • СУБД: PostgreSQL 17

  • Инструмент нагрузочного тестирования: pg_expecto

  • Тестовая база данных: pgbench (10GB, простая структура)

  • Условия тестирования: параллельная нагрузка от 5 до 22 сессий по каждому тестовому сценарию.

Базовые значения параметров IO

Общие параметры производительности:

  • vm.dirty_ratio = 30

  • vm.dirty_background_ratio = 10

Параметры IO-планировщика:

  • [none] mq-deadline kyber bfq

Настройки кэширования и буферизации:

  • vm.vfs_cache_pressure = 100

Параметры файловой системы:

  • /dev/mapper/vg_data-LG_data on /data type ext4 (rw,relatime)

Размер буферов для операций с блочными устройствами

  • read_ahead_kb=4096

Эксперимент-2: Общие параметры производительности

vm.dirty_ratio=10

vm.dirty_background_ratio=5

Эксперимент-3: Параметры IO-планировщика

[mq-deadline] kyber bfq none

Эксперимент-5: Настройки кэширования и буферизации

vm.vfs_cache_pressure=50

Эксперимент-7: Оптимизация параметров файловой системы

/dev/mapper/vg_data-LG_data on /data type ext4 (rw,noatime,nodiratime)

Эксперимент-8: Изменение размера буферов для операций с блочными устройствами

echo 256 > /sys/block/vdd/queue/read_ahead_kb

Итоговый результат влияния изменения параметров подсистемы IO на производительность СУБД

Сравнительный график изменения операционной скорости в ходе нагрузочного тестирования для Эксперимента-8(SPEED-8) и базовыми значениями параметров IO для Эксперимента-1(SPEED-1)

Сравнительный график изменения операционной скорости в ходе нагрузочного тестирования для Эксперимента-8(SPEED-8) и базовыми значениями параметров IO для Эксперимента-1(SPEED-1)

Среднее увеличение операционной скорости в результате применения изменений подсистемы IO по сравнению с базовыми значениями составило 65.09%.

Показатели производительности , ожиданий СУБД и метрик производительности IO в ходе экспериментов

Операционная скорость

График изменения операционной скорости в ходе экспериментов

График изменения операционной скорости в ходе экспериментов

Ожидания СУБД

График изменения ожидания СУБД в ходе экспериментов

График изменения ожидания СУБД в ходе экспериментов

IOPS

График изменения IOPS в ходе экспериментов

График изменения IOPS в ходе экспериментов

Пропускная способность (MB/s)

График изменения MB/s в ходе экспериментов

График изменения MB/s в ходе экспериментов

Длина очереди (aqu_sz)

График изменения aqu_sz в ходе экспериментов

График изменения aqu_sz в ходе экспериментов

Ожидание по чтению

График изменения r-await(ms) в ходе экспериментов

График изменения r-await(ms) в ходе экспериментов

Ожидание по записи

График изменения w-await(ms) в ходе экспериментов

График изменения w-await(ms) в ходе экспериментов

Итоговый вывод:

Систематическая оптимизация параметров подсистемы IO — таких как настройки кэширования, планировщика операций ввода-вывода и параметров файловой системы — позволила достичь значительного повышения производительности PostgreSQL.

Суммарный эффект от внесённых изменений выразился в среднем увеличении операционной скорости на 65,09% по сравнению с базовой конфигурацией. Наиболее существенный вклад внесли корректировки размера буферов предварительного чтения (read_ahead_kb) и отключение избыточного обновления временных меток файлов (noatime, nodiratime).

Результаты подтверждают - целенаправленная настройка окружения ОС является критически важным этапом развёртывания высоконагруженных СУБД.

Показать полностью 9
4

PG_EXPECTO: Оптимизация подсистемы IO- Эксперимент-8( Изменение размера буферов для операций с блочными устройствами)

Серия СУБД PostgreSQL

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

Обратный эффект: как уменьшение read_ahead_kb ускорило PostgreSQL на 7%

Обратный эффект: как уменьшение read_ahead_kb ускорило PostgreSQL на 7%

В мире оптимизации СУБД иногда меньше означает больше. Вопреки стандартным рекомендациям об увеличении буферов, эксперимент показал, что осознанное уменьшение размера read_ahead_kb с 4 МБ до 256 КБ привело к росту общей производительности PostgreSQL на 7%. Это напоминание о том, что каждая система уникальна, а оптимизация требует тонкой настройки под реальную нагрузку.

Эксперимент-8( Изменение размера буферов для операций с блочными устройствами)

Read_ahead_kb — параметр, который определяет максимальное количество килобайт, которые операционная система может прочитать заранее во время последовательной операции чтения.

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

По умолчанию значение параметра — 128 КБ для каждого сопоставляемого устройства. Однако увеличение значения read_ahead_kb до 4–8 МБ может улучшить производительность в средах приложений, где происходит последовательное чтение больших файлов

Текущее значение:

cat /sys/block/vdd/queue/read_ahead_kb

# cat /sys/block/vdd/queue/read_ahead_kb

4096

Изменение:

echo 256 > /sys/block/vdd/queue/read_ahead_kb

Основание:

  • Увеличение предварительного чтения может улучшить производительность последовательных операций чтения.

Ожидаемый эффект:

  • Улучшение rMB/s для последовательных рабочих нагрузок.

Итоговый отчет по анализу производительности подсистемы IO

1. Общая характеристика системы

  • Период анализа: 2026-01-07 10:50 - 2026-01-07 12:39 (109 минут)

  • Основные устройства хранения:

  • vdd (vg_data-LG_data): 100ГБ, смонтирован в /data - основной диск данных

  • vdc (vg_wal-LG_wal): 50ГБ, смонтирован в /wal - диск для WAL

  • vdb (vg_log-LG_log): 30ГБ, смонтирован в /log

  • vda: системный диск с разделами ОС

  • Тип нагрузки: Смешанная нагрузка с признаками как OLTP, так и OLAP

  • Для vdd: OLAP-сценарий (соотношение чтение/запись = 3.33:1)

  • Для vdc: OLTP-паттерн (высокая корреляция speed-IOPS)

2. Критические проблемы производительности

Для устройства vdd (/data):

  • ALARM: Загрузка устройства 100% во всех 110 наблюдениях

  • ALARM: Высокое время отклика на запись - 94.55% наблюдений превышают 5мс

  • ALARM: Постоянно высокая длина очереди - 100% наблюдений с aqu_sz > 1 (до 35)

  • ALARM: Высокий процент ожидания CPU IO (wa) - 100% наблюдений с wa > 10%

  • ALARM: Процессы в uninterruptible sleep возрастают при высоком wa

Для устройства vdc (/wal):

  • ALARM: Загрузка устройства >50% - 100% наблюдений (50-66%)

  • WARNING: Высокая корреляция wa-util (0.5115) - процессы ждут диск

  • ALARM: Очень высокая корреляция cache-w/s (0.7635) - неэффективное использование памяти

3. Анализ корреляций и паттернов нагрузки

Устройство vdd:

  • Отрицательная корреляция memory cache - r/s (-0.8040) и cache - rMB/s (-0.8465)

  • Память неэффективно используется для снижения нагрузки на диск

  • Отрицательная корреляция speed-IOPS (-0.2205) и speed-MB/s (-0.8862)

  • Производительность не ограничена IOPS или пропускной способностью

  • Узкое место в CPU, блокировках или параметрах параллелизма

Устройство vdc:

  • Высокая положительная корреляция speed-IOPS (0.7764)

  • Классический OLTP-паттерн, производительность зависит от способности диска обрабатывать мелкие операции

  • Отрицательная корреляция speed-MB/s (-0.6110)

  • Проблема не в пропускной способности диска

4. Диагностика узких мест IO

Показатели для vdd:

  • r_await(ms): 2-5 мс (в пределах нормы)

  • w_await(ms): 4-16 мс (критически высоко, 94.55% > 5мс)

  • aqu_sz: 10-35 (критически высоко, всегда > 1)

  • proc_b: 5-13 процессов в uninterruptible sleep

  • cpu_wa(%): 39-45% (критически высоко)

  • Корреляция speed-IOPS: -0.2205 (отрицательная)

  • Корреляция speed-MB/s: -0.8862 (сильно отрицательная)

Показатели для vdc:

  • r_await(ms): 0 мс (нет операций чтения)

  • w_await(ms): 0.56-0.62 мс (в норме)

  • aqu_sz: 0.6-0.71 (в норме)

  • proc_b: 5-13 процессов в uninterruptible sleep

  • cpu_wa(%): 39-45% (критически высоко)

  • Корреляция speed-IOPS: 0.7764 (сильно положительная)

  • Корреляция speed-MB/s: -0.6110 (отрицательная)

Вывод по диагностике узких мест IO:

  1. vdd является основным узким местом - 100% загрузка, длинные очереди, высокое время отклика записи

  2. Высокий cpu_wa на обоих устройствах указывает на системную проблему с IO

  3. Разные паттерны нагрузки на vdd (OLAP) и vdc (OLTP) требуют разных подходов к оптимизации

  4. Память используется неэффективно для кэширования, особенно на vdd

Итоговый вывод по производительности IO

Текущее состояние: Критическое. Система испытывает серьезные проблемы с производительностью IO, особенно на основном диске данных (vdd).

Основные проблемы:

  1. Диск vdd постоянно загружен на 100% с длинными очередями запросов

  2. Высокое время отклика на операции записи (до 16мс)

  3. Неэффективное использование оперативной памяти для кэширования

  4. Значительные простои CPU из-за ожидания IO (wa 39-45%)

Прогноз: Без вмешательства производительность будет деградировать при росте нагрузки, возможны отказы служб из-за таймаутов IO.

Приоритет действий: Высокий. Рекомендуется начать с немедленных оптимизаций настроек СУБД и мониторинга, затем перейти к апгрейду инфраструктуры.

Эксперимент-7(Оптимизация параметров файловой системы) vs Эксперимент-8( Изменение размера буферов для операций с блочными устройствами).

Операционная скорость

Сравнительный график изменения операционной скорости в ходе нагрузочного тестирования для Эксперимента-7(SPEED-7) и Эксперимента-8(SPEED-8)

Сравнительный график изменения операционной скорости в ходе нагрузочного тестирования для Эксперимента-7(SPEED-7) и Эксперимента-8(SPEED-8)

Среднее увеличение операционной скорости в ходе Эсперимента-8 по сравнению с Экпериментом-7 составило 7.79%.⬆️

Ожидания СУБД

Сравнительный график изменения ожидания СУБД в ходе нагрузочного тестирования для Эксперимента-7(WAITINGS-7) и Эксперимента-8(WAITINGS-8)

Сравнительный график изменения ожидания СУБД в ходе нагрузочного тестирования для Эксперимента-7(WAITINGS-7) и Эксперимента-8(WAITINGS-8)

IOPS

Сравнительный график изменения количества IOPS в ходе нагрузочного тестирования для Эксперимента-7(IOPS-7) и Эксперимента-8(IOPS-8)

Сравнительный график изменения количества IOPS в ходе нагрузочного тестирования для Эксперимента-7(IOPS-7) и Эксперимента-8(IOPS-8)

Пропускная способность (MB/s)

Сравнительный график изменения MB/s в ходе нагрузочного тестирования для Эксперимента-7(MB/s-7) и Эксперимента-8(MB/s-8)

Сравнительный график изменения MB/s в ходе нагрузочного тестирования для Эксперимента-7(MB/s-7) и Эксперимента-8(MB/s-8)

Длина очереди (aqu_sz)

Сравнительный график изменения длины очереди в ходе нагрузочного тестирования для Эксперимента-7(aqu_sz-7) и Эксперимента-8(aqu_sz-8)

Сравнительный график изменения длины очереди в ходе нагрузочного тестирования для Эксперимента-7(aqu_sz-7) и Эксперимента-8(aqu_sz-8)

Ожидание по чтению

Сравнительный график изменения r_await(ms) в ходе нагрузочного тестирования для Эксперимента-7(r_await(ms)-7) и Эксперимента-8(r_await(ms)-8)

Сравнительный график изменения r_await(ms) в ходе нагрузочного тестирования для Эксперимента-7(r_await(ms)-7) и Эксперимента-8(r_await(ms)-8)

Ожидание по записи

Сравнительный график изменения w_await(ms) в ходе нагрузочного тестирования для Эксперимента-7(w_await(ms)-7) и Эксперимента-8(w_await(ms)-8)

Сравнительный график изменения w_await(ms) в ходе нагрузочного тестирования для Эксперимента-7(w_await(ms)-7) и Эксперимента-8(w_await(ms)-8)

1. Сравнение критических проблем производительности

Вывод: Оба эксперимента показывают, что узкое место не в подсистеме IO, а в других компонентах системы (CPU, блокировки, СУБД).

2. Сравнительный анализ корреляций и паттернов нагрузки

3. Диагностика метрик IO

3.1 r_await (ms)

  • Эксп. 7: 2–5 мс, стабильно низкий.

  • Эксп. 8: 2–5 мс, стабильно низкий.

  • Вывод: Задержки чтения в норме, проблем нет.

3.2 w_await (ms)

  • Эксп. 7: 4–16 мс, есть рост в конце.

  • Эксп. 8: 4–16 мс, стабилен.

  • Вывод: Задержки записи также в допустимых пределах.

3.3 aqu_sz (средняя длина очереди)

  • Эксп. 7: 10–31, растёт к концу.

  • Эксп. 8: 10–35, также рост к концу.

  • Вывод: Очереди увеличиваются, что может указывать на рост нагрузки или блокировок.

3.4 proc_b (количество процессов в ожидании IO)

  • Эксп. 7: 4–13, умеренный рост.

  • Эксп. 8: 5–13, стабильно.

  • Вывод: Количество процессов в ожидании IO не критично.

3.5 cpu_wa (%) (время ожидания CPU)

  • Эксп. 7: 39–47%, высокий уровень.

  • Эксп. 8: 39–45%, также высокий.

  • Вывод: Высокий cpu_wa указывает на то, что CPU часто простаивает в ожидании IO или других ресурсов.

3.6 Корреляция speed с IOPS

  • Отрицательная в обоих случаях, но в эксп. 7 — сильнее.

  • Это подтверждает, что производительность не зависит от IOPS.

3.7 Корреляция speed с пропускной способностью

  • Отрицательная, особенно сильная в эксп. 8.

  • Пропускная способность диска не является ограничением.

3.8 Другие показатели производительности IO

  • Utilization: 100% в обоих экспериментах, но это не означает перегрузку IO, так как задержки низкие.

  • Shared блоки: активный рост в обоих случаях, что характерно для OLTP-нагрузки.

  • Время чтения/записи shared блоков: растёт, особенно в эксп. 8.

3.9 Вывод по диагностике узких мест IO

  • IO не является узким местом ни в одном из экспериментов.

  • Проблемы связаны с CPU, блокировками, ожиданиями СУБД.

  • Рост очередей (aqu_sz) и времени ожидания CPU указывают на проблемы с параллелизмом или блокировками в СУБД.

4. Итоговый вывод по сравнению производительности IO в ходе экспериментов

  1. Оба эксперимента подтверждают отсутствие IO-ограничений.

  2. Задержки чтения/записи низкие, пропускная способность не влияет на производительность.

  3. Эксперимент 8 показывает лучшую оптимизацию параметров IO, что выражается в более стабильных метриках r_await и w_await, а также в снижении влияния IOPS на скорость.

  4. Основные проблемы остаются неизменными:

  5. Высокий cpu_wa указывает на неэффективное использование CPU.

  6. Рост aqu_sz и proc_b говорит о возможных блокировках или недостатке параллелизма.

  7. Рекомендуется фокус на оптимизацию СУБД, настройку параллелизма и устранение блокировок.

  8. Рекомендации:

  9. Провести анализ ожиданий в СУБД (locks, latches, waits).

  10. Настроить параметры параллелизма (если используется PostgreSQL — max_connections, work_mem, shared_buffers и т.д.).

  11. Рассмотреть возможность увеличения CPU или оптимизации запросов.

Заключение: Эксперимент 8 демонстрирует улучшение в части управления IO, но системные проблемы (CPU, блокировки) остаются. Для дальнейшего повышения производительности необходимо сосредоточиться на оптимизации работы СУБД и устранении узких мест, не связанных с IO.

Показать полностью 9
2

Анализ возможности изменения размера буферов для операций с блочными устройствами

Серия СУБД PostgreSQL

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

Меньше — иногда значит быстрее: как оптимизация буфера чтения разгружает диск и ускоряет систему

Меньше — иногда значит быстрее: как оптимизация буфера чтения разгружает диск и ускоряет систему

В современных вычислительных системах операции ввода-вывода (I/O) часто становятся узким местом, ограничивающим общую производительность. Одним из ключевых параметров, влияющих на эффективность работы с дисковыми накопителями, является размер буфера предварительного чтения (read-ahead). Этот параметр определяет, сколько данных система заранее считывает с диска в память в ожидании последующих запросов. Хотя увеличение этого буфера может ускорить последовательные операции чтения, его неоптимальное значение способно привести к обратному эффекту — избыточной нагрузке на подсистему хранения, бесполезному расходованию пропускной способности и кэш-памяти.

В данной статье на реальном примере разбирается кейс анализа производительности блочного устройства vdd в Linux-системе, где наблюдалась 100% утилизация диска и высокие задержки. Мы детально исследуем метрики ввода-вывода, корреляции между ними и оценим целесообразность изменения параметра read_ahead_kb с текущего значения 4096 КБ. Материал будет полезен системным администраторам, DevOps-инженерам и всем, кто стремится глубже понять тонкости настройки ОС для максимизации отдачи от дисковой подсистемы.

Текущее значение

# cat /sys/block/vdd/queue/read_ahead_kb

4096

На основе анализа производительности IO для устройства vdd можно сделать следующие выводы и рекомендации:

Текущая ситуация с устройством vdd:

  1. Утилизация диска (%util): постоянно 100% в течение всего периода наблюдения.

  2. Задержки записи (w_await): в 94,55% наблюдений превышают 5 мс (ALARM).

  3. Глубина очереди (aqu_sz): постоянно >1 (ALARM).

  4. Соотношение чтения/записи: 3,36:1 (OLAP-сценарий, много операций чтения).

  5. Средний размер запроса:
    Чтение (rareq_sz): ~9–10 КБ
    Запись (wareq_sz): ~10–11 КБ

  6. Корреляция speed – IOPS: отрицательная (–0,7013), что указывает на не-IO-ограниченную систему (проблемы могут быть в CPU, блокировках, памяти).

  7. Корреляция cache – r/s: отрицательная (–0,6421), что говорит об эффективности кэширования.

  8. Параметр read_ahead_kb: текущее значение = 4096 (4 МБ).

Анализ целесообразности изменения read_ahead_kb:

✅ Аргументы за уменьшение значения:

  1. Средний размер запроса на чтение всего ~10 КБ, а предзагрузка установлена на 4 МБ — это избыточно и может приводить к:
    Чтению лишних данных, которые не используются.
    Нагрузке на IO-подсистему без реальной пользы.
    Заполнению кэша ненужными данными, вытесняя полезные.

  2. Высокая утилизация диска (100%) и большая глубина очереди указывают на то, что диск перегружен. Уменьшение read_ahead_kb может снизить избыточную нагрузку.

  3. OLAP-сценарий (много чтения) — в таких случаях слишком большой read-ahead может мешать, если запросы случайные или не последовательные.

⚠️ Аргументы против уменьшения:

  1. Если нагрузка в основном последовательное чтение больших файлов (например, обработка логов, дампов), то большой read-ahead может быть полезен.

  2. Резкое уменьшение может увеличить количество IOPS, что при уже высокой утилизации может ухудшить ситуацию.

Рекомендация:

Изменить read_ahead_kb с 4096 на 128–256 КБ (например, 256 КБ), так как:

  • Средний размер запроса ~10 КБ.

  • Это уменьшит избыточное чтение, но сохранит преимущества предзагрузки для последовательных операций.

  • Наблюдать за изменениями в r/s, r_await, %util, aqu_sz.

Команда для изменения:

echo 256 > /sys/block/vdd/queue/read_ahead_kb

Мониторинг после изменения:

  1. Сравнить r/s, rMB/s, r_await, %util до и после.

  2. Проверить, не увеличилась ли глубина очереди (aqu_sz).

  3. Оценить влияние на общую производительность (например, через vmstat, iostat).

Дополнительные рекомендации:

  1. Исследовать другие узкие места: так как система не ограничена IO, стоит проверить:
    CPU (wa > 10% — ALARM).
    Память (использование кэша и буферов).
    Процессы в D состоянии (ожидание IO).

  2. Оптимизировать запросы к СУБД:
    Увеличить shared_buffers (если PostgreSQL).
    Проверить наличие полных сканирований больших таблиц.

  3. Рассмотреть возможность увеличения IOPS/пропускной способности диска (если это облачный диск — изменить тип на более производительный).

Заключение:

Изменение read_ahead_kb с 4096 на 256 КБ целесообразно, но должно проводиться осторожно, с мониторингом. Это может снизить избыточную нагрузку на диск, но не решит основную проблему — 100% утилизацию диска, которая требует более комплексного подхода (апгрейд диска, оптимизация запросов, увеличение кэша).

Показать полностью 1
6

Тонкая настройка памяти в Linux для PostgreSQL: оптимизация кэширования и буферизации

Серия СУБД PostgreSQL

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

От хаоса в памяти — к идеальному балансу: настраиваем Linux для рекордной скорости PostgreSQL

От хаоса в памяти — к идеальному балансу: настраиваем Linux для рекордной скорости PostgreSQL

Производительность PostgreSQL в высокой степени зависит от корректной работы с памятью. Ядро Linux, управляя дисковым кэшем и буферами, может как значительно ускорить работу СУБД, так и стать причиной серьёзных проблем — от излишнего свопинга до деградации производительности из-за двойного кэширования. В статье предоставлены практические инструкции по настройке ключевых параметров ядра (vm.swappiness, vm.dirty_*, vm.vfs_cache_pressure) для оптимальной работы PostgreSQL.

Исходные данные

Характер нагрузки на СУБД: преобладание чтения над записью

RAM = 8GB

shared_buffers = 2GB

🔍 Часть 1: Диагностика текущего состояния

1.1. Проверка параметров кэширования ОС Linux

1. Текущие значения параметров виртуальной памяти:

# Основные параметры dirty-страниц и буферизации

echo "=== Текущие настройки кэширования ОС ==="

sudo sysctl -a | grep -E "(dirty|swappiness|vfs_cache_pressure)" | grep -v net.ipv4

# Альтернативно - чтение напрямую из /proc/sys/vm

cat /proc/sys/vm/swappiness

cat /proc/sys/vm/dirty_background_ratio

cat /proc/sys/vm/dirty_ratio

cat /proc/sys/vm/dirty_expire_centisecs

cat /proc/sys/vm/dirty_writeback_centisecs

cat /proc/sys/vm/vfs_cache_pressure

2. Проверка состояния Transparent Huge Pages:

cat /sys/kernel/mm/transparent_hugepage/enabled

# Результат: [never] значит отключено, [always] - включено

3. Мониторинг текущего использования кэша и буферов:

# Общая статистика памяти

free -h

# Подробная информация о dirty-страницах

grep -E "(Dirty|Writeback|NFS_Unstable)" /proc/meminfo

# Динамический мониторинг (обновление каждые 2 секунды)

watch -n 2 'grep -E "(Dirty|Writeback)" /proc/meminfo && echo "---" && free -h | grep -v total'

4. Проверка активности диска (критично для анализа влияния записи):

# Установите sysstat если нет: sudo yum install sysstat / sudo apt-get install sysstat

iostat -x 2 5

# Обратите внимание на:

# - %util (загрузка диска)

# - await (среднее время ожидания)

# - avgqu-sz (средняя длина очереди)

1.2. Диагностика кэширования PostgreSQL

1. Подключение к базе данных и проверка hit ratio:

psql -U postgres -d БД

-- Общий hit ratio для всех таблиц

SELECT

sum(heap_blks_read) as heap_read,

sum(heap_blks_hit) as heap_hit,

CASE

WHEN sum(heap_blks_hit) > 0 THEN

ROUND((sum(heap_blks_hit)::numeric / (sum(heap_blks_hit) + sum(heap_blks_read))) * 100, 2)

ELSE 0

END as heap_hit_ratio,

sum(idx_blks_read) as idx_read,

sum(idx_blks_hit) as idx_hit,

CASE

WHEN sum(idx_blks_hit) > 0 THEN

ROUND((sum(idx_blks_hit)::numeric / (sum(idx_blks_hit) + sum(idx_blks_read))) * 100, 2)

ELSE 0

END as idx_hit_ratio

FROM pg_statio_user_tables;

-- Hit ratio по базам

SELECT

datname,

blks_read,

blks_hit,

ROUND((blks_hit::numeric / (blks_hit + blks_read)) * 100, 2) as hit_ratio

FROM pg_stat_database

WHERE datname NOT LIKE 'template%';

2. Анализ использования shared_buffers:

-- Установиnm расширение если еще не установлено

CREATE EXTENSION IF NOT EXISTS pg_buffercache;

-- Топ-10 таблиц в кэше

SELECT

c.relname as table_name,

COUNT(*) * 8 / 1024 as cached_mb,

pg_size_pretty(pg_relation_size(c.oid)) as table_size,

ROUND(COUNT(*) * 100.0 / (SELECT setting::numeric FROM pg_settings WHERE name='shared_buffers'), 2) as percent_of_cache

FROM pg_buffercache b

JOIN pg_class c ON b.relfilenode = pg_relation_filenode(c.oid)

WHERE c.relkind = 'r' -- только обычные таблицы

GROUP BY c.relname, c.oid

ORDER BY cached_mb DESC

LIMIT 10;

-- Распределение shared_buffers по типам данных

SELECT

CASE

WHEN usagecount IS NULL THEN 'Free'

ELSE usagecount::text

END as usage_count,

COUNT(*) * 8 / 1024 as mb,

ROUND(COUNT(*) * 100.0 / (SELECT setting::numeric FROM pg_settings WHERE name='shared_buffers'), 2) as percent

FROM pg_buffercache

GROUP BY usagecount

ORDER BY usagecount DESC NULLS FIRST;

3. Проверка временных файлов (переполнение work_mem):

SELECT

datname,

temp_files,

pg_size_pretty(temp_bytes) as temp_size,

ROUND(temp_bytes / 1024.0 / 1024.0 / NULLIF(temp_files, 0), 2) as avg_file_size_mb

FROM pg_stat_database

WHERE temp_files > 0;

-- Активные запросы, использующие временные файлы

SELECT

pid,

query,

temp_files,

temp_bytes

FROM pg_stat_activity

WHERE temp_files > 0 AND state = 'active';

4. Проверка текущих настроек PostgreSQL:

-- Критические настройки памяти

SELECT

name,

setting,

unit,

context

FROM pg_settings

WHERE name IN (

'shared_buffers',

'work_mem',

'maintenance_work_mem',

'effective_cache_size',

'wal_buffers',

'random_page_cost',

'effective_io_concurrency'

)

ORDER BY name;

⚙️ Часть 2: Оптимизация настроек

2.1. Оптимизация ОС Linux (требует прав root)

1. Создание оптимизированного профиля tuned:

# Создание директории для профиля

sudo mkdir -p /etc/tuned/postgresql-optimized

# Создание конфигурационного файла

sudo cat > /etc/tuned/postgresql-optimized/tuned.conf << 'EOF'

[main]

summary=Optimized for PostgreSQL with 8GB RAM, read-heavy workload

include=throughput-performance

[sysctl]

# Минимизация записи на диск (оптимизация для чтения)

vm.dirty_background_ratio = 2

vm.dirty_ratio = 5

vm.dirty_expire_centisecs = 6000

vm.dirty_writeback_centisecs = 1000

# Минимизация свопинга

vm.swappiness = 5

# Сохранение кэша dentry и inode (улучшение для частого чтения файлов)

vm.vfs_cache_pressure = 50

# Увеличение лимитов для большего количества соединений

fs.file-max = 2097152

EOF

# Активация профиля

sudo tuned-adm profile postgresql-optimized

sudo tuned-adm active # Проверка активации

2. Отключение Transparent Huge Pages:

# Немедленное отключение

echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled

echo never | sudo tee /sys/kernel/mm/transparent_hugepage/defrag

# Постоянное отключение (для систем с systemd)

sudo cat > /etc/systemd/system/disable-thp.service << 'EOF'

[Unit]

Description=Disable Transparent Huge Pages

[Service]

Type=oneshot

ExecStart=/bin/sh -c "echo never > /sys/kernel/mm/transparent_hugepage/enabled && echo never > /sys/kernel/mm/transparent_hugepage/defrag"

[Install]

WantedBy=multi-user.target

EOF

sudo systemctl daemon-reload

sudo systemctl enable disable-thp.service

sudo systemctl start disable-thp.service

3. Настройка лимитов памяти для пользователя postgres:

# Добавьте в /etc/security/limits.conf или создайте файл в /etc/security/limits.d/

sudo cat >> /etc/security/limits.conf << 'EOF'

postgres soft memlock 8388608 # 8GB в kB

postgres hard memlock 8388608

postgres soft nofile 65536

postgres hard nofile 65536

EOF

# Для применения в текущей сессии

sudo prlimit --pid $(pgrep -u postgres) --memlock=8388608:8388608

Показать полностью
4

PG_EXPECTO: Оптимизация подсистемы IO. Эксперимент-7: Оптимизация параметров файловой системы

Серия СУБД PostgreSQL

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

Тонкая настройка — скрытый резерв. Отключая лишнее, высвобождаем ресурсы

Тонкая настройка — скрытый резерв. Отключая лишнее, высвобождаем ресурсы

Рекомендации по изменению параметров ОС

Эксперимент-5: Настройки кэширования и буферизации.

Эксперимент-7: Оптимизация параметров файловой системы.

Монтирование с опциями noatime,nodiratime

Noatime и nodiratime — параметры монтирования файловых систем в Linux, которые позволяют отключить обновление информации о времени доступа к файлам и каталогам.

Noatime полностью отключает запись времени доступа к файлу. Эта опция подходит, если приложения не зависят от atime. Noatime может быть полезен в разделах с интенсивным чтением, где не важна совместимость с ПО, полагающимся на atime. Например, в каталогах статического контента, кэшах, медиабиблиотеках, снапшотах сборок.

Nodiratime отключает обновление времени доступа только для каталогов. Для остальных файлов время atime будет обновляться всегда. Отдельный nodiratime актуален только при желании тонко выключить обновление atime для каталогов, оставив его для файлов (редкий случай).

Настройка файловой системы /data - изменение параметров mount

1. Проверка текущих опций монтирования

# Текущее состояние

mount | grep/data

2. Определение UUID устройства (рекомендуется использовать UUID вместо пути устройства)

# Получить UUID устройства

blkid /dev/mapper/vg_data-LG_data

3. Резервное копирование текущего fstab

cp /etc/fstab /etc/fstab.backup_$(date +%Y%m%d)

4. Редактирование /etc/fstab

vi /etc/fstab

добавить

# /data

/dev/mapper/vg_data-LG_data /data ext4 defaults,noatime,nodiratime 0 0

5. Перемонтирование файловой системы

mount -o remount /data

6. Проверка применённых опций

# Проверить текущие опции монтирования

mount | grep/data

Важные замечания:

1. noatime vs relatime:

o noatime — полностью отключает обновление atime

o relatime (по умолчанию) — обновляет atime, только если mtime/ctime новее

o nodiratime — отключает atime только для директорий

2. Эффект от изменений:

o Уменьшение нагрузки на диск (меньше операций записи)

o Повышение производительности для workloads с частым чтением

o Некоторые приложения (например, backup-утилиты, использующие atime) могут работать некорректно

Итоговый отчет по анализу производительности подсистемы IO

1. Общая характеристика системы

  • Период анализа: 06.01.2026 14:42 – 16:31 (около 2 часов)

  • Основные устройства хранения:
    vdd (100 ГБ, монтирован в /data):
    Используется под нагрузку чтения и записи
    Наблюдается 100% утилизация (%util = 100)
    Высокие показатели w_await (до 13 мс)
    vdc (50 ГБ, монтирован в /wal):
    Преимущественно запись
    Утилизация 53–63%
    Низкое время отклика на запись (~1 мс)
    Другие диски: vda (система), vdb (лог)

  • Тип нагрузки: OLAP-сценарий с преобладанием операций чтения над записью (соотношение ~3.36:1). Нагрузка не ограничена пропускной способностью дисков.

2. Критические проблемы производительности

  1. 100% утилизация диска vdd в течение всего периода наблюдения.

  2. Высокое время отклика на запись (w_await) на vdd:
    94.55% наблюдений превышают 5 мс
    Максимум до 13 мс

  3. Большая длина очереди (aqu_sz) на vdd:
    Всегда > 1, достигает 31
    Указывает на перегруженность диска

  4. Высокий cpu_wa (I/O wait):
    100% наблюдений > 10%
    Процессы в состоянии uninterruptible sleep превышают количество ядер CPU в 25–50% случаев

  5. Неэффективное использование кэша:
    Высокая корреляция между cache и w/s на vdc (0.587)
    Слабая корреляция буферной памяти с операциями чтения/записи

3. Анализ корреляций и паттернов нагрузки

  • Отрицательная корреляция wa и util на vdd (-0.3019) — свидетельствует о том, что высокий wa не всегда связан с загрузкой диска.

  • Высокая корреляция операционной скорости с чтением блоков (0.7134) — производительность напрямую зависит от операций чтения с диска.

  • Низкая/отрицательная корреляция скорости с IOPS и пропускной способностью — указывает, что узкое место не в подсистеме IO.

  • Преобладание операций чтения (соотношение read/write = 3.36) — характерно для аналитических нагрузок.

4. Диагностика узких мест IO

Вывод по диагностике:
Основная проблема — высокое время отклика на запись на диске vdd и перегруженность очереди запросов. При этом общая производительность системы не ограничена пропускной способностью или IOPS, что указывает на иные узкие места: вероятно, недостаток RAM, неэффективные запросы или блокировки на уровне СУБД.

5. Рекомендации по оптимизации

  1. Оптимизация диска vdd:
    Рассмотреть переход на более быстрые диски (SSD/NVMe)
    Разделить нагрузку: выделить отдельный диск для журналов транзакций

  2. Оптимизация памяти:
    Увеличить размер буферного кэша СУБД
    Настроить shared_buffers и effective_cache_size в PostgreSQL

  3. Оптимизация запросов:
    Провести анализ медленных запросов
    Добавить/оптимизировать индексы для уменьшения seq scan
    Использовать partitioning для больших таблиц

  4. Настройка мониторинга:
    Включить детальный мониторинг процессов в состоянии D (uninterruptible sleep)
    Настроить оповещения при %util > 90% и w_await > 5 мс

  5. Балансировка нагрузки:
    Рассмотреть использование реплик для чтения
    Возможно, увеличить количество ядер CPU для параллельной обработки запросов

6. Итоговый вывод по производительности IO

Подсистема IO находится в критическом состоянии по следующим причинам:

  • Диск vdd постоянно перегружен (100% утилизация)

  • Высокое время отклика на запись (до 13 мс)

  • Длинная очередь запросов (до 31)

  • Высокий I/O wait процессора (до 47%)

Однако основное узкое место — не в пропускной способности дисков, а в:

  1. Неэффективном использовании памяти (слабая кэшируемость данных)

  2. Большом количестве операций чтения с диска из-за неоптимальных запросов

  3. Высокой загрузке CPU в состоянии ожидания IO

Рекомендуется:
Сначала провести оптимизацию на уровне СУБД и приложения (индексы, запросы, кэширование), а затем рассмотреть апгрейд дисковой подсистемы для диска vdd.

Сравнительные результаты: Эксперимент-5: Настройки кэширования и буферизации и Эксперимент-7: Оптимизация параметров файловой системы.

Операционная скорость

Сравнительный график изменения операционной скорости в ходе нагрузочного тестирования для Эксперимента-5(SPEED-5) и Эксперимента-7(SPEED-7)

Сравнительный график изменения операционной скорости в ходе нагрузочного тестирования для Эксперимента-5(SPEED-5) и Эксперимента-7(SPEED-7)

Среднее увеличение операционной скорости в ходе Эсперимента-7 по сравнению с Экпериментом-5 составило 7.47%.

Ожидания СУБД

Сравнительный график изменения ожидания СУБД в ходе нагрузочного тестирования для Эксперимента-5(WAITINGS-5) и Эксперимента-7(WAITINGS-7)

Сравнительный график изменения ожидания СУБД в ходе нагрузочного тестирования для Эксперимента-5(WAITINGS-5) и Эксперимента-7(WAITINGS-7)

IOPS

Сравнительный график изменения количества IOPS в ходе нагрузочного тестирования для Эксперимента-5(IOPS-5) и Эксперимента-7(IOPS-7)

Сравнительный график изменения количества IOPS в ходе нагрузочного тестирования для Эксперимента-5(IOPS-5) и Эксперимента-7(IOPS-7)

Пропускная способность (MB/s)

Сравнительный график изменения MB/s в ходе нагрузочного тестирования для Эксперимента-5(MB/s-5) и Эксперимента-7(MB/s-7)

Сравнительный график изменения MB/s в ходе нагрузочного тестирования для Эксперимента-5(MB/s-5) и Эксперимента-7(MB/s-7)

Длина очереди (aqu_sz)

Сравнительный график изменения длины очереди в ходе нагрузочного тестирования для Эксперимента-5(aqu_sz-5) и Эксперимента-7(aqu_sz-7)

Сравнительный график изменения длины очереди в ходе нагрузочного тестирования для Эксперимента-5(aqu_sz-5) и Эксперимента-7(aqu_sz-7)

Ожидание по чтению

Сравнительный график изменения r_await(ms) в ходе нагрузочного тестирования для Эксперимента-5(r_await(ms)-5) и Эксперимента-7(r_await(ms)-7)

Сравнительный график изменения r_await(ms) в ходе нагрузочного тестирования для Эксперимента-5(r_await(ms)-5) и Эксперимента-7(r_await(ms)-7)

Ожидание по записи

Сравнительный график изменения w_await(ms) в ходе нагрузочного тестирования для Эксперимента-5(w_await(ms)-5) и Эксперимента-7(w_await(ms)-7)

Сравнительный график изменения w_await(ms) в ходе нагрузочного тестирования для Эксперимента-5(w_await(ms)-5) и Эксперимента-7(w_await(ms)-7)

Сравнительный анализ производительности подсистемы IO: Эксперимент-5(Настройки кэширования и буферизации) и Эксперимент-7(Оптимизация параметров файловой системы).

1. Сравнение критических проблем производительности

  • Общая проблема в обоих экспериментах: Производительность не ограничена подсистемой IO.

  • Основные узкие места: CPU, блокировки, параметры параллелизма, ожидания СУБД.

  • Статус аварийного оповещения: В обоих случаях зафиксирована отрицательная корреляция между операционной скоростью и IOPS/MB/s, что указывает на влияние не-IO факторов на производительность.

2. Сравнительный анализ корреляций и паттернов нагрузки

Вывод:

Оба эксперимента демонстрируют сходный паттерн нагрузки — низкая корреляция с метриками IO, что подтверждает, что производительность определяется не дисковыми операциями, а другими компонентами системы (CPU, блокировки, память).

3. Диагностика метрик IO

3.1. r_await (среднее время чтения, мс)

  • Эксперимент-5: стабильно ~2–4 мс.

  • Эксперимент-7: стабильно ~2–5 мс.

  • Изменение: Незначительный рост в эксперименте-7, но в пределах нормы.

3.2. w_await (среднее время записи, мс)

  • Эксперимент-5: 3–12 мс, плавный рост.

  • Эксперимент-7: 5–13 мс, более выраженный рост к концу теста.

  • Изменение: Увеличение задержек записи в эксперименте-7, что может указывать на влияние оптимизаций ФС на операции записи.

3.3. aqu_sz (средняя длина очереди)

  • Эксперимент-5: 8–29.

  • Эксперимент-7: 13–31.

  • Изменение: Увеличение длины очереди в эксперименте-7, что согласуется с ростом w_await.

3.4. proc_b (количество процессов в состоянии блокировки)

  • Эксперимент-5: 5–13.

  • Эксперимент-7: 4–13.

  • Изменение: Незначительные колебания, без явной тенденции.

3.5. cpu_wa (%) (время ожидания CPU)

  • Эксперимент-5: 42–47%.

  • Эксперимент-7: 39–47%.

  • Изменение: Снижение cpu_wa в эксперименте-7, что может указывать на улучшение использования CPU после оптимизации ФС.

3.6. Корреляция speed – IOPS

Отрицательная в обоих случаях, сильнее в эксперименте-7. Это подтверждает, что рост IOPS не ведёт к росту производительности, проблема в других подсистемах.

3.7. Корреляция speed – пропускная способность

Отрицательная, слабее, чем с IOPS. Пропускная способность диска не является ограничивающим фактором.

3.8. Другие показатели производительности IO

  • IOPS: в эксперименте-7 немного выше (до 4346 vs 4293 в эксперименте-5).

  • MB/s: стабильно ~39–43 MB/s в обоих экспериментах.

  • Utilization: 100% в обоих случаях, что говорит о полной загрузке устройства.

3.9. Вывод по диагностике узких мест IO

  • Эксперимент-5: Стабильные показатели IO, узкое место — CPU/блокировки.

  • Эксперимент-7: Ухудшение w_await и aqu_sz, но улучшение cpu_wa. Оптимизация ФС привела к увеличению задержек записи, но снизила нагрузку на CPU.

4. Итоговый вывод по сравнению производительности IO в ходе экспериментов

  1. Оба эксперимента подтверждают, что узкое место — не в подсистеме IO, а в CPU, блокировках или настройках СУБД.

  2. Эксперимент-7 (оптимизация ФС) показал:

  3. Увеличение задержек записи (w_await) и длины очереди (aqu_sz).

  4. Снижение времени ожидания CPU (cpu_wa).

  5. Более сильную отрицательную корреляцию speed-IOPS, что указывает на ещё меньшую зависимость производительности от IO.

  6. Эксперимент-5 (настройки кэширования) демонстрирует более стабильные задержки IO, но более высокую нагрузку на CPU.

  7. Рекомендация:

  8. Продолжить оптимизацию CPU, параллелизма и настройки СУБД.

  9. Для экспериментов с ФС рекомендуется дополнительная настройка параметров записи для снижения w_await.

  10. Мониторинг блокировок и contention в СУБД.

Заключение:

Оба эксперимента успешно идентифицировали, что производительность упирается не в IO, а в другие компоненты системы. Оптимизация файловой системы (Эксперимент-7) частично улучшила использование CPU, но ухудшила задержки записи. Это указывает на необходимость комплексной настройки системы, учитывающей как параметры ФС, так и настройки СУБД и CPU.

Показать полностью 9
Отличная работа, все прочитано!

Темы

Политика

Теги

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

Сообщества

18+

Теги

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

Сообщества

Игры

Теги

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

Сообщества

Юмор

Теги

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

Сообщества

Отношения

Теги

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

Сообщества

Здоровье

Теги

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

Сообщества

Путешествия

Теги

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

Сообщества

Спорт

Теги

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

Сообщества

Хобби

Теги

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

Сообщества

Сервис

Теги

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

Сообщества

Природа

Теги

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

Сообщества

Бизнес

Теги

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

Сообщества

Транспорт

Теги

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

Сообщества

Общение

Теги

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

Сообщества

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

Теги

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

Сообщества

Наука

Теги

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

Сообщества

IT

Теги

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

Сообщества

Животные

Теги

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

Сообщества

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

Теги

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

Сообщества

Экономика

Теги

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

Сообщества

Кулинария

Теги

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

Сообщества

История

Теги

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

Сообщества