Функции интроспекции
Вы можете использовать функции, описанные в этой главе, для интроспекции ELF и DWARF для профилирования запросов.
Эти функции медленные и могут вызывать проблемы с безопасностью.
Для корректной работы функций интроспекции:
-
Установите пакет
clickhouse-common-static-dbg
. -
Установите настройку allow_introspection_functions на 1.
По соображениям безопасности функции интроспекции по умолчанию отключены.
ClickHouse сохраняет отчеты профилировщика в системной таблице trace_log. Убедитесь, что таблица и профилировщик настроены правильно.
addressToLine
Преобразует виртуальный адрес памяти в процессе сервера ClickHouse в имя файла и номер строки в исходном коде ClickHouse.
Если вы используете официальные пакеты ClickHouse, вам нужно установить пакет clickhouse-common-static-dbg
.
Синтаксис
Аргументы
address_of_binary_instruction
(UInt64) — Адрес инструкции в запущенном процессе.
Возвращаемое значение
- Имя файла исходного кода и номер строки в этом файле, разделённые двоеточием.
Например,
/build/obj-x86_64-linux-gnu/../src/Common/ThreadPool.cpp:199
, где199
— это номер строки. - Имя бинарного файла, если функция не смогла найти отладочную информацию.
- Пустая строка, если адрес не является допустимым.
Тип: String.
Пример
Включение функций интроспекции:
Выбор первой строки из системной таблицы trace_log
:
Поле trace
содержит стек вызовов в момент выборки.
Получение имени файла исходного кода и номера строки для единственного адреса:
Применение функции ко всему стеку вызовов:
Функция arrayMap позволяет обрабатывать каждый отдельный элемент массива trace
с помощью функции addressToLine
. Результат этой обработки вы видите в колонке trace_source_code_lines
вывода.
addressToLineWithInlines
Подобно addressToLine
, но возвращает массив со всеми встроенными функциями. В результате этого она медленнее, чем addressToLine
.
Если вы используете официальные пакеты ClickHouse, вам нужно установить пакет clickhouse-common-static-dbg
.
Синтаксис
Аргументы
address_of_binary_instruction
(UInt64) — Адрес инструкции в запущенном процессе.
Возвращаемое значение
- Массив, первый элемент которого — имя файла исходного кода и номер строки в файле, разделённые двоеточием. Со второго элемента и далее перечислены имена файлов исходного кода встроенных функций, номера строк и имена функций. Если функция не смогла найти отладочную информацию, то возвращается массив с единственным элементом, равным имени бинарного файла, в противном случае возвращается пустой массив, если адрес не является допустимым. Array(String).
Пример
Включение функций интроспекции:
Применение функции к адресу.
Применение функции ко всему стеку вызовов:
Функция arrayJoin разделит массив на строки.
addressToSymbol
Преобразует виртуальный адрес памяти в процессе сервера ClickHouse в символ из объектных файлов ClickHouse.
Синтаксис
Аргументы
address_of_binary_instruction
(UInt64) — Адрес инструкции в запущенном процессе.
Возвращаемое значение
- Символ из объектных файлов ClickHouse. String.
- Пустая строка, если адрес не является допустимым. String.
Пример
Включение функций интроспекции:
Выбор первой строки из системной таблицы trace_log
:
Поле trace
содержит стек вызовов в момент выборки.
Получение символа для единственного адреса:
Применение функции ко всему стеку вызовов:
Функция arrayMap позволяет обрабатывать каждый отдельный элемент массива trace
с помощью функции addressToSymbol
. Результат этой обработки вы видите в колонке trace_symbols
вывода.
demangle
Преобразует символ, который можно получить с помощью функции addressToSymbol, в имя функции C++.
Синтаксис
Аргументы
symbol
(String) — Символ из объектного файла.
Возвращаемое значение
- Имя функции C++, или пустая строка, если символ недействителен. String.
Пример
Включение функций интроспекции:
Выбор первой строки из системной таблицы trace_log
:
Поле trace
содержит стек вызовов в момент выборки.
Получение имени функции для одного адреса:
Применение функции ко всему стеку вызовов:
Функция arrayMap позволяет обрабатывать каждый отдельный элемент массива trace
с помощью функции demangle
. Результат этой обработки вы видите в колонке trace_functions
вывода.
tid
Возвращает идентификатор потока, в котором обрабатывается текущий Block.
Синтаксис
Возвращаемое значение
- Текущий идентификатор потока. Uint64.
Пример
Запрос:
Результат:
logTrace
Вызывает сообщение журнала трассировки для каждой Block.
Синтаксис
Аргументы
message
— Сообщение, которое выводится в журнал сервера. String.
Возвращаемое значение
- Всегда возвращает 0.
Пример
Запрос:
Результат: