kznalp

kznalp

Эксперименты по анализу и оптимизации производительности PostgreSQL. Вначале любая оригинальная теория признается абсурдной, потом — верной, потом — самоочевидной и незначительной, и, наконец, столь важной и самобытной, что бывшие критики присваивают ее себе. — Уильям Джеймс (1842–1910) Эксперименты по анализу и оптимизации производительности PostgreSQL. https://t.me/pg_expecto https://dzen.ru/kznalp
Пикабушник
30К рейтинг 147 подписчиков 15 подписок 520 постов 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
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

Теги

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

Сообщества

Животные

Теги

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

Сообщества

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

Теги

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

Сообщества

Экономика

Теги

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

Сообщества

Кулинария

Теги

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

Сообщества

История

Теги

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

Сообщества