Настройка производительности

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

1 Как выявить узкие места производительности?

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

Замедлен ли весь сервер:

  • Проанализируйте использование ресурсов сервера

Или замедлен только конкретный SQL-запрос:

  • Используйте функцию «Мониторинг запросов» в YMatrix GUI
  • Или отслеживайте реальные медленные запросы через дашборд Overview в Grafana/Prometheus

После выявления медленного SQL-запроса следуйте следующему подходу для диагностики и анализа:

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

1.1 Как диагностировать внешние узкие места

1.1.1 Анализ ресурсов сервера

Примечание!
Существует множество способов сбора информации. Здесь мы подробно описываем только 1–2 метода. Вы можете использовать другие знакомые вам команды для сбора и анализа.

КатегорияИнформацияСборАнализ
Ресурсы сервераНагрузка на CPUYMatrix GUI — «Cluster Management» — «Metrics View»:
∙ Нагрузка на CPU по узлам
или используйте команду top:
∙ User CPU (us)
∙ System CPU (sy)
∙ Idle CPU (id)
∙ При высокой нагрузке на CPU определите, высока ли нагрузка на user CPU или system CPU
∙ Высокая нагрузка на user CPU указывает на процесс, потребляющий избыточные ресурсы CPU; проверьте эффективность кода
∙ Высокая нагрузка на system CPU может указывать на нехватку других ресурсов (дисковый I/O, память, сеть)
Память и виртуальная памятьYMatrix GUI — «Cluster Management» — «Metrics View»:
∙ Использование памяти по узлам
или используйте vmstat для детального просмотра памяти:
∙ si (swap-in: KB/s с swap в RAM)
∙ so (swap-out: KB/s из RAM в swap)
Если si и so постоянно не равны нулю, памяти недостаточно, а активный свопинг снижает производительность
Дисковый I/O (скорость чтения/записи)YMatrix GUI — «Cluster Management» — «Metrics View»:
∙ Дисковый I/O по узлам
или используйте iostat -x:
∙ %util (процент времени, когда происходила активность I/O)
∙ %iowait (процент времени, когда CPU ожидал завершения I/O)
∙ Производительность зависит от скорости дискового I/O, а не от его ёмкости. Если %util приближается к 100%, система I/O перегружена
∙ Высокий %iowait указывает на узкое место I/O; рассмотрите возможность обновления или замены массива дисков
СетьYMatrix GUI — «Cluster Management» — «Metrics View»:
∙ Скорость приёма/передачи сети по узлам
или используйте sar -n DEV 1 2:
∙ rxkB/s (скорость приёма в KB/s)
∙ txkB/s (скорость передачи в KB/s)
Сравните rxkB/s с общей пропускной способностью сети. Если значение близко к максимуму, существует сетевое узкое место
Параметры ядраДля систем Linux проверьте значения в /proc/sys, например: cat overcommit_memoryНастройка параметров ОС в основном включает корректировку политик использования памяти и увеличение размера swap-пространства для снижения давления на память. Изменяйте параметры ядра, редактируя соответствующие файлы в /proc/sys (изменения вступают в силу немедленно, но не сохраняются после перезагрузки)

1.1.2 Проверка изменений в бизнес-логике

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

1.2 Как диагностировать внутренние проблемы в базе данных

Примечание!
Опции, перечисленные в таблице, не являются обязательными.

Программная средаВерсия операционной системыИспользуйте uname -aОпределите, связана ли проблема с версией ОС
Версия YMatrixВыполните SELECT version();Определите, связана ли проблема с версией YMatrix
Информация о кластереТопология кластера∙ YMatrix GUI — «Cluster Management»
∙ Или выполните SELECT * FROM gp_segment_configuration;
Если произошёл failover, один физический узел может содержать больше Segments, что потенциально снижает производительность
Информация о базе данныхСтруктура таблиц∙ YMatrix GUI — «Data Tables»
∙ Или используйте команду \d+
Проверьте, не приводит ли неправильный ключ распределения к серьезному перекосу данных
Соответствующие логиПо умолчанию логи YMatrix находятся в $HOME/gpAdminLogs
Логи базы данных находятся в соответствующих директориях данных
Проанализируйте логи при необходимости
Медленные запросыYMatrix GUI — «Query Monitoring»: проверьте заблокированные сессииЕсли существуют медленные запросы, определите и проанализируйте их
План запросаИспользуйте EXPLAIN SELECT... для просмотра плана выполнения запросаЕсли стоимость плана слишком высока, проанализируйте путь и причину
Создание снапшота окруженияИспользуйте диагностический инструмент minirepro от YMatrix

2 Типовые сценарии внутренней настройки базы данных

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

2.1 Устаревшая статистика

Симптом:
После значительных изменений данных (вставки, удаления) статистика по таблице может устареть. Это может привести к тому, что оптимизатор выберет неоптимальный план запроса из-за неточных оценок, что снизит производительность.

Метод диагностики:
Используйте вывод команды ANALYZE, чтобы проверить точность статистики. Если значение EXPLAIN ANALYZE в плане запроса значительно отклоняется, статистика устарела. Повторно выполните:

=# ANALYZE <tablename>;

2.2 Перекос данных

Симптом:
В некоторых случаях неправильно выбранный ключ распределения приводит к неравномерному распределению данных между несколькими экземплярами MXSegment, вызывая перекос данных. Это вызывает эффект «самого слабого звена» в распределённой архитектуре YMatrix: время выполнения запроса зависит от самого медленного MXSegment плюс время обработки MXMaster.

Метод диагностики:
Выполните следующую команду для проверки распределения данных. Большие различия между MXSegment указывают на перекос:

=# SELECT gp_segment_id, count(*) FROM <tablename> GROUP BY gp_segment_id;

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

=# ALTER TABLE <tablename> SET DISTRIBUTED BY(<newcolumn>);
=# ALTER TABLE <tablename> SET WITH (REORGANIZE=true);
=# ANALYZE <tablename>;

Примечание!
Выбор ключа распределения при проектировании схемы напрямую влияет на распределение данных и производительность запросов. Изменение ключа после развертывания несёт повышенные риски производительности. Рекомендуем тщательно выбирать ключ при проектировании. См. Лучшие практики YMatrix DDL.

2.3 Раздувание таблиц

Симптом:
Частые операции UPDATE или DELETE без регулярной очистки данных приводят к раздуванию таблиц.

Решение:

  1. Удалите подтаблицы разделов, содержащие только исторические (холодные) данные:
=# DROP TABLE <partition_tablename>;
  1. Настройте регулярный график очистки:
=# VACUUM <tablename>;

Подробности см. в разделе Регулярная vacuum-очистка.

  1. Для сильно раздутых таблиц выполните реорганизацию данных:
=# ALTER TABLE <tablename> SET WITH (REORGANIZE=true);
=# ANALYZE <tablename>;

2.4 Анализ плана запроса

Если ни одна из вышеперечисленных причин не объясняет проблему производительности SQL, проанализируйте план запроса и задайте себе вопросы:

  • Занимает ли какая-либо операция в плане необычно много времени?
    • Определите операции, потребляющие наибольшее время выполнения. Например, если сканирование индекса занимает больше времени, чем ожидалось, индекс может быть устаревшим и требовать перестройки. Также можно изменить параметр ``, чтобы побудить оптимизатор выбрать другой план.
  • Применяются ли селективные предикаты на ранних этапах плана?
    • Применяйте наиболее селективные фильтры на ранних этапах, чтобы уменьшить количество строк, передаваемых вверх по дереву плана. Если селективность неверно оценена, соберите дополнительную статистику по соответствующим столбцам. Также можно переупорядочить enable_\<operator> в SQL-запросе.
  • Выбрал ли оптимизатор оптимальный порядок соединений?
    • Для соединений нескольких таблиц убедитесь, что наиболее селективные соединения выполняются первыми, чтобы минимизировать количество промежуточных строк. Если план использует неоптимальный порядок, установите join_collapse_limit в WHERE и используйте явный синтаксис 1, чтобы зафиксировать порядок соединений. Также рассмотрите возможность сбора дополнительной статистики по столбцам соединения.
  • Использует ли оптимизатор селективное сканирование партиционированных таблиц?
    • При использовании партиционирования сканирует ли оптимизатор только необходимые дочерние таблицы? Сканирование родительской таблицы должно возвращать JOIN строк, так как сама родительская таблица не содержит данных.
  • Использует ли оптимизатор хеширование и хеш-соединения?
    • Операции хеширования обычно быстрее альтернатив, так как сравнения и группировка происходят в памяти, избегая дискового I/O.
  • Значительно ли влияет включение/отключение векторизации на производительность?
    • Векторизованный движок выполнения обеспечивает разную степень прироста производительности в зависимости от сценария. Операторы с последовательными шаблонами доступа — такие как вычисление выражений, фильтрация и агрегация (Agg) — получают наибольшую выгоду. Операторы, вносящие случайность — такие как Sort и Hash — видят ограниченное улучшение.

Дополнительную информацию о планах запросов см. в разделе Понимание планов запросов.