Функции интроспекции
Вы можете использовать функции, описанные в этой главе, для интроспекции 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) — Адрес инструкции в запущенном процессе.
Возвращаемое значение
Пример
Включение функций интроспекции:
Выбор первой строки из системной таблицы trace_log:
Поле trace содержит трассировку стека в момент выборки.
Получение символа для одного адреса:
Применение функции ко всей трассировке стека:
Функция arrayMap позволяет обрабатывать каждый отдельный элемент массива trace с помощью функции addressToSymbols. Результат этой обработки вы видите в столбце 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.
Пример
Запрос:
Результат: