Корреляционный анализ для решения инцидентов производительности СУБД

Данная статья должна была появится раньше, чем опубликованная вчера https://habr.com/p/827156/ , поскольку планируемые методы анализа производительности отдельного запроса являются частным случаем решения общей задачи — анализ производительности СУБД.

Вводная часть.

Известное базовое физическое понятие:

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

Перефразируя данное определение для СУБД, введем понятие производительность для СУБД:

Производительностью СУБД называется количество объемов информации, обработанных за единицу времени.

Единицей информации СУБД будем считать страницу буферного кэша СУБД. СУБД в процессе работы читает, записывает и изменяет страницы в буферном кэше. Таким образом производительностью СУБД будем считать модуль вектора N размерности (n1, n2, n3) , где:

  • n1 — количество прочитанных блоков в секунду;

  • n2 — количество записанных блоков в секунду;

  • n3 — количество измененных блоков в секунду;

Также добавим в вектор еще 2 размерности: QPS (количество завершенных запросов в секунду) , TPS (количество зафиксированных транзакций в секунду).

По отдельности QPS и TPS не могут являться метриками производительность , потому, что не отображают объем обработанной информации , а служат лишь индикаторами работоспособности СУБД. Самая простая аналогия — тахометр в автомобиле. Результирующая мощность используемая автомобилем зависит, но не определяется только оборотами двигателя.

Как было показано ранее https://habr.com/ru/posts/827260/ , метрика «Время отклика СУБД» — не является индикатором производительности СУБД и не используется при анализе инцидентов.

Итак — метрика производительности СУБД (далее — CPI) рассчитывается как модуль вектора (n1, n2, n3, n4, n5) и будет использована для мониторинга и определения инцидентов производительности СУБД .

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

Простейшим скриптом с помощью cron, на сервере СУБД регулярно , рассчитывается метрика CPI, сохраняется в сервисной таблице и передается для мониторинга. Для сглаживания шума и выбросов данные для мониторинга сглаживаются.

Для отрисовки графиков используются медианное сглаживание по промежуткам 10 минут и 1 час.

В результате получается графическая картина состояния производительности СУБД:

Нормальная работа СУБД : cиний график - короткая скользящая, красный - долгая скользящая.

Нормальная работа СУБД : cиний график — короткая скользящая, красный — долгая скользящая.

Пример решения инцидента деградации производительности СУБД

Аномалия «сдвиг» на графике мониторинга производительности СУБД

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

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

Задача — установить причину падения производительности СУБД.

Шаг 1 - Уточнить временные точки инцидента

На графике мониторинга практически невозможно определить точное время начала инцидента. Для этого используются данные по скользящим загруженным в Excel, для наглядности .

Короткая - длинная скользящая

Короткая — длинная скользящая

  • 11:10 — 12:58 — Нормальная производительности

  • 12:58 — 13:08 — Инцидент деградации производительности

  • 13:08 — 14:20 — Производительности деградировала — есть проблема .

Шаг 2 - Подтверждение наличия деградации производительности

Необходимо исключить причину снижения производительности СУБД в силу снижения нагрузки на СУБД. Или другими словами — проверить , что снижение количества активных сессий не привело к снижению производительности (это не инцидент). А вот увеличение количества активных (а значить и сессий не только выполняющих запрос, но и ожидающих освобождение какого либо ресурса) сессий и снижение объемов обработанной информации за единицу времени это явный признак наличия проблемы.

Рассчитав коэффициент корреляции между значениями метрики CPI и сглаженными значениями количеств активных сессий (Active connections) обнаруживается:

  • 11:10 — 12:58 — Нормальная производительности : Слабая прямая корреляция между значениями CPI и Active connections

  • 12:58 — 13:08 — Инцидент деградации производительности: Сильная обратная корреляция между значениями CPI и Active connections

  • 13:08 — 14:20 — Производительности деградировала: Очень слабая обратная корреляция между значениями CPI и Active connections

Гипотеза — увеличение количеств ожиданий СУБД в период 12:58 — 13:08, привело к инциденту производительности СУБД .

Шаг 3 - Установление корреляции между событиями ожидания и падением производительности СУБД

Рассчитываем коэффициенты корреляции между событиями ожидания и метрикой CPI.

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

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

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

Гипотеза — наибольшее влияние на производительность СУБД оказывают события ожидания с наибольшим отрицательным значением коэффициента корреляции.

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

Шаг 4 - определение активных сессий оказывающих наибольшее отрицательное влияние на производительность СУБД.

Далее уже вопрос , чисто технический — любым доступным способом получаем выборку из истории значений системного представления pg_stat_activity и обращаем особое внимание на сессии с wait_event_type = 'Lock' и wait_event = 'transactionid'.

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

В данном случае — причина была в использовании запросов select 1 * from *** limit * for update .

Итог

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

Использование корреляционного анализа позволяет резко сузить круг гипотез при поиске причин снижения производительности СУБД.

© Habrahabr.ru