Постгреsql. Плохие Запросы, Примеры И Их Поиск

При устранении неполадок в RDBM разработчик обычно подозревает медленные запросы.

А что, если это не они? О том, какие типы запросов создают нагрузку на базу данных, не давая вашему приложению работать корректно, администратор базы данных Data Egret Андрей Сальников рассказал в своем докладе на конференции Saint HighLoad++ Online 2020. Он рассказал, как бэкенд-разработчик может идентифицировать такие запросы и какой инструмент лучше для этого использовать.

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



ПостгреSQL. Плохие запросы, примеры и их поиск

До момента всеобщей изоляции Data Egret поддерживала сервис, на котором основная база данных проводила около 50 тысяч транзакций в секунду.



ПостгреSQL. Плохие запросы, примеры и их поиск

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

Количество транзакций, обрабатываемых базой данных после переезда, подскочило выше 100 тысяч в секунду, и это только на Мастер-Сервере.



ПостгреSQL. Плохие запросы, примеры и их поиск



Что было сделано

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

Казалось бы, все работает хорошо: итоговая онлайн-загрузка, поступающая на сервис, за это время выросла в три раза.

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

Дело в том, что нагрузка на чтение базы данных распределяется между несколькими, поэтому нагрузка на запись, характерная для базы данных Мастер-Сервера, растет слабо при большом увеличении онлайн-активности на сервисе.

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

В первую очередь компания обратилась к данным мониторинга:

  • Среднее время выполнения запроса уменьшилось на 10 мс по сравнению с предыдущим оборудованием и предыдущей рабочей нагрузкой;
  • Сетевой трафик практически не изменился;
  • Количество запросов увеличилось.

    Использование ресурсов трудно оценить, поскольку поменялось оборудование, и трудно дать однозначную оценку, больше или меньше ресурсов используется в такой ситуации;

  • Оценить изменение параметров сервера не удалось.

Кажется, все в порядке.

Но проблема осталась нерешенной.

Поскольку мы говорим о базе данных, необходимо было посмотреть, что изменилось с профилем нагрузки на базу данных, и что произошло с запросами.

Мониторинг не дал результатов.

Но есть и другие инструменты.

Например, пг_ стат_ заявления.

В Data Egret этот инструмент используется постоянно, так как у него есть три приятных бонуса:

  1. Исторические отчеты обновляются каждый день;
  2. стр_ статистика _statements регистрирует абсолютно всё, включая частые запросы.

    В отличие от pgBadger, который зависит от настроек;

  3. Вы можете оценить влияние запросов на ресурсы сервера и соответственно на базу данных, поскольку база данных использует ресурсы сервера (дисковую память и процессорное время).

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

ПостгреSQL. Плохие запросы, примеры и их поиск

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

Вот общее количество запросов: 3,555,539,206 (уникальные: 2268).

Существует специальная позиция Other, в которую группируются запросы, не дающие значительной нагрузки на базу данных: вызовы: 1,977,858,485 (43,42%) avg_time: 0,06 мс (IO: 33,3%).

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

Последних почти 2 миллиарда.

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

Эта фотография была до начала режима самоизоляции.

Все остальные запросы в отчете выглядят примерно так: ВЫБЕРИТЕ поле1, поле2 ИЗ таблицы1 ГДЕ поле3 = ? и поле4 между? и ? Они просты: какая-то выборка по простым условиям, иногда 1-2 объединения — ничего сверхъестественного, что могло бы навредить базе данных и требует нашего расследования.

После роста онлайн отчет изменился:

ПостгреSQL. Плохие запросы, примеры и их поиск



Что изменилось с начала самоизоляции?

  • Время запроса сократилось


ПостгреSQL. Плохие запросы, примеры и их поиск

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

В старом на это ушло 90 часов, в новом - 60. Получается, что база данных стала тратить меньше времени на запросы.

Вы можете использовать этот рисунок в качестве руководства.

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

  • Количество запросов увеличилось


ПостгреSQL. Плохие запросы, примеры и их поиск

Общее количество запросов, поступивших в базу данных, значительно возросло (примерно в 1,5 раза).

Это можно увидеть на графиках.

  • Отсутствие пропорций
Если сравнивать позиции по запросам, не оказывающим существенного влияния на базу данных, то рост не столь пропорционален:

ПостгреSQL. Плохие запросы, примеры и их поиск

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

Это значит, что что-то изменилось в нагрузке на базу данных, и вам нужно смотреть отчет дальше.



Давайте посмотрим глубже

Просматривая отчет, мы прокрутили вниз до позиции 17 и увидели запрос, который был вызван 1,5 миллиарда раз и выглядел как SELECT 1:

ПостгреSQL. Плохие запросы, примеры и их поиск

По сути, это пинг подключения к базе данных, который отправляется до того, как приложение или пул отправит туда запрос.

Казалось бы, запрос почти не тратит ресурсов, лишь немного процессорного времени.

Но на самом деле он может сыграть плохую роль.

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



ПостгреSQL. Плохие запросы, примеры и их поиск

В результате SELECT 1, являясь стандартным пингом соединения, в то же время приводит к отрицательным результатам.

Ведь на момент этого пинга мы:

  • Мы теряем возможность использовать эту связь для действительно полезного запроса;
  • Создаём дополнительную нагрузку на CPU (ресурсы сервера базы данных);
  • У нас есть дополнительная нагрузка на сеть, поскольку нам нужно связаться между серверной частью приложения и базой данных, чтобы узнать, что произошло и доступна ли база данных.

    Это глупая трата ресурсов.

На самом деле произошло следующее: при переносе приложения потерялся патч на ORM, который немного отсекал такие пинги.



После правок

Посмотрим на график количества транзакций после внесения изменений в ORM:

ПостгреSQL. Плохие запросы, примеры и их поиск

Выглядит не очень впечатляюще.

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



ПостгреSQL. Плохие запросы, примеры и их поиск

Также можно отслеживать результат по общей загрузке:

ПостгреSQL. Плохие запросы, примеры и их поиск

До 4 апреля приложение имело непропатченную ORM. После этого пика в 100 тысяч транзакций больше не было.

База данных выделяется только для полезных запросов, которые необходимо выполнить.

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

Однако оно есть.

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

Приложение ждет, пока не пройдут все пинги.

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

Сначала была волна пингов, потом вы запустили обычный запрос.

SELECT 1 — реальный случай.

На его месте могут быть более простые запросы.

Например, в ситуации, когда вам нужно прочитать справочники, чтобы нарисовать веб-форму.

Несмотря на то, что они предоставляют полезную информацию, она никогда не меняется.

Желательно кэшировать его на внутренней стороне, а не обращаться за ним к базе данных.

Маленькие запросы могут принести большие проблемы, которые могут быть не сразу заметны.

Мы говорили о быстрых запросах.

Теперь перейдем к мертвецам.



Живые и мертвые

В какой-то момент сервер базы данных внезапно начал использовать много процессорного времени.

Этот вариант более тривиален с точки зрения расследования — далеко копать не надо:

ПостгреSQL. Плохие запросы, примеры и их поиск

План действий тот же:

  • Изучаем мониторинг;
  • Смотрим статистику в pg_ стат_ заявления;
  • Исправляем;
  • Рассказываем об обнаруженной проблеме разработчикам.

Как сейчас выглядит отчет?

ПостгреSQL. Плохие запросы, примеры и их поиск

В верхнем положении дается самая большая нагрузка.

Исключение составляют другие, где вся оставшаяся нагрузка, не топовая, аккумулируется.

Он может находиться в любой позиции отчета.

Сразу видим поз:1 общее время: 02:05:26 (20,3%, Процессор: 38,6% , ИО: 2,0%).

На этот запрос база данных тратит 38% процессорного времени.

Допустим, мы с определенной периодичностью ищем в платежной системе последние транзакции, созданные для каждого платежного сервиса отдельно: выбрать отдельный на (платеж система), * из порядка транзакций по созданным по убыванию; В этой ситуации запрос виден сразу, и вам не придется листать отчет, как в предыдущем примере.

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

Исправление будет выглядеть так:

ПостгреSQL. Плохие запросы, примеры и их поиск

Из маленького запроса, занимающего 1 с, получаем большой запрос, занимающий 2 мс.

Идем в комнату разработчиков и просим их переписать запрос.

Мы разворачиваемся, и ситуация возвращается в норму.



ПостгреSQL. Плохие запросы, примеры и их поиск

Сообщить о странице_ статистика _statements позволяет нам быстро находить запросы, которые портят нам жизнь.



Инструменты

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



pgBadger

Плюсы:
  • Полная информация обо всех запросах;
  • Красивые картинки.

Вы можете увидеть pgBadger в действии на странице тестовая страница .

Минусы:

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



pg_stat_statements

Плюсы:
  • Стандартное расширение PostgreSQL, поставляется сразу из коробки;
Независимо от того, какую операционную систему вы используете, в наборе стандартных пакетов всегда есть pg_. стат_ заявления.

Вам просто нужно установить его в PostgreSQL, дополнительно подключив загрузку библиотеки pg_ стат_ заявления.

  • Собирает информацию по всем запросам;
  • Группирует одинаковые запросы;
  • Вы можете сбросить статистику;
  • Вы можете сделать свой собственный отчет на основе pg_ стат_ заявления.

Минусы:
  • Накладные расходы на выполнение запроса 2-5%;
  • Запросы анонимны;
Чтобы разобраться с запросом, вам все равно придется включить логирование в PostgreSQL и брать из логов запрос с параметрами, которые нужно подставить.

  • Несущественные запросы отбрасываются;
  • Практически нет систем мониторинга, способных с ним работать;
  • Не видит разницы между SELECT. и SELECT. FOR UPDATE;
  • В необработанном виде данные трудны для понимания.

В мониторинге картина по одному запросу выглядит так:

ПостгреSQL. Плохие запросы, примеры и их поиск

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



Типичные проблемы

С какими проблемными запросами можно столкнуться на практике? Давайте рассмотрим самые распространенные из них.

  • Результат запроса нигде не используется;
Это может произойти, если код стал неактуален и бэкенды забыли отключить.

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

  • Неоптимально выполняющийся запрос;
Например, различимый.

  • Постоянное обращение к справочникам;
Такая ситуация может возникнуть, когда мы постоянно обращаемся к гендерному справочнику, где у нас всего две позиции.

  • Отсутствие индексов для простых запросов;
Что-то развернули, но индекс забыли.

Это можно увидеть в отчете и исправить.

  • Смешивание рабочих нагрузок OLTP и OLAP на репликах.

Эта проблема связана с общением между разработчиками и бизнес-экспертами.

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

Потому что если отчет выполняется 2 часа, то информация в нем устарела уже на 2 часа.

Соответственно, когда одного сервера недостаточно, нагрузку OLTP и OLAP необходимо разделить между разными серверами.

Длинные отчеты начинают тормозить воспроизведение валов на реплике, из-за чего она отстает от мастера.

Если мы включим hot_standby_feedback, реплика больше не будет лагать.

Но тем самым мы нагрузим внутренние механизмы базы данных и получим удар по производительности на всех серверах баз данных, пытаясь совместить нагрузку OLAP + OLTP на сервере-реплике с включенным hot_standby_feedback. Не путайте причины проблем с запросами и длительными транзакциями базы данных.

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

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



ПостгреSQL. Плохие запросы, примеры и их поиск

Выглядит это так: есть долго выполняющиеся транзакции, которые длятся 30-40 минут, и в то же время есть миллисекундные всплески запросов.



ПостгреSQL. Плохие запросы, примеры и их поиск

Если мы посмотрим на статус соединения в базе данных в это время, то увидим множество простаивающих соединений (они отмечены желтым цветом):

ПостгреSQL. Плохие запросы, примеры и их поиск

простоя в транзакции — это соединение, когда приложение открыло транзакцию в базе данных, выполнило один запрос и занялось своими делами, забыв закрыть транзакцию.

По сути, это основная причина многих проблем.

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



Вместо заключения

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

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

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

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

Конференция HighLoad++ 2020 пройдет 20 и 21 мая 2021 года.

Купить билеты ты можешь сделать это сейчас.

Хотите получить бесплатные материалы с мини-конференции Saint HighLoad++ 2020? Подписаться в нашу рассылку.

И мы приветствуем тех, кто интересуется миром Java на онлайн-встреча Luxoft TechFest #2: Java с Ontico. Поговорим о приватных константных полях в Jira, неочевидных нюансах Java Reactive Stack и работе с распределенным кешем.

А после выступлений звезды митапа ответят на ваши самые актуальные вопросы.

До встречи 10 февраля в 19:00 по мск.

Теги: #базы данных #Администрирование баз данных #postgresql #highload #запросы #rdbms
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.