Выборочный профилировщик запросов
В ClickHouse работает выборочный профилировщик, который позволяет анализировать выполнение запросов. С помощью профилировщика можно определить процедуры исходного кода, которые чаще всего используются при выполнении запроса. Можно отслеживать затраты процессорного и реального времени, включая время бездействия.
Профилировщик запросов автоматически включен в ClickHouse Cloud. Следующий пример запроса находит наиболее частые стеки вызовов для профилируемого запроса с расшифрованными именами функций и расположением в исходном коде:
Замените значение query_id на идентификатор запроса, который нужно профилировать.
- ClickHouse Cloud
- Самоуправляемое
В ClickHouse Cloud идентификатор запроса можно получить, нажав "..." в крайней правой части панели над таблицей результатов запроса (рядом с переключателем таблица/чарт). Откроется контекстное меню, в котором можно нажать "Copy query ID".
Используйте clusterAllReplicas(default, system.trace_log), чтобы выполнить выборку со всех узлов кластера:
Использование профилировщика запросов в самоуправляемых развертываниях
Чтобы использовать профилировщик запросов в самоуправляемых развертываниях, выполните следующие шаги:
Установите ClickHouse с отладочной информацией
Установите пакет clickhouse-common-static-dbg:
- Следуйте инструкциям из шага "Настройте Debian-репозиторий"
- Выполните
sudo apt-get install clickhouse-server clickhouse-client clickhouse-common-static-dbg, чтобы установить бинарные файлы ClickHouse, скомпилированные с отладочной информацией - Выполните
sudo service clickhouse-server start, чтобы запустить сервер - Выполните
clickhouse-client. Отладочные символы из пакетаclickhouse-common-static-dbgбудут автоматически подхвачены сервером — ничего дополнительно включать не нужно
Проверьте конфигурацию сервера
Убедитесь, что раздел trace_log в вашем файле конфигурации сервера настроен. По умолчанию он включен:
Этот раздел настраивает системную таблицу trace_log, содержащую результаты работы профилировщика. Помните, что данные в этой таблице корректны только для работающего сервера. После перезапуска сервера ClickHouse не очищает таблицу, и все сохраненные адреса виртуальной памяти могут стать недействительными.
Настройте таймеры профилирования
Настройте параметры query_profiler_cpu_time_period_ns или query_profiler_real_time_period_ns.
Оба параметра можно использовать одновременно.
Эти параметры позволяют настроить таймеры профилировщика. Поскольку это параметры сеанса, можно задать разную частоту выборки для всего сервера, отдельных пользователей или профилей пользователей, для интерактивного сеанса и для каждого отдельного запроса.
Частота выборки по умолчанию — один сэмпл в секунду, при этом включены таймеры CPU и реального времени. Такая частота позволяет собирать достаточно информации о вашем кластере ClickHouse, не влияя на производительность сервера. Если нужно профилировать каждый отдельный запрос, используйте более высокую частоту выборки.
Проанализируйте системную таблицу trace_log
Чтобы анализировать системную таблицу trace_log, разрешите функции интроспекции с помощью настройки allow_introspection_functions:
Из соображений безопасности функции интроспекции по умолчанию отключены
Используйте функции интроспекции addressToLine, addressToLineWithInlines, addressToSymbol и demangle из функций интроспекции, чтобы получить имена функций и их позиции в коде ClickHouse.
Чтобы получить профиль для некоторого запроса, нужно агрегировать данные из таблицы trace_log.
Можно агрегировать данные по отдельным функциям или по полным трассировкам стека.
Если вам нужно визуализировать информацию из trace_log, попробуйте flamegraph и speedscope.
Построение флеймграф с помощью функции flameGraph
ClickHouse предоставляет flameGraph — агрегатную функцию, которая строит флеймграф непосредственно по стекам вызовов, хранящимся в trace_log.
Результат представляет собой массив строк в формате, совместимом с flamegraph.pl.
Синтаксис:
Аргументы:
traces— стек вызовов.Array(UInt64).size— размер выделения памяти при профилировании памяти.Int64.ptr— адрес выделенной памяти.UInt64.
Если ptr не равен нулю, flameGraph сопоставляет выделения (size > 0) и освобождения (size < 0) с одинаковыми размером и адресом.
Показываются только те выделения, которые не были освобождены.
Освобождения, для которых не найдено соответствия, игнорируются.
Флеймграф CPU
Для выполнения приведённых ниже запросов необходимо, чтобы у вас был установлен flamegraph.pl.
Для этого выполните:
Замените flamegraph.pl в следующих запросах на путь к flamegraph.pl на вашей машине
Выполните запрос, затем постройте флеймграф:
Флеймграф памяти — все выделения
Выполните запрос, затем постройте флейм-граф:
Флейм-граф памяти — неосвобождённые выделения
В этом варианте выделения памяти сопоставляются с освобождениями по указателю, и отображается только память, которая не была освобождена во время выполнения запроса.
Выполните следующий запрос, чтобы построить флейм-граф:
Флеймграф памяти — активные выделения в определённый момент времени
Этот подход позволяет определить пиковое потребление памяти и визуализировать, что именно было выделено в этот момент.
Проследите использование памяти во времени
Найдите момент с максимальным использованием памяти
Постройте флеймграф активных аллокаций для этого момента времени
Постройте флеймграф освобождений памяти после этого момента (чтобы понять, что было освобождено позже)
Пример
Приведенный ниже фрагмент кода:
- Фильтрует данные
trace_logпо идентификатору запроса и текущей дате. - Агрегирует по стек-трейсу.
- Использует функции интроспекции, чтобы получить отчет о следующем:
- Именах символов и соответствующих им функциях исходного кода.
- Местоположениях этих функций в исходном коде.