kznalp

kznalp

Эксперименты по анализу и оптимизации производительности PostgreSQL. Вначале любая оригинальная теория признается абсурдной, потом — верной, потом — самоочевидной и незначительной, и, наконец, столь важной и самобытной, что бывшие критики присваивают ее себе. — Уильям Джеймс (1842–1910) Эксперименты по анализу и оптимизации производительности PostgreSQL. https://t.me/pg_hazel https://dzen.ru/kznalp
Пикабушник
в топе авторов на 420 месте
30К рейтинг 147 подписчиков 15 подписок 513 постов 35 в горячем
4

PG_EXPECTO: Принцип «только большие пушки» для СУБД

Серия СУБД PostgreSQL

В силу ограниченности платформы Пикабу - статья сокращена. Полностью - на основном канале Дзен.

Когда нужен не просто выстрел, а залп главным калибром.

Когда нужен не просто выстрел, а залп главным калибром.

PG_EXPECTO — это не просто инструмент, а целостный комплекс, построенный на двух новых принципах.

1. Комплексный статистический анализ (CSSA)

Система больше не разделяет метрики СУБД и инфраструктуры. Она создаёт единый корреляционный снимок всей системы:

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

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

2. Семантический анализ и нейросеть-ассистент

Это и есть та самая «турбина». Вместо сырых графиков PG_EXPECTO использует нейросеть, которая интерпретирует данные в контексте.

Практический пример

Инцидент производительности СУБД в панели Zabbix

Регрессионный и корреляционный анализ производительности и ожиданий СУБД

Операционная скорость и ожидания СУБД

График изменения операционной скорости СУБД перед инцидентом

График изменения операционной скорости СУБД перед инцидентом

Исходные данные для семантического анализа нейросетью

1. Производительность и ожидания СУБД

2. Метрика vmstat

3.Метрика iostat для дискового устройства, файловой системы /data

3.Метрика iostat для дискового устройства, файловой системы /wal

1.Анализ производительности и ожиданий СУБД

Проведи анализ производительности и ожиданий СУБД PostgreSQL за заданный период

На основе предоставленных данных можно провести следующий анализ производительности и ожиданий СУБД PostgreSQL за период с 08:40 до 09:40:

📈 1. Регрессионный анализ

· Операционная скорость (SPEED):

o Коэффициент детерминации R2=0.88R2=0.88 → модель хорошо описывает данные.

o Угол наклона = -43.1 → скорость со временем снижается.

· Ожидания СУБД (WAITINGS):

o R2=0.75R2=0.75 → модель умеренно точна.

o Угол наклона = +40.87 → количество ожиданий растёт.

🔗 2. Корреляционный анализ

· SPEED vs WAITINGS: −0.763→ сильная отрицательная корреляция. Чем больше ожиданий, тем ниже скорость.

· WAITINGS vs IPC: 0.9039 → очень сильная положительная корреляция. Рост межпроцессного взаимодействия связан с ростом ожиданий.

· WAITINGS vs LWLOCK: 0.9587 → почти прямая зависимость. Ожидания сильно связаны с лёгкими блокировками (lightweight locks).

📉 3. Динамика изменения показателей

· SPEED:

o Начало: ~130 572

o Конец: ~90 948

o Снижение на ~30% за час.

· WAITINGS:

o Начало: 345

o Конец: 435

o Рост на ~26%.

· IPC и LWLOCK также растут, особенно заметно после 09:30.

⚠️ 4. Потенциальные проблемы

1. Рост LWLOCK → возможна конкуренция за лёгкие блокировки (например, в памяти).

2. Рост IPC → увеличивается нагрузка на межпроцессное взаимодействие, возможно из-за параллельных запросов.

3. Падение SPEED при росте WAITINGS → система тратит больше времени на ожидания (возможно, из-за блокировок или нехватки ресурсов).

2.Анализ vmstat

Проведи анализ метрик vmstat за заданный период

На основе данных vmstat за период с 08:40 до 09:40 проведён анализ производительности системы, на которой работает PostgreSQL. Вот ключевые выводы:

📊 1. Общие тенденции

· Время простоя CPU (idle) снизилось с 90% до 85%.

· Пользовательская нагрузка CPU (us) выросла с 9% до 13%.

· Системная нагрузка CPU (sy) стабильна (2%).

· Ожиданий ввода-вывода (wa) не наблюдается (0%).

🧠 2. Анализ памяти

Показатель Начало Конец Изменение Комментарий

swpd 710МБ 749МБ +39 МБ Незначительный рост свопа, система не испытывает нехватки RAM.

free 7185МБ 3221МБ -3964 МБ Сильное снижение свободной памяти, что говорит о её активном использовании.

cache 53521МБ 55937МБ +2416МБ Кэш памяти увеличивается, что нормально при активной работе с диском.

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

💽 3. Ввод-вывод (I/O)

Показатель Начало Конец Пиковое значение Тренд

bi (блоков ввода/с) 572 2409 2409 Резкий рост после 09:25.

bo (блоков вывода/с) 850 511 850 Снижение, затем стабилизация.

Вывод:

· После 09:25 резко выросла активность чтения с диска (bi).

· Это совпадает с падением SPEED в данных PostgreSQL.

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

🔄 4. Системные показатели

Показатель Начало Конец Изменение

in (прерываний/с) 12833 14503 +13%

cs (переключений контекста/с) 6835 7033 +3%

Вывод: Умеренный рост прерываний и переключений контекста, что соответствует увеличению нагрузки.

📉 5. Связь с данными PostgreSQL

Сравнивая с предыдущим анализом cluster.txt, наблюдаем:

1. Рост ожиданий (WAITINGS) в PostgreSQL коррелирует с:

o Ростом bi (чтение с диска).

o Увеличением us (пользовательская нагрузка CPU).

2. Падение SPEED совпадает с:

o Увеличением bi (дисковые операции).

o Снижением idle CPU.

⚠️ 6. Потенциальные узкие места

1. Дисковый ввод-вывод: резкий рост bi после 09:25 может быть причиной замедления.

2. Использование памяти: свободная память уменьшается, но свопинг незначителен — пока критично.

3. Нагрузка на CPU: idle снижается, но не до критических значений.

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

1. Оптимизация запросов:

o Увеличить shared_buffers, чтобы больше данных кэшировалось в памяти.

o Проверить наличие медленных запросов, выполняющих полное сканирование таблиц.

2. Мониторинг диска:

o Проверить скорость дисковых операций (например, с помощью iostat).

o Рассмотреть использование SSD или увеличение скорости дискового массива.

3. Настройка PostgreSQL:

o Увеличить effective_cache_size.

o Настроить work_mem для уменьшения операций на диске.

4. Системные настройки:

o Убедиться, что достаточно оперативной памяти для кэширования.

o Рассмотреть увеличение количества CPU, если нагрузка продолжит расти.

📈 8. Визуализация (рекомендуется)

· График SPEED и bi на одной оси времени → проверить корреляцию.

· График WAITINGS и us (пользовательская нагрузка CPU).

· График free memory и cache → отследить использование памяти.

График SPEED и bi на одной оси времени → проверить корреляцию.

Для наглядности значения bi увеличены в 10 раз

Для наглядности значения bi увеличены в 10 раз

Отрицательная корреляция: Рост значений bi сопровождается снижением операционной скорости.

График WAITINGS и us (пользовательская нагрузка CPU).

Для наглядности значения us увеличены в 10 раз

Для наглядности значения us увеличены в 10 раз

Положительная корреляция: Рост значений us сопровождается увеличением количества ожиданий.

График free memory и cache → отследить использование памяти.

Отрицательная корреляция: Рост значений free сопровождается снижением значений cache.

free -3964 МБ: Сильное снижение свободной памяти, что говорит о её активном использовании.

cache +2416 МБ: Кэш памяти увеличивается, что нормально при активной работе с диском.

3. Анализ iostat для файловой системы /data

На основе данных iostat для устройства vdb за период с 08:40 до 09:40 проведён анализ дисковых операций. Вот ключевые выводы:

📊 1. Общая картина

· Устройство vdb используется для операций чтения и записи.

· %util (загрузка диска) выросла с 5.59% до 6.7% — загрузка низкая.

· aqu_sz (средняя длина очереди) незначительно снизилась с 0.26 до 0.20 — очереди практически нет.

📈 2. Операции чтения (Read)

Показатель Начало Конец Изменение Комментарий

r/s (чтений/с) 40.00 27.92 -30% Снижение количества операций чтения.

rMB/s (МБ/с) 0.84 2.82 +235% Резкий рост объёма читаемых данных.

rareq_sz (средний размер запроса) 19.35 КБ 67.09 КБ +247% Запросы стали крупнее.

r_await (среднее время чтения, мс) 2.07 3.73 +80% Увеличение времени отклика на чтение.

Вывод:

После 09:20 резко вырос объём читаемых данных (rMB/s) и средний размер запроса (rareq_sz). Это говорит о переходе на более крупные блоки данных, возможно из-за изменения типа запросов (например, сканирование больших таблиц).

📉 3. Операции записи (Write)

Показатель Начало Конец Изменение

w/s (записей/с) 16.83 15.20 -10%

wMB/s (МБ/с) 0.62 0.26 -58%

wareq_sz (средний размер записи) 31.74КБ 4.22КБ -87%

w_await (среднее время записи, мс) 5.57 3.59 -36%

Вывод:

Нагрузка на запись снижается, операции становятся мельче и быстрее.

🔗 4. Корреляция с WAITINGS (PostgreSQL)

· После 09:20 наблюдается рост r_await (время чтения) и WAITINGS (ожидания в СУБД).

· Рост rMB/s совпадает с ростом WAITINGS и падением SPEED.

· Это подтверждает гипотезу о том, что увеличение времени доступа к диску влияет на производительность БД.

⚠️ 5. Потенциальные проблемы

1. Увеличение времени чтения (r_await): с 2 мс до 3.7 мс — рост на 80%.

2. Увеличение размера запросов (rareq_sz): с 19 КБ до 67 КБ — возможно, из-за отсутствия индексов или полного сканирования таблиц.

3. Рост объёма читаемых данных (rMB/s): в 3 раза — нагрузка на диск возросла.

✅ 6. Рекомендации

1. Оптимизация запросов PostgreSQL:

o Проверить выполнение планов запросов (EXPLAIN ANALYZE).

o Добавить индексы для часто сканируемых таблиц.

o Увеличить shared_buffers, чтобы больше данных кэшировалось в памяти.

2. Мониторинг диска:

o Проверить скорость диска (например, с помощью hdparm или fio).

o Убедиться, что диск не фрагментирован.

3. Настройка PostgreSQL:

o Увеличить effective_cache_size.

o Настроить random_page_cost и seq_page_cost в соответствии с типом диска.

4. Аппаратные улучшения:

o Рассмотреть переход на SSD, если используется HDD.

o Увеличить скорость дисковой подсистемы (RAID, кэширование).

📈 7. Визуализация (рекомендуется)

· График rMB/s и WAITINGS на одной оси времени.

· График r_await и rareq_sz.

· График %util и aqu_sz для оценки загрузки диска.

График rMB/s и WAITINGS.

Для наглядности значения rMB/s увеличены в 100 раз

Для наглядности значения rMB/s увеличены в 100 раз

Увеличение rMB/s сопровождается ростом количества ожиданий.

График r_await и rareq_sz.

График %util и aqu_sz для оценки загрузки диска.

Для наглядности значения aqu_sz увеличены в 10 раз

Для наглядности значения aqu_sz увеличены в 10 раз

🎯 Заключение

Основная причина деградации производительности — рост размера и времени выполнения дисковых операций чтения, что приводит к увеличению лёгких блокировок (LWLOCK) и ожиданий (WAITINGS) в СУБД.

Приоритет действий:

1. Оптимизация запросов и индексов

2. Настройка параметров PostgreSQL (память, I/O)

3. Аппаратное улучшение дисковых подсистем

4. Мониторинг и алертинг ключевых метрик

Система не испытывает критической нехватки CPU или памяти, но дисковый ввод-вывод стал узким местом из-за изменившегося характера нагрузки (крупные запросы на чтение).

Показать полностью 11
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
1

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

Серия СУБД PostgreSQL

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

Кэш в приоритете: как настройка памяти ускорила операции с данными

Кэш в приоритете: как настройка памяти ускорила операции с данными

В рамках проекта PG_EXPECTO по всесторонней оптимизации СУБД PostgreSQL был проведён цикл экспериментов по настройке подсистемы ввода-вывода. В ходе «Эксперимента-5» фокус сместился на тонкую настройку механизмов кэширования и буферизации операционной системы. Целью было оценить, как управление памятью для метаданных файловой системы может повлиять на общую производительность дисковой подсистемы в условиях аналитической (OLAP) нагрузки, где чтение данных преобладает над записью. Результаты оказались показательными: даже одна корректировка параметра vm.vfs_cache_pressure принесла ощутимое улучшение.

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

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

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

vm.vfs_cache_pressure

Параметр в Linux, который контролирует склонность ядра к освобождению памяти, используемой для кэширования объектов VFS (Virtual File System). Влияет на баланс между кэшем страниц и кэшем метаданных файловой системы.

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

sysctl vm.vfs_cache_pressure

# sysctl vm.vfs_cache_pressure

vm.vfs_cache_pressure = 100

Изменение:

sysctl -w vm.vfs_cache_pressure=50

# sysctl -w vm.vfs_cache_pressure=50

vm.vfs_cache_pressure = 50

# sysctl vm.vfs_cache_pressure

vm.vfs_cache_pressure = 50

Основание:

Уменьшает давление на кэш dentry и inode, что может улучшить кэширование файловых операций.

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

Улучшение эффективности кэша, снижение нагрузки на дисковые операции чтения.

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

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

  • Период анализа: 2026-01-06 11:36 – 2026-01-06 13:25 (около 1 часа 50 минут)

  • Основные устройства хранения:
    vdd (100 ГБ, LVM /data) – основное устройство данных
    vdc (50 ГБ, LVM /wal) – устройство для журналов
    vdb (30 ГБ, LVM /log) – логи
    vda (70 ГБ) – системный диск

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

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

  1. Диск vdd перегружен:
    %util = 100% на протяжении всего периода
    w_await > 5 мс в 90.9% наблюдений
    aqu_sz (средняя длина очереди) > 1 в 100% наблюдений
    cpu_wa > 10% в 100% наблюдений

  2. Диск vdc также показывает высокую загрузку:
    %util = 51–62% (всё время выше 50%)
    Запись стабильна, но загрузка высокая

  3. Высокое соотношение чтения к записи (3.24:1) указывает на аналитическую нагрузку, требующую оптимизации кэширования и стратегий чтения.

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

  • Для vdd:
    Высокая положительная корреляция buff – r/s (0.899) и buff – wMB/s (0.806) – память неэффективно снижает нагрузку на диск.
    Отрицательная корреляция speed – IOPS (-0.593) – проблема не в IOPS, а в других подсистемах (CPU, блокировки).

  • Для vdc:
    Слабая корреляция speed – IOPS (0.252) – IOPS не является узким местом.
    Отрицательная корреляция speed – MB/s (-0.115) – пропускная способность не ограничивает.

Вывод: Проблема производительности связана не с пропускной способностью или IOPS, а с задержками, очередями и, возможно, с настройками СУБД или CPU.

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

Вывод по диагностике узких мест IO:
Основное узкое место – высокие задержки записи и большая очередь на диске vdd, что приводит к ожиданию со стороны CPU (wa высокий). Проблема усугубляется неэффективным использованием памяти для буферизации.

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

  1. Оптимизация диска vdd:
    Рассмотреть переход на более быстрые диски (SSD/NVMe).
    Настроить параметры IO-планировщика (например, deadline или noop для SSD).
    Увеличить размер очереди (nr_requests).

  2. Оптимизация памяти и кэширования:
    Увеличить shared_buffers (если это СУБД, например PostgreSQL).
    Настроить vm.dirty_ratio и vm.dirty_background_ratio для более эффективной записи.

  3. Оптимизация запросов и схемы данных:
    Использовать индексы, секционирование, материализованные представления.
    Пересмотреть запросы с большим количеством чтений.

  4. Мониторинг и дальнейший анализ:
    Следить за iowait, await, aqu_sz в реальном времени.
    Анализировать логи СУБД на предмет медленных запросов.

  5. Для vdc:
    Мониторить утилизацию, при росте нагрузки – рассмотреть выделение более производительного диска.

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

Текущее состояние: Критическое.
Диск vdd является основным узким местом – постоянная 100% загрузка, высокие задержки записи, большая очередь запросов. Это приводит к простою CPU в ожидании IO и снижению общей производительности системы.

Перспективы:
При оптимизации диска vdd, настроек памяти и запросов можно ожидать значительного улучшения производительности. Диск vdc работает в допустимом режиме, но требует наблюдения.

Рекомендуемые первоочередные действия:

  1. Апгрейд vdd на SSD.

  2. Настройка параметров кэширования и записи в ОС и СУБД.

  3. Анализ и оптимизация наиболее ресурсоемких запросов.

*Отчет подготовлен на основе автоматизированного анализа метрик iostat/vmstat за период 06.01.2026 11:36–13:25.*

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

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

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

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

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

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

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

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

IOPS

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Вывод: В обоих экспериментах IO-подсистема не является узким местом. Проблема производительности связана с другими компонентами системы (CPU, блокировки, память).

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

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

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

3.1 Задержки операций (латентности)

Наблюдение: Латентности операций чтения и записи находятся в приемлемых пределах в обоих экспериментах.

3.2 Очереди и блокировки

Наблюдение: Наблюдается рост длины очереди и количества заблокированных процессов, но значения не критичны.

3.3 Загрузка CPU

Наблюдение: Высокий процент времени ожидания IO процессором в обоих экспериментах, что может указывать на неоптимальное взаимодействие CPU и IO.

3.4 Дополнительные показатели производительности IO

Наблюдение: Показатели IOPS и пропускной способности сопоставимы в обоих экспериментах. Время операций с блоками демонстрирует схожую динамику роста.

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

IO-подсистема не является ограничивающим фактором в обоих экспериментах по следующим причинам:

  1. Низкие латентности операций чтения/записи

  2. Отсутствие значимых корреляций между производительностью и метриками IO

  3. Умеренные значения длины очереди и заблокированных процессов

  4. Схожие показатели IOPS и пропускной способности в обоих экспериментах

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

  1. Консистентность результатов: Оба эксперимента демонстрируют одинаковый основной вывод — IO-подсистема не является узким местом в системе.

  2. Эффективность оптимизаций: Эксперимент 5 (с настройками кэширования и буферизации) показал:
    Незначительное улучшение latencies (особенно r_await)
    Слегка сниженные значения cpu_wa
    Сопоставимые основные показатели IOPS и пропускной способности

  3. Рекомендации:
    Сфокусироваться на оптимизации CPU, устранении блокировок и настройке параллелизма
    Рассмотреть оптимизацию работы с памятью
    Провести детальный анализ времени выполнения запросов СУБД
    Настройки кэширования из эксперимента 5 можно считать успешными, но недостаточными для решения основной проблемы производительности

  4. Общий вывод: Проблема производительности в обоих случаях связана с факторами вне IO-подсистемы. Оптимизации кэширования (эксперимент 5) дали незначительные улучшения, но не решили основную проблему, что подтверждает необходимость дальнейшего исследования CPU, блокировок и параметров параллелизма.

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

PG_EXPECTO: Оптимизация подсистемы IO. Анализ возможности увеличения размера очереди запросов

Серия СУБД PostgreSQL

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

nr_requests: Когда очередь не решает проблему, а маскирует её

nr_requests: Когда очередь не решает проблему, а маскирует её

В мире высоконагруженных баз данных каждая миллисекунда ожидания ввода-вывода может стать узким местом всей системы. В поисках решения администраторы часто обращаются к настройке глубины очереди запросов к диску (nr_requests), надеясь одним параметром решить проблему высокой утилизации хранилища. Данный разбор на реальных метриках показывает, что вслепую увеличивать очередь не только бесполезно, но иногда и вредно. Когда диск постоянно работает на 100%, ключ к оптимизации лежит не в очереди, а в грамотном перераспределении нагрузки, стратегическом кэшировании и настройке планировщика операций ввода-вывода.

Запрос нейросети

Проанализируй показатели производительности IO и текущие значения для параметра nr_requests :"# cat /sys/block/vdd/queue/nr_requests

256". Подготовь рекомендации о целесообразности изменения параметра nr_requests для оптимизации подсистемы IO.

На основе анализа производительности IO для диска vdd, текущего значения nr_requests = 256 и контекста нагрузки, можно дать следующие рекомендации:

Текущее состояние (диск vdd):

  1. Высокая загрузка диска:
    %util = 100% постоянно
    Средняя длина очереди (aqu_sz) от 11 до 29
    Большое количество процессов в состоянии uninterruptible sleep (6-14 при 8 CPU)

  2. Характер нагрузки:
    Преобладание операций чтения над записью (соотношение ~3:1)
    OLAP-подобный сценарий с интенсивным чтением
    Высокая корреляция между объемом кэша и объемом чтения с диска

  3. Проблемы:
    Чрезмерное ожидание IO процессором (wa = 45-51%)
    Глубина очереди постоянно > 1 (100% наблюдений)
    Признаки недостаточной эффективности кэширования

Рекомендации по nr_requests:

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

  • Достаточно высокое для большинства рабочих нагрузок

  • НЕ является основным ограничивающим фактором при текущей нагрузке

  • Увеличение не решит проблему 100% утилизации

Рекомендуемые действия:

НЕ увеличивать nr_requests (256 → более высокие значения):

Текущая очередь и так переполнена (aqu_sz до 29)

Увеличение nr_requests не снизит %util = 100%

Может привести к:

  • Увеличению латентности отдельных запросов

  • Росту потребления памяти ядром

  • Эффекту "застревания" старых запросов

Оптимизировать параметры планировщика (scheduler):

# Для OLAP-нагрузки с преобладанием чтения

echo deadline > /sys/block/vdd/queue/scheduler
# Настройки для deadline (опционально)
echo 256 > /sys/block/vdd/queue/iosched/read_expire
echo 5000 > /sys/block/vdd/queue/iosched/write_expire
echo 8 > /sys/block/vdd/queue/iosched/fifo_batch

Увеличить readahead для последовательных чтений:

# Текущее значение обычно 128 или 256
cat /sys/block/vdd/queue/read_ahead_kb
# Увеличить для OLAP
echo 4096 > /sys/block/vdd/queue/read_ahead_kb

Приоритетные оптимизации:
Увеличить кэширование (если возможно добавить RAM)
Оптимизировать запросы БД (индексы, уменьшение seq scan)
Рассмотреть разделение нагрузки на несколько дисков
Проверить настройки ФС (noatime, nodiratime)

Экспериментальная проверка (если решили изменить nr_requests):

#Временно уменьшить для теста
echo 128 > /sys/block/vdd/queue/nr_requests

# Мониторинг эффекта
iostat -x 1
cat /proc/interrupts | grep vdd

Вывод:

Параметр nr_requests = 256 не является узким местом.

Проблема :

  1. Слишком высокой нагрузке на диск (OLAP + вероятно недостаток кэша)

  2. Возможно, недостаточной производительности самого диска для текущей нагрузки

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

Сфокусироваться на:

  1. Увеличении оперативной памяти для кэширования

  2. Оптимизации запросов к базе данных

  3. Рассмотрении более производительного хранилища (SSD/NVMe вместо HDD)

  4. Настройке параметров планировщика и readahead

Изменение nr_requests даст минимальный эффект и может ухудшить ситуацию при текущей 100% утилизации диска.

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

PG_EXPECTO: Оптимизация подсистемы IO. Анализ возможности оптимизации планировщика IO

Серия СУБД PostgreSQL

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

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

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

В мире высоконагруженных СУБД каждый компонент системы требует пристального внимания. Подсистема ввода-вывода (IO) часто становится узким местом, напрямую влияющим на отзывчивость и стабильность работы базы данных. Данный анализ фокусируется на сердце этой подсистемы — планировщике операций ввода-вывода. Мы не просто сравниваем доступные алгоритмы (mq-deadline, kyber, bfq, none), но и проводим детальную оценку их применимости в конкретных условиях: для основного хранилища данных (vdd) и диска журнала транзакций (vdc). Цель — не слепая погоня за новыми технологиями, а взвешенное, обоснованное решение, основанное на анализе нагрузки, характеристик накопителей и архитектурных особенностей PostgreSQL.

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

1. Текущая конфигурация планировщиков

vdd (данные): [mq-deadline] kyber bfq none
vdc (журнал): [mq-deadline] kyber bfq none

Текущий выбор: mq-deadline на обоих устройствах.

2. Характеристики доступных планировщиков

mq-deadline (текущий)

  • Принцип работы: Гарантирует максимальное время обслуживания запросов

  • Приоритеты: Чтение над записью (особенно важно для СУБД)

  • Особенности: Использует "deadline" механизм для предотвращения голодания операций

  • Лучше всего для: Смешанных нагрузок, особенно с преобладанием чтения

kyber

  • Принцип работы: Адаптивный планировщик, оптимизированный для SSD/NVMe

  • Особенности: Автоматически настраивает глубину очереди на основе целевых задержек

  • Лучше всего для: Быстрых накопителей (SSD/NVMe) в виртуализированных средах

bfq (Budget Fair Queuing)

  • Принцип работы: Справедливое распределение пропускной способности между процессами

  • Особенности: Гарантирует пропускную способность для каждого процесса

  • Лучше всего для: Интерактивных и десктопных систем, многопользовательских сред

none

  • Принцип работы: Без планировщика, запросы передаются напрямую

  • Особенности: Минимальные накладные расходы

  • Лучше всего для: Быстрых устройств с собственными алгоритмами оптимизации

3. Анализ целесообразности изменения планировщиков

Для vdd (основное хранилище данных):

Проблемы: 100% утилизация, высокие задержки записи, OLAP-нагрузка с преобладанием чтения

Оценка альтернатив:

  1. Оставить mq-deadline:
    ✅ Приоритет чтения важен для OLAP
    ✅ Deadline механизм предотвращает голодание
    ❌ Не решает проблему 100% утилизации

  2. Перейти на kyber:
    ✅ Адаптивное управление очередями
    ✅ Хорошо для виртуализированных сред
    ❌ Разработан для быстрых SSD/NVMe (неизвестен тип накопителя)
    ❌ Меньший приоритет чтения перед записью

  3. Перейти на bfq:
    ❌ Большие накладные расходы
    ❌ Не оптимален для серверных нагрузок
    ❌ Может ухудшить производительность при 100% утилизации

  4. Перейти на none:
    ❌ Опасен при высоких очередях
    ❌ Может привести к полному захвату устройства одним процессом
    ❌ Требует тщательного мониторинга

Рекомендация для vdd: Оставить mq-deadline, но рассмотреть тонкую настройку параметров

Для vdc (журнал транзакций):

Текущее состояние: Умеренная нагрузка, только запись, хорошая производительность

Оценка альтернатив:

  1. Оставить mq-deadline:
    ✅ Стабильная работа подтверждена данными
    ✅ Хорошо справляется с последовательной записью
    ✅ Deadline механизм важен для журналов

  2. Перейти на kyber:
    ✅ Возможна оптимизация задержек
    ❌ Незначительный потенциальный выигрыш

Рекомендация для vdc: Оставить mq-deadline

4. Тонкая настройка mq-deadline для vdd

Если устройство vdd — это HDD (вероятно, учитывая высокие задержки):

# Увеличение времени дедлайна для записи (по умолчанию 5 секунд)
echo 10000 > /sys/block/vdd/queue/iosched/write_expire

# Уменьшение времени дедлайна для чтения (по умолчанию 500 мс)
echo 250 > /sys/block/vdd/queue/iosched/read_expire

# Увеличение размера пакета (может улучшить пропускную способность)
echo 16 > /sys/block/vdd/queue/iosched/fifo_batch

# Увеличение количества запросов в очереди (осторожно!)
echo 256 > /sys/block/vdd/queue/nr_requests

Если устройство vdd — это SSD:

# Уменьшение времени дедлайна для записи
echo 5000 > /sys/block/vdd/queue/iosched/write_expire

# Уменьшение времени дедлайна для чтения
echo 100 > /sys/block/vdd/queue/iosched/read_expire

# Увеличение размера пакета для SSD
echo 32 > /sys/block/vdd/queue/iosched/fifo_batch

# Рассмотреть переход на kyber
echo kyber > /sys/block/vdd/queue/scheduler

5. Мониторинг и тестирование изменений

Прежде чем вносить изменения:

# Сохранить текущие настройки
cat /sys/block/vdd/queue/iosched/* > ~/mq-deadline-backup.txt

После изменений мониторить:

# Глубина очереди
cat /sys/block/vdd/queue/nr_requests

# Статистика планировщика
cat /sys/block/vdd/queue/iosched/*

# Производительность в реальном времени
iostat -x 1

6. Выводы и рекомендации

Основной вывод:

Текущий выбор планировщика (mq-deadline) является оптимальным для текущей нагрузки, учитывая:

  1. Преобладание операций чтения на vdd

  2. Последовательную запись на vdc

  3. Высокую утилизацию устройств

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

Определить тип накопителя vdd:

cat /sys/block/vdd/queue/rotational

Если 1 — HDD, оставлять mq-deadline с тонкой настройкой
Если 0 — SSD, можно протестировать kyber

Настройка параметров mq-deadline для vdd:

# Для HDD
echo 10000 > /sys/block/vdd/queue/iosched/write_expire
echo 250 > /sys/block/vdd/queue/iosched/read_expire

# Проверить результат
iostat -x 1 | grep vdd

A/B тестирование (только в периоды низкой нагрузки):

# Тест kyber
echo kyber > /sys/block/vdd/queue/scheduler
# Мониторить 15-30 минут
# Вернуть обратно при ухудшении
echo mq-deadline > /sys/block/vdd/queue/scheduler

Документирование изменений:
Зафиксировать исходные параметры
Записать все изменения
Сравнить метрики "до" и "после"

Критическое предупреждение:

Основная проблема vdd — 100% утилизация и высокие задержки. Изменение планировщика не решит эту проблему кардинально.

Необходимо:

  1. Увеличить ресурсы (RAM, быстрые диски)

  2. Оптимизировать запросы СУБД

  3. Рассмотреть балансировку нагрузки между несколькими дисками

Планировщик — это инструмент управления очередями, а не увеличения пропускной способности устройства.

Анализ основан на данных мониторинга от 05.01.2026 и текущей конфигурации планировщиков.

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

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

Серия СУБД PostgreSQL

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

Оптимизировали IO, а узкое место — CPU. Иногда проблема не там, где её ищут.

Оптимизировали IO, а узкое место — CPU. Иногда проблема не там, где её ищут.

На основе детального сравнительного анализа двух экспериментов по оптимизации подсистемы ввода-вывода (IO) для PostgreSQL, был получен ключевой и несколько неожиданный вывод. Эксперименты по настройке параметров отложенной записи (vm.dirty_ratio) и выбору IO-планировщика (deadline) показали, что само по себе тонкое регулирование дисковых операций не является решением фундаментальной проблемы производительности в данной системе. Несмотря на некоторые изменения в метриках (рост IOPS, увеличение задержек), основное узкое место сместилось в сторону процессорных ресурсов (CPU), блокировок и настроек параллелизма внутри СУБД. Этот отчёт наглядно иллюстрирует важность комплексной диагностики: прежде чем оптимизировать диск, стоит убедиться, что проблема действительно в нём.

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

Эксперимент-2 (dirty_ratio , dirty_background_ratio )

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

Deadline

Планировщик ввода-вывода (I/O scheduler) в ядре Linux, который устанавливает предельный срок на обслуживание запросов. Задача — минимизировать задержки ввода-вывода, обеспечить доступ процесса к запрашиваемому дисковому устройству.

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

  • cat /sys/block/vdd/queue/scheduler

  • cat /sys/block/vdc/queue/scheduler

# cat /sys/block/vdd/queue/scheduler

[none] mq-deadline kyber bfq

# cat /sys/block/vdc/queue/scheduler

[none] mq-deadline kyber bfq

Изменение:

  • echo deadline > /sys/block/vdd/queue/scheduler

  • echo deadline > /sys/block/vdc/queue/scheduler

# echo deadline > /sys/block/vdd/queue/scheduler

# echo deadline > /sys/block/vdc/queue/scheduler

You have mail in /var/spool/mail/root

# cat /sys/block/vdd/queue/scheduler

[mq-deadline] kyber bfq none

# cat /sys/block/vdc/queue/scheduler

[mq-deadline] kyber bfq none

Основание:

deadline уменьшает задержки для операций чтения, что критично при OLAP-нагрузке.

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

Улучшение времени отклика на чтение, снижение r_await.

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

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

  • Период анализа: 05.01.2026 15:02 – 16:51

  • Основные устройства хранения:
    vdd (100 ГБ, LVM /data) — основное хранилище данных
    vdc (50 ГБ, LVM /wal) — журнал транзакций

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

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

  • Устройство vdd:
    100% утилизация (%util) в течение всего периода
    Высокая длина очереди запросов (aqu_sz до 29, всегда >1)
    Более 30% операций записи имеют задержку >5 мс
    Процессы в состоянии D (uninterruptible sleep) часто превышают количество ядер CPU
    Высокий cpu_wa (42–51%) — CPU значительное время ждёт завершения IO

  • Устройство vdc:
    Проблем не выявлено, все метрики в пределах нормы

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

  • На vdd:
    Сильная положительная корреляция между cache и rMB/s (0.7547) — рост чтения приводит к росту использования кэша
    Сильная отрицательная корреляция между cache и wMB/s (-0.8680) — кэш неэффективен для записи
    Высокая корреляция операционной скорости с чтением блоков (0.9143) — скорость приложения напрямую зависит от дискового чтения

  • На vdc:
    Корреляции слабые или отрицательные, что указывает на сбалансированную или не-IO-ограниченную нагрузку

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

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

  • vdd является узким местом — устройство постоянно перегружено, высокая очередь и задержки записи

  • Проблема не в пропускной способности диска (отрицательная корреляция speed – MB/s)

  • Возможные причины: недостаток RAM для кэширования, неэффективные запросы (seq scan), блокировки СУБД, параметры параллелизма

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

  1. Для vdd (данные):
    Увеличить объём RAM для кэширования данных
    Оптимизировать запросы СУБД: добавить индексы, избегать полных сканирований
    Настроить параметры PostgreSQL:
    Увеличить work_mem
    Настроить shared_buffers
    Проверить effective_cache_size
    Рассмотреть использование более быстрых дисков (SSD/NVMe)
    Балансировка нагрузки: распределить данные по нескольким дискам

  2. Для vdc (журнал):
    Текущая конфигурация адекватна, рекомендуется мониторинг

  3. Общие рекомендации:
    Мониторинг процессов в состоянии D
    Анализ журналов СУБД на предмет медленных запросов
    Проверка настроек IO-планировщика

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

Система испытывает серьёзные проблемы с производительностью IO на основном диске данных (vdd).
Устройство постоянно перегружено, наблюдаются высокие задержки записи и длинные очереди запросов. Это напрямую влияет на производительность приложений, о чём свидетельствует высокий cpu_wa и сильная зависимость скорости операций от дискового чтения.

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

Отчет подготовлен на основе данных мониторинга за период 05.01.2026 15:02–16:51

Сравнительные результаты: Эксперимент-2 (vm.dirty_ratio/vm.dirty_background_ratio) и Эксперимент-3(Параметры IO-планировщика)

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

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

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

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

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

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

IOPS

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Сравнительный анализ производительности подсистемы IO: Эксперимент-2 (vm.dirty_ratio/vm.dirty_background_ratio) и Эксперимент-3(Параметры IO-планировщика)

2.io_performance.txt - Данные по производительности IO в ходе эксперимента-2

3.io_performance.txt - Данные по производительности IO в ходе эксперимента-3

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

Состав отчета:

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

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

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

- r_await(ms)

- w_await(ms)

- aqu_sz

- proc_b

- cpu_wa(%)

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

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

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

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

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

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

Вывод: Оба эксперимента показывают, что узкое место производительности не в подсистеме IO. Основные проблемы связаны с CPU, блокировками и настройками параллелизма.

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

Вывод:

  • В эксперименте 2 наблюдается более выраженная отрицательная корреляция между скоростью и пропускной способностью, что может указывать на системные задержки, не связанные с диском.

  • В эксперименте 3 корреляция speed-IOPS стала слабо положительной, что может свидетельствовать о незначительном улучшении отладки IO-планировщика, но проблема остаётся.

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

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

  • Эксперимент 2: Отрицательная (-0.2692) → рост IOPS не улучшает скорость.

  • Эксперимент 3: Слабая положительная (+0.1309) → минимальное влияние IOPS на скорость.

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

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

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

  • utilization (%) = 100% в обоих экспериментах → система постоянно занята.

  • shared_blks_ показатели схожи, что указывает на одинаковую природу нагрузки (OLTP/OLAP).

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

  • Задержки на чтение/запись (r_await, w_await) выросли в эксперименте 3, возможно из-за настройки планировщика.

  • Очередь (aqu_sz) и количество процессов в ожидании (proc_b) увеличились, что согласуется с гипотезой о блокировках/ожиданиях.

  • CPU wait (cpu_wa) остаётся высоким, подтверждая, что CPU — узкое место.

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

  1. IO не является ограничивающим фактором ни в одном из экспериментов.

  2. Изменение параметров IO (dirty_ratio, планировщик) не привело к значимому улучшению производительности системы.

  3. Нагрузка остаётся CPU-интенсивной с признаками contention (блокировки, ожидания).

  4. Эксперимент 3 показал незначительный рост IOPS и MB/s, но задержки (await) и очередь (aqu_sz) выросли, что может указывать на повышенную конкуренцию за ресурсы.

  5. Рекомендации:
    Сфокусироваться на оптимизации CPU (профилирование, настройка параллелизма).
    Исследовать блокировки и ожидания в СУБД.
    Рассмотреть возможность увеличения вычислительных ресурсов или оптимизации запросов.

Заключение: Оба эксперимента подтверждают, что проблема производительности лежит вне подсистемы IO. Требуется углублённый анализ CPU, блокировок и настроек параллелизма для дальнейшей оптимизации.

Итог эксперимента-3 по сравнению с экспериментом-2

Изменение параметров IO-планировщика привело к снижению производительности СУБД при низкой нагрузке и повышению производительности СУБД при высокой нагрузке, при практически неизменном значении ожиданий СУБД.

Эксперимент 3 показал незначительный рост IOPS и MB/s, но задержки (await) и очередь (aqu_sz) выросли, что может указывать на повышенную конкуренцию за ресурсы.

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

PG_EXPECTO: Оптимизация подсистемы IO. Эксперимент-2 (dirty_ratio , dirty_background_ratio )

Серия СУБД PostgreSQL

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

Диски справляются, процессор простаивает: оптимизация записи не решила проблему нагрузки на CPU

Диски справляются, процессор простаивает: оптимизация записи не решила проблему нагрузки на CPU

В ходе экспериментов по оптимизации подсистемы ввода-вывода была проанализирована работа системы под нагрузкой OLAP. Основное внимание уделялось настройкам ядра Linux (vm.dirty_ratio и vm.dirty_background_ratio), влияющим на механизм отложенной записи на диск. Результаты показали, что, несмотря на некоторые улучшения в операционной скорости, корневые проблемы производительности связаны не с дисковыми операциями, а с высокой нагрузкой на процессор и внутренними блокировками СУБД. Данная статья суммирует ключевые выводы и предоставляет рекомендации для дальнейшей оптимизации.

Базовые показатели IO

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

Эксперимент-2: vm.dirty_ratio/vm.dirty_background_ratio

vm.dirty_ratio

Параметр ядра Linux, который указывает, какой процент общей оперативной памяти должен быть занят, чтобы процесс, ведущий запись данных на диск, инициировал запись кэшированных данных непосредственно на жёсткий диск.

vm.dirty_background_ratio

Параметр ядра операционной системы Linux, который указывает процент памяти, заполненной «грязными» страницами (изменёнными, но ещё не записанными на диск).

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

  • sysctl vm.dirty_ratio

  • sysctl vm.dirty_background_ratio

# sysctl vm.dirty_ratio

vm.dirty_ratio = 30

# sysctl vm.dirty_background_ratio

vm.dirty_background_ratio = 10

Изменение:

  • sysctl -w vm.dirty_ratio=10

  • sysctl -w vm.dirty_background_ratio=5

# sysctl -w vm.dirty_ratio=10

vm.dirty_ratio = 10

# sysctl -w vm.dirty_background_ratio=5

vm.dirty_background_ratio = 5

# sysctl vm.dirty_ratio

vm.dirty_ratio = 10

# sysctl vm.dirty_background_ratio

vm.dirty_background_ratio = 5

Основание

Снижает объем «грязных» страниц в памяти перед записью на диск, уменьшая пиковую нагрузку на IO.

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

Более равномерная запись, снижение пикового времени ожидания записи.

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

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

  • Период анализа: 2026-01-05 09:44 – 2026-01-05 11:34 (2 часа)

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

  • vdd (/data, 99 ГБ) — основное хранилище данных

  • vdc (/wal, 49 ГБ) — журнал предзаписи

  • vda — системный диск

  • vdb (/log) — диск для логов

  • Тип нагрузки: OLAP (аналитическая), подтверждается высоким соотношением операций чтения к записи (2.88:1)

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

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

  • Высокое время ожидания CPU для IO (wa > 10% в 100% наблюдений)

  • Длина очереди запросов (aqu_sz) постоянно > 1 (до 23)

  • Более 27% наблюдений — время ответа на запись > 5 мс (w_await)

  • Процессы в состоянии uninterruptible sleep (proc_b) превышают количество ядер CPU (до 13 при 8 ядрах)

  • Высокая корреляция между использованием буферной памяти и операциями записи (buff – w/s = 0.74)

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

  • Корреляция wa – util отрицательная (−0.36), что говорит о том, что ожидание CPU не напрямую связано с загрузкой диска

  • Корреляция buff – w/s высокая (0.74), что указывает на неэффективное использование буферной памяти для снижения нагрузки на запись

  • Корреляция speed – IOPS отрицательная (−0.27), производительность не ограничена IOPS

  • Корреляция speed – MB/s отрицательная (−0.84), пропускная способность диска не является узким местом

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

Вывод по диагностике:

Узкое место — не в пропускной способности диска или IOPS, а в высокой загрузке CPU из-за ожидания IO и, возможно, в блокировках на уровне СУБД или приложений. Система работает в режиме OLAP с высокой нагрузкой на чтение, но диск vdd не справляется с потоком запросов.

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

Увеличить кэширование:

  • Добавить оперативной памяти для увеличения buff/cache

  • Настроить параметры СУБД (shared_buffers, work_mem для PostgreSQL)

Оптимизировать запросы:

  • Анализ и перестройка индексов

  • Использование секционирования таблиц

  • Уменьшение объёма читаемых данных (поля, фильтрация)

Настройка дисковой подсистемы:

  • Рассмотреть использование более быстрых дисков (SSD/NVMe) для vdd

  • Проверить и настроить параметры файловой системы и монтирования (noatime, nodiratime)

Оптимизация процессов:

  • Выявление и оптимизация процессов в состоянии D (возможно, тяжёлые запросы или фоновые задачи)

  • Настройка лимитов и приоритетов IO (ionice, cgroups)

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

Подсистема IO находится под критической нагрузкой, особенно диск vdd.

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

Сравнительные результаты Эксперимент-1(Базовые показатели) и Эксперимент-2 (vm.dirty_ratio/vm.dirty_background_ratio)

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

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

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

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

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

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

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

IOPS

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

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

Среднее увеличение IOPS в ходе Эсперимента-2 составило 3.51%.

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

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

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

Среднее увеличение MB/s в ходе Эсперимента-2 составило 5.56%.

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

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

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

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

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

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

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

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

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

Сравнительный анализ производительности подсистемы IO: Эксперимент-1 (BASELINE) vs Эксперимент-2 (vm.dirty_ratio/vm.dirty_background_ratio)

1.io_performance.txt - Данные по производительности IO в ходе эксперимента-1

2.io_performance.txt - Данные по производительности IO в ходе эксперимента-2

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

Состав отчета:

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

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

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

- r_await(ms)

- w_await(ms)

- aqu_sz

- proc_b

- cpu_wa(%)

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

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

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

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

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

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

Вывод: В Эксперименте-2 проблема с CPU стала ещё более явной (ALARM), что может указывать на усиление нагрузки на процессор из-за изменений в настройках отложенной записи.

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

Вывод: Настройки vm.dirty_ratio/vm.dirty_background_ratio привели к усилению отрицательной корреляции между скоростью операции и пропускной способностью диска, что ещё больше подтверждает, что проблема не в IO, а в других подсистемах (CPU, блокировки, память).

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

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

  • Задержки записи (w_await) немного выросли, что может быть связано с настройками отложенной записи.

  • Длина очереди (aqu_sz) увеличилась, что указывает на большее накопление запросов.

  • CPU wait (cpu_wa) остаётся высоким, что подтверждает гипотезу о CPU как узком месте.

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

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

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

Настройки vm.dirty_ratio/vm.dirty_background_ratio:

  • Не улучшили производительность IO.

  • Привели к усилению отрицательной корреляции speed-MB/s.

  • Возможно, увеличили нагрузку на CPU из-за изменения паттерна записи.

Рекомендации по дальнейшей оптимизации:

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

  • Исследовать блокировки и ожидания в СУБД.

  • Настроить параметры параллелизма и пулы соединений.

  • Вернуть настройки dirty в исходное состояние, если они не дали положительного эффекта.

Заключение:

Эксперимент-2 подтвердил выводы Эксперимента-1: проблема производительности лежит вне подсистемы IO.

Изменения в настройках отложенной записи не привели к улучшениям и даже усилили признаки CPU-ограничения.

Далее следует сосредоточиться на оптимизации CPU и работы СУБД.

Итог эксперимента-2

Изменение настроек vm.dirty_ratio/vm.dirty_background_ratio в целом оказало положительное влияние на производительность СУБД , однако существенного влияния на производительности дисковой подсистемы IO не было достигнуто.

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

PG_EXPECTO : Тюнинг параметров ОС для оптимизации IO

Серия СУБД PostgreSQL

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

PG_EXPECTO: Когда каждый параметр на счету. Тонкая настройка IO — максимальная производительность.

PG_EXPECTO: Когда каждый параметр на счету. Тонкая настройка IO — максимальная производительность.

От диагностики к действию

Высокая нагрузка на дисковую подсистему — частое «бутылочное горло», способный затормозить работу даже самого мощного сервера. Когда мониторинг показывает 100% утилизацию диска, растущие задержки и очередь из процессов, ожидающих IO, стандартных настроек ОС уже недостаточно.

Эта статья — не теория, а готовый план как по конкретным симптомам (OLAP-нагрузка, неэффективный кэш, блокировки) выявить корень проблемы и применить целенаправленные правки: от выбора IO-планировщика и настройки виртуальной памяти до оптимизации файловой системы. Каждое изменение объяснено, обосновано и снабжено конкретной командой. Следуя этому руководству, вы системно оптимизируете производительность IO, переводя подсистему из состояния «выживания» в режим эффективной работы.

Начало: Получение данных о производительности IO

PG_EXPECTO: Анализ производительности подсистемы IO по результатам нагрузочного тестирования СУБД PostgreSQL

Задача

Сформировать список изменений параметров ОС для оптимизации производительности IO.

Промпт

Используя данные о результатах производительности системы IO,

необходимо подготовить список изменений параметров операционной системы для оптимизации производительности подсистемы IO:

**Общее описание оптимизируемых параметров и ожидаемый эффект**

**Оптимизация параметров IO**

- Получение текущего значения параметра

- Изменение значения параметра

- Основание для изменения

- Ожидаемый эффект от изменения

**Итог**

Тюнинг параметров ОС

На основе анализа предоставленных данных о производительности IO-подсистемы выявлены следующие проблемы:

  1. Высокая загрузка диска vdd (100% utilization).

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

  3. Большое количество процессов в состоянии ожидания IO (uninterruptible sleep), превышающее количество ядер CPU.

  4. Высокое отношение операций чтения к записи (OLAP-сценарий).

  5. Низкая корреляция между операционной скоростью и IOPS/MB/s, что говорит о том, что узкое место — не в дисках, а в других подсистемах (CPU, блокировки, параметры СУБД).

📋 Список изменений параметров ОС для оптимизации IO

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

Параметр: vm.dirty_ratio, vm.dirty_background_ratio

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

sysctl vm.dirty_ratio
sysctl vm.dirty_background_ratio

  • Изменение:

sysctl -w vm.dirty_ratio=10
sysctl -w vm.dirty_background_ratio=5

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

  • Ожидаемый эффект: Более равномерная запись, снижение пикового времени ожидания записи.

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

Параметр: Выбор планировщика для дисков vdd и vdc

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

cat /sys/block/vdd/queue/scheduler
cat /sys/block/vdc/queue/scheduler

  • Изменение:

echo deadline > /sys/block/vdd/queue/scheduler
echo deadline > /sys/block/vdc/queue/scheduler

  • Основание: deadline уменьшает задержки для операций чтения, что критично при OLAP-нагрузке.

  • Ожидаемый эффект: Улучшение времени отклика на чтение, снижение r_await.

3. Увеличение размера очереди запросов

Параметр: nr_requests

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

cat /sys/block/vdd/queue/nr_requests

  • Изменение:

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

  • Основание: Увеличивает глубину очереди запросов, позволяя диску эффективнее планировать операции.

  • Ожидаемый эффект: Снижение aqu_sz (средней длины очереди), улучшение утилизации диска.

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

Параметр: vm.vfs_cache_pressure

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

sysctl vm.vfs_cache_pressure

  • Изменение:

sysctl -w vm.vfs_cache_pressure=50

  • Основание: Уменьшает давление на кэш dentry и inode, что может улучшить кэширование файловых операций.

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

5. Увеличение лимитов на количество открытых файлов

Параметр: fs.file-max, ulimit -n

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

sysctl fs.file-max
ulimit -n

  • Изменение:

sysctl -w fs.file-max=655356
echo "* soft nofile 65535" >> /etc/security/limits.conf
echo "* hard nofile 65535" >> /etc/security/limits.conf

  • Основание: При большом количестве операций чтения/записи может требоваться больше открытых файлов.

  • Ожидаемый эффект: Избежание ошибок “too many open files”, стабильность работы.

6. Настройка параметров виртуальной памяти

Параметр: vm.swappiness

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

sysctl vm.swappiness

  • Изменение:

sysctl -w vm.swappiness=10

  • Основание: Уменьшает склонность системы к свопингу, что важно при высокой нагрузке на IO.

  • Ожидаемый эффект: Больше оперативной памяти доступно для кэширования, меньше свопинга.

7. Настройка параметров сетевой подсистемы (если есть сетевые FS) - опционально

Параметр: net.core.rmem_max, net.core.wmem_max

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

sysctl net.core.rmem_max
sysctl net.core.wmem_max

  • Изменение:

sysctl -w net.core.rmem_max=16777216
sysctl -w net.core.wmem_max=16777216

  • Основание: Увеличивает буферы сетевой подсистемы, если используется NFS или другие сетевые хранилища.

  • Ожидаемый эффект: Улучшение пропускной способности сетевого IO.

8. Оптимизация параметров файловой системы

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

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

mount | grep /data

  • Изменение:
    В /etc/fstab добавить для разделов /data, /log, /wal:textnoatime,nodiratime

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

  • Ожидаемый эффект: Снижение нагрузки на запись.

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

Параметр: /sys/block/vdd/queue/read_ahead_kb

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

cat /sys/block/vdd/queue/read_ahead_kb

  • Изменение:

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

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

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

10. Настройка параметров энергосбережения для дисков - опционально

Параметр: Управление APM (Advanced Power Management)

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

hdparm -B /dev/vdd

  • Изменение:

hdparm -B 255 /dev/vdd

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

  • Ожидаемый эффект: Снижение r_await и w_await.

Итог

Предложенные изменения направлены на:

  • Снижение нагрузки на диски за счёт оптимизации кэширования и буферизации.

  • Улучшение отклика подсистемы IO через настройку планировщика и очередей.

  • Увеличение эффективности использования оперативной памяти для снижения количества операций чтения/записи.

  • Оптимизацию работы файловых систем и сетевых подсистем.

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

Вносить изменения постепенно, тестируя каждый параметр под нагрузкой.

Для постоянного применения добавлять настройки в /etc/sysctl.conf, /etc/security/limits.conf и /etc/fstab.

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

PG_EXPECTO: Анализ производительности подсистемы IO по результатам нагрузочного тестирования СУБД PostgreSQL

Серия СУБД PostgreSQL

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

Заглянуть под капот данных: как IO становится узким местом СУБД

Заглянуть под капот данных: как IO становится узким местом СУБД

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

Задача

Подготовить промпт для формирования нейросетью отчета по анализу производительности подсистемы IO по результатам нагрузочного тестирования.

Формирование файлов статистических данных и промптов для нейросети, по итогам нагрузочного тестирования

cd /postgres/pg_expecto/sh/performance_reports

./load_test_report.sh

Результирующие файлы:

  • Статистические данные по производительности СУБД и инфраструктуры : 1.summary.txt

  • Промпт для нейросети для формирования отчета по производительности СУБД и инфраструктуры : _1.prompt.txt

  • Статистические данные по производительности подсистемы IO: _2.io_performance.txt

  • Промпт для нейросети для формирования отчета по производительности подсистемы IO: _2.io_performance_prompt.txt

  • Метрики производительности дискового устройства файловой системы /data: linux.x.iostat_vdd_performance.txt

  • Метрики производительности дискового устройства файловой системы /wal linux.x.iostat_vdc_performance.txt

Нагрузка на СУБД

График изменения нагрузки на СУБД в ходе нагрузочного тестирования

График изменения нагрузки на СУБД в ходе нагрузочного тестирования

Показатели производительности IO

Диск vdd (/data)

IOPS

График изменения IOPS в ходе нагрузочного тестирования для диска vdd

График изменения IOPS в ходе нагрузочного тестирования для диска vdd

MB/s

График изменения пропускной способности(MB/s) в ходе нагрузочного тестирования для диска vdd

График изменения пропускной способности(MB/s) в ходе нагрузочного тестирования для диска vdd

Диск vdc (/wal)

IOPS

График изменения IOPS в ходе нагрузочного тестирования для диска vdc

График изменения IOPS в ходе нагрузочного тестирования для диска vdc

MB/s

График изменения пропускной способности(MB/s) в ходе нагрузочного тестирования для диска vdc

График изменения пропускной способности(MB/s) в ходе нагрузочного тестирования для диска vdc

Формирование итогового отчета по производительности IO

Промпт

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

Состав отчета:

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

- Период анализа

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

- Тип нагрузки

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

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

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

- r_await(ms)

- w_await(ms)

- aqu_sz

- proc_b

- cpu_wa(%)

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

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

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

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

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

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

Период анализа: 2026-01-03 12:59 — 2026-01-03 14:48 (≈2 часа)
Основные устройства хранения:

  • /data → устройство vdd (100 ГБ, LVM)

  • /wal → устройство vdc (50 ГБ, LVM)

Тип нагрузки: OLAP-сценарий (соотношение чтения к записи ≈ 2.68:1). Преобладают операции чтения, что характерно для аналитических запросов.

1. Файловая система /data (устройство vdd)

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

  • Загрузка устройства 100% (%util = 100) на всём интервале наблюдения.

  • Высокая длина очереди запросов (aqu_sz до 18), что указывает на перегрузку диска.

  • Высокое время ожидания CPU для IO (cpu_wa > 10% в 100% наблюдений).

  • Корреляция cache – w/s (0.5183) и buff – wMB/s (0.6776) — память неэффективно используется для снижения нагрузки на диск.

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

  • Отрицательная корреляция wa – util (–0.2384) — задержки CPU не связаны напрямую с утилизацией диска.

  • Высокая корреляция cache – r/s (0.5023) — кэш слабо помогает снизить операции чтения.

  • Соотношение чтение/запись ≈ 2.68:1 — подтверждает OLAP-характер нагрузки.

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

Вывод по диагностике:
Узкое место — не в диске, а в CPU и подсистеме памяти. Высокий cpu_wa и большая очередь (aqu_sz) указывают на то, что процессы блокируются из-за ожидания IO, но сами задержки диска (r_await, w_await) низкие. Возможно, проблема в недостаточном буферизации/кэшировании или в настройках СУБД.

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

  1. Увеличить оперативную память для более эффективного кэширования данных.

  2. Настроить параметры СУБД:
    Увеличить shared_buffers (если PostgreSQL).
    Оптимизировать work_mem для тяжёлых запросов.

  3. Проверить план запросов — возможно, избыточные full scan или отсутствие индексов.

  4. Рассмотреть использование более быстрого хранилища (например, SSD) для /data, если нагрузка чтения критична.

  5. Мониторить процессы в D состоянии (proc_b) — выявить конкретные запросы, вызывающие ожидание.

2. Файловая система /wal (устройство vdc)

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

  • Загрузка устройства в норме (%util ≤ 53%).

  • Очередь запросов отсутствует (aqu_sz ≤ 1).

  • Задержки записи минимальны (w_await ≈ 1 мс).

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

  • Отрицательная корреляция wa – util (–0.2795) — CPU не простаивает из-за IO.

  • Слабая корреляция cache – w/s (0.4105) — кэш умеренно влияет на запись.

  • Операции чтения отсутствуют (r/s = 0) — нагрузка чисто на запись (WAL-логи).

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

Вывод по диагностике:
Устройство vdc не является узким местом. Запись в WAL идёт эффективно, задержки минимальны, очередь не формируется.

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

  1. Текущая конфигурация адекватна — изменений не требуется.

  2. Мониторить рост WAL — убедиться, что место не заканчивается.

  3. При увеличении нагрузки на запись — рассмотреть отдельный быстрый SSD для WAL.

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

  1. Основное узкое место — устройство vdd (/data):
    Постоянная 100% загрузка, высокая очередь запросов.
    Проблема не в скорости диска, а в неэффективном использовании памяти и CPU.
    Рекомендуется оптимизировать кэширование и настройки СУБД.

  2. Устройство vdc (/wal) работает в штатном режиме:
    Загрузка умеренная, задержки низкие.
    Не требует срочных изменений.

  3. Общая система:
    Нагрузка имеет OLAP-характер (много чтений).
    CPU простаивает из-за ожидания IO (высокий wa), но диски не являются медленными — проблема в организации доступа к данным.
    Рекомендуется фокус на оптимизацию запросов и увеличение памяти.

Рекомендуемые действия в порядке приоритета:

  1. Увеличить объём оперативной памяти.

  2. Настроить параметры кэширования СУБД.

  3. Провести анализ и оптимизацию медленных запросов.

  4. Рассмотреть переход на SSD для /data, если нагрузка продолжит расти.

*Отчет составлен на основе анализа метрик iostat, vmstat и корреляций за период 2026-01-03 12:59–14:48.*

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

Темы

Политика

Теги

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

Сообщества

18+

Теги

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

Сообщества

Игры

Теги

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

Сообщества

Юмор

Теги

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

Сообщества

Отношения

Теги

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

Сообщества

Здоровье

Теги

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

Сообщества

Путешествия

Теги

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

Сообщества

Спорт

Теги

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

Сообщества

Хобби

Теги

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

Сообщества

Сервис

Теги

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

Сообщества

Природа

Теги

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

Сообщества

Бизнес

Теги

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

Сообщества

Транспорт

Теги

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

Сообщества

Общение

Теги

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

Сообщества

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

Теги

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

Сообщества

Наука

Теги

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

Сообщества

IT

Теги

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

Сообщества

Животные

Теги

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

Сообщества

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

Теги

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

Сообщества

Экономика

Теги

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

Сообщества

Кулинария

Теги

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

Сообщества

История

Теги

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

Сообщества