Для сглаживания данных используется медианное сглаживание:
Долгая скользящая: 1 час(красная линия).
Короткая скользящая: 10 минут(синяя линия).
Активные соединения и утилизация CPU: стандартные метрики Zabbix.
Как видно из графика - имеет место деградация производительности СУБД:
Количество активных сессий растет, но производительность падает
Утилизация CPU растет , но производительность падает
Ситуация, принципиально отличается от описанной в казалось бы похожем кейсе:
CPU Utilization = 100%. Это проблема СУБД? / Хабр (habr.com)
Поэтому и решаться данный инцидент будет по другому.
Использование статистического анализа
1.Выделение трендов на графике производительности
Выполняется тривиально, дополнительных инструментов не требуется.
13:00 - 13:28 : Горизонтальный тренд - высокая производительность
13:28 - 13:47 : Деградация производительности
13:57 - 14:05 : Горизонтальный тренд - низкая производительность. Нагрузка на СУБД уменьшилась.
13:00 - 13:28 : Горизонтальный тренд - высокая производительность
Статистические показатели производительности СУБД
Прямая корреляция между количество активных сессий и производительностью СУБД . Или другими словами - чем выше нагрузка на СУБД , тем выше производительность.
Статистические показатели ожиданий СУБД - корреляция ожиданий и производительности СУБД
Количество пользовательских запросов по которым имеются события ожидания СУБД - минимально.
13:28 - 13:47 : Деградация производительности
Статистические показатели производительности СУБД
Сильная обратная корреляция - чем выше нагрузка на СУБД тем ниже производительность. Явный признак инцидента производительности СУБД
Статистические показатели ожиданий СУБД - корреляция ожиданий и производительности СУБД
Как видно из таблицы - количество ожиданий кардинально увеличилось. Явный признак - имеются серьезные проблемы с производительностью СУБД.
2.Определение наиболее значимой причины деградации производительности СУБД
Из Рис.4 видно, что наибольшая обратная корреляция между событиями ожидания и снижением производительности СУБД имеется для события LWLock / BufferMapping
Как видно - количество ожиданий менее чем за 20 минут - весьма существенно.
Итак, первый результат
Первой( но конечно не единственной) причиной деградации производительности СУБД в период 13:28 - 13:47 является - большое количество ожиданий LWLock / BufferMapping при выполнении пользовательских запросов.
2.1. Определение SQL запросов с наибольшим количеством ожиданий LWLock / BufferMapping
Чуть подробнее об ожидании
|
Ожидание при связывании блока данных с буфером в пуле буферов. |
LWLock - buffer_mapping
This event occurs when a session is waiting to associate a data block with a buffer in the shared buffer pool.
Context
The shared buffer pool is an PostgreSQL memory area that holds all pages that are or were being used by processes. When a process needs a page, it reads the page into the shared buffer pool. The shared_buffers
parameter sets the shared buffer size and reserves a memory area to store the table and index pages. If you change this parameter, make sure to restart the database. For more information, see Shared Buffer Area.
The buffer_mapping
wait event occurs in the following scenarios:
A process searches the buffer table for a page and acquires a shared buffer mapping lock.
A process loads a page into the buffer pool and acquires an exclusive buffer mapping lock.
A process removes a page from the pool and acquires an exclusive buffer mapping lock.
LWLock - buffer_mapping | Redrock Postgres Documentation (rockdata.net)
3. Определение запросов с максимальным количество ожиданий
Далее, дело техники, используя утилиту pgpro_pwr по queryid, находим проблемный запрос за период 13:30 - 13:50(снимки pgpro_pwr формируются каждые 10 минут):
select
this_.id as id1_13_0_,
this_.application_name as applicat2_13_0_,
this_.assignment_snapshot as assignme3_13_0_,
this_.event_type as event_ty4_13_0_,
this_.start_date as start_da5_13_0_,
this_.parent_oid as parent_o6_13_0_,
this_.reason_data as reason_d7_13_0_,
this_.reason_key as reason_k8_13_0_,
this_.reason_ref as reason_r9_13_0_,
this_.reason_request_business_id as reason_10_13_0_,
this_.reason_request_id as reason_11_13_0_,
this_.requester_full_name as request12_13_0_,
this_.requester_oid as request13_13_0_,
this_.role as role14_13_0_,
this_.role_oid as role_oi15_13_0_,
this_.target_oid as target_16_13_0_,
this_.timestamp as timesta17_13_0_,
this_.end_date as end_dat18_13_0_,
this_.type as type19_13_0_
from
report_role_history_item this_
where
(this_.target_oid in ($1) or this_.parent_oid in ($2))
order by this_.timestamp desc limit $3
Запрос передается разработчикам , для анализа .
Дальнейшие события ожидания анализируются схожим образом. Если отсортировать таблицу Рис.4. по количеству пользовательских запросов(более 100) , то можно и нужно сформировать список проблемных запросов для передачи группе разработки на оптимизацию и доработку.
Итог
Статистический анализ производительности СУБД позволяет подтвердить наличие деградации производительности не дожидаясь деградации на уровне приложения.
Корреляционный анализ ожиданий и производительности СУБД позволяет быстрее определить корневую причину снижения производительности СУБД и определить список проблемных пользовательских запросов.
Комментарии (5)
Sshumeev
10.10.2024 15:53Добрый день! В чем измеряется производительность системы ? CPI это что ?
rinace Автор
10.10.2024 15:53Спасибо за комментарий.
В настоящее время производительность СУБД рассчитывается как отношение скорости выполнения операций к объемной скорости обработанных блоков.
Скорость выполнения операций(Операционная скорость) = модуль вектора ( QPS , TPS , RPS ) , где:
QPS - количество завершенных операций в секунду
TPS - количество зафиксированных транзакций в секунду
RPS - количество выданных строк в секунду
Объемная скорость = модуль вектора ( SWS , SRS , SDS , LWS , LRS , LDS , TWS , TRS ), где:
SWS - число разделяемых блоков, записанных в секунду
SRS - число разделяемых блоков, прочитанных в секунду
SDS - число разделяемых блоков, загрязнённых в секунду
LWS - число локальных блоков, записанных в секунду
LRS - число локальных блоков, прочитанных в секунду
LDS - число локальных блоков, загрязнённых в секунду
TWS - число временных блоков, записанных в секунду
TRS - число временных блоков, прочитанных в секунду
Отношение Операционной скорости к Объемной скорости и используется в качестве значения метрики CPI .
Модуль вектора , рассчитывается как модуль вектора в Евклидовом пространстве.
Есть предложение использовать " Манхэттенская метрика " , пока на этапе анализа.
rinace Автор
10.10.2024 15:53
postgrez4ik
Не совсем понимаю, почему минусуют статью - может из-за того, что где-то только с середины становиться понятно, что речь о ПосгресПро. А может за то, что разрабам просто передали запросы, без предложений по оптимизации.
postgrez4ik
И мне два минуса за что-то вкатали((