Puede usar las funciones descritas en este capítulo para realizar la introspección de ELF y DWARF para el perfilado de consultas.
Para que las funciones de introspección funcionen correctamente:
-
Instale el paquete
clickhouse-common-static-dbg. -
Establezca el ajuste allow_introspection_functions en 1.
Por motivos de seguridad, las funciones de introspección están deshabilitadas de forma predeterminada.
ClickHouse guarda los informes del perfilador en la tabla del sistema trace_log. Asegúrese de que la tabla y el perfilador estén configurados correctamente.
addressToLine
Introducido en: v20.1.0
Convierte una dirección de memoria virtual dentro del proceso del servidor de ClickHouse en un nombre de archivo y un número de línea del código fuente de ClickHouse.
Para habilitar esta función de introspección:
- Instale el paquete
clickhouse-common-static-dbg. - Establezca el SETTING
allow_introspection_functionsen1.
Sintaxis
addressToLine(address_of_binary_instruction)Argumentos
address_of_binary_instruction— Dirección de la instrucción en un proceso en ejecución.UInt64
Valor devuelto
Devuelve el nombre de un archivo de código fuente y el número de línea, separados por dos puntos; por ejemplo, /build/obj-x86_64-linux-gnu/../src/Common/ThreadPool.cpp:199. Devuelve el nombre de un binario si no se encuentra información de depuración; en cambio, devuelve una cadena vacía si la dirección no es válida. String
Ejemplos
Selección de la primera cadena de la tabla del sistema trace_log
SET allow_introspection_functions=1;
SELECT * FROM system.trace_log LIMIT 1 FORMAT Vertical;-- The `trace` field contains the stack trace at the moment of sampling.
Row 1:
──────
event_date: 2019-11-19
event_time: 2019-11-19 18:57:23
revision: 54429
timer_type: Real
thread_number: 48
query_id: 421b6855-1858-45a5-8f37-f383409d6d72
trace: [140658411141617,94784174532828,94784076370703,94784076372094,94784076361020,94784175007680,140658411116251,140658403895439]Obtención del nombre del archivo de código fuente y del número de línea para una sola dirección
SET allow_introspection_functions=1;
SELECT addressToLine(94784076370703) FORMAT Vertical;Row 1:
──────
addressToLine(94784076370703): /build/obj-x86_64-linux-gnu/../src/Common/ThreadPool.cpp:199Aplicación de la función a toda la traza de pila
-- The arrayMap function in this example processing each individual element of the trace array by the addressToLine function.
-- The result of this processing is seen in the trace_source_code_lines column of output.
SELECT
arrayStringConcat(arrayMap(x -> addressToLine(x), trace), '\n') AS trace_source_code_lines
FROM system.trace_log
LIMIT 1
FORMAT Vertical;Row 1:
──────
trace_source_code_lines: /lib/x86_64-linux-gnu/libpthread-2.27.so
/usr/lib/debug/usr/bin/clickhouse
/build/obj-x86_64-linux-gnu/../src/Common/ThreadPool.cpp:199
/build/obj-x86_64-linux-gnu/../src/Common/ThreadPool.h:155
/usr/include/c++/9/bits/atomic_base.h:551
/usr/lib/debug/usr/bin/clickhouse
/lib/x86_64-linux-gnu/libpthread-2.27.so
/build/glibc-OTsEL5/glibc-2.27/misc/../sysdeps/unix/sysv/linux/x86_64/clone.S:97addressToLineWithInlines
Introducido en: v22.2.0
Similar a addressToLine, pero devuelve un Array con todas las funciones en línea.
Por ello, es más lenta que addressToLine.
Para habilitar esta función de introspección:
- Instale el paquete
clickhouse-common-static-dbg. - Establezca el ajuste
allow_introspection_functionsen1.
Sintaxis
addressToLineWithInlines(address_of_binary_instruction)Argumentos
address_of_binary_instruction— La dirección de una instrucción en un proceso en ejecución.UInt64
Valor devuelto
Devuelve un array cuyo primer elemento es el nombre del archivo de código fuente y el número de línea, separados por dos puntos. El segundo, tercer, etc. elemento enumera los nombres de archivo del código fuente, los números de línea y los nombres de las funciones en línea. Si no se encuentra información de depuración, se devuelve un array con un único elemento igual al nombre del binario; en cambio, si la dirección no es válida, se devuelve un array vacío. Array(String)
Ejemplos
Aplicación de la función a una dirección
SET allow_introspection_functions=1;
SELECT addressToLineWithInlines(531055181::UInt64);┌─addressToLineWithInlines(CAST('531055181', 'UInt64'))────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ ['./src/Functions/addressToLineWithInlines.cpp:98','./build_normal_debug/./src/Functions/addressToLineWithInlines.cpp:176:DB::(anonymous namespace)::FunctionAddressToLineWithInlines::implCached(unsigned long) const'] │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘Aplicación de la función a toda la traza de pila
SET allow_introspection_functions=1;
-- The arrayJoin function will split array to rows
SELECT
ta, addressToLineWithInlines(arrayJoin(trace) AS ta)
FROM system.trace_log
WHERE
query_id = '5e173544-2020-45de-b645-5deebe2aae54';┌────────ta─┬─addressToLineWithInlines(arrayJoin(trace))───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ 365497529 │ ['./build_normal_debug/./contrib/libcxx/include/string_view:252'] │
│ 365593602 │ ['./build_normal_debug/./src/Common/Dwarf.cpp:191'] │
│ 365593866 │ ['./build_normal_debug/./src/Common/Dwarf.cpp:0'] │
│ 365592528 │ ['./build_normal_debug/./src/Common/Dwarf.cpp:0'] │
│ 365591003 │ ['./build_normal_debug/./src/Common/Dwarf.cpp:477'] │
│ 365590479 │ ['./build_normal_debug/./src/Common/Dwarf.cpp:442'] │
│ 365590600 │ ['./build_normal_debug/./src/Common/Dwarf.cpp:457'] │
│ 365598941 │ ['./build_normal_debug/./src/Common/Dwarf.cpp:0'] │
│ 365607098 │ ['./build_normal_debug/./src/Common/Dwarf.cpp:0'] │
│ 365590571 │ ['./build_normal_debug/./src/Common/Dwarf.cpp:451'] │
│ 365598941 │ ['./build_normal_debug/./src/Common/Dwarf.cpp:0'] │
│ 365607098 │ ['./build_normal_debug/./src/Common/Dwarf.cpp:0'] │
│ 365590571 │ ['./build_normal_debug/./src/Common/Dwarf.cpp:451'] │
│ 365598941 │ ['./build_normal_debug/./src/Common/Dwarf.cpp:0'] │
│ 365607098 │ ['./build_normal_debug/./src/Common/Dwarf.cpp:0'] │
│ 365590571 │ ['./build_normal_debug/./src/Common/Dwarf.cpp:451'] │
│ 365598941 │ ['./build_normal_debug/./src/Common/Dwarf.cpp:0'] │
│ 365597289 │ ['./build_normal_debug/./src/Common/Dwarf.cpp:807'] │
│ 365599840 │ ['./build_normal_debug/./src/Common/Dwarf.cpp:1118'] │
│ 531058145 │ ['./build_normal_debug/./src/Functions/addressToLineWithInlines.cpp:152'] │
│ 531055181 │ ['./src/Functions/addressToLineWithInlines.cpp:98','./build_normal_debug/./src/Functions/addressToLineWithInlines.cpp:176:DB::(anonymous namespace)::FunctionAddressToLineWithInlines::implCached(unsigned long) const'] │
│ 422333613 │ ['./build_normal_debug/./src/Functions/IFunctionAdaptors.h:21'] │
│ 586866022 │ ['./build_normal_debug/./src/Functions/IFunction.cpp:216'] │
│ 586869053 │ ['./build_normal_debug/./src/Functions/IFunction.cpp:264'] │
│ 586873237 │ ['./build_normal_debug/./src/Functions/IFunction.cpp:334'] │
│ 597901620 │ ['./build_normal_debug/./src/Interpreters/ExpressionActions.cpp:601'] │
│ 597898534 │ ['./build_normal_debug/./src/Interpreters/ExpressionActions.cpp:718'] │
│ 630442912 │ ['./build_normal_debug/./src/Processors/Transforms/ExpressionTransform.cpp:23'] │
│ 546354050 │ ['./build_normal_debug/./src/Processors/ISimpleTransform.h:38'] │
│ 626026993 │ ['./build_normal_debug/./src/Processors/ISimpleTransform.cpp:89'] │
│ 626294022 │ ['./build_normal_debug/./src/Processors/Executors/ExecutionThreadContext.cpp:45'] │
│ 626293730 │ ['./build_normal_debug/./src/Processors/Executors/ExecutionThreadContext.cpp:63'] │
│ 626169525 │ ['./build_normal_debug/./src/Processors/Executors/PipelineExecutor.cpp:213'] │
│ 626170308 │ ['./build_normal_debug/./src/Processors/Executors/PipelineExecutor.cpp:178'] │
│ 626166348 │ ['./build_normal_debug/./src/Processors/Executors/PipelineExecutor.cpp:329'] │
│ 626163461 │ ['./build_normal_debug/./src/Processors/Executors/PipelineExecutor.cpp:84'] │
│ 626323536 │ ['./build_normal_debug/./src/Processors/Executors/PullingAsyncPipelineExecutor.cpp:85'] │
│ 626323277 │ ['./build_normal_debug/./src/Processors/Executors/PullingAsyncPipelineExecutor.cpp:112'] │
│ 626323133 │ ['./build_normal_debug/./contrib/libcxx/include/type_traits:3682'] │
│ 626323041 │ ['./build_normal_debug/./contrib/libcxx/include/tuple:1415'] │
└───────────┴──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘addressToSymbol
Introducido en: v20.1.0
Convierte una dirección de memoria virtual dentro del proceso del servidor de ClickHouse en un símbolo de los archivos objeto de ClickHouse.
Sintaxis
addressToSymbol(address_of_binary_instruction)Argumentos
address_of_binary_instruction— Dirección de una instrucción en un proceso en ejecución.UInt64
Valor devuelto
Devuelve el símbolo de los archivos objeto de ClickHouse o una cadena vacía si la dirección no es válida. String
Ejemplos
Selección de la primera cadena de la tabla del sistema trace_log
SET allow_introspection_functions=1;
SELECT * FROM system.trace_log LIMIT 1 FORMAT Vertical;-- The `trace` field contains the stack trace at the moment of sampling.
Row 1:
──────
event_date: 2019-11-20
event_time: 2019-11-20 16:57:59
revision: 54429
timer_type: Real
thread_number: 48
query_id: 724028bf-f550-45aa-910d-2af6212b94ac
trace: [94138803686098,94138815010911,94138815096522,94138815101224,94138815102091,94138814222988,94138806823642,94138814457211,94138806823642,94138814457211,94138806823642,94138806795179,94138806796144,94138753770094,94138753771646,94138753760572,94138852407232,140399185266395,140399178045583]Obtener el símbolo de una sola dirección
SET allow_introspection_functions=1;
SELECT addressToSymbol(94138803686098) FORMAT Vertical;Row 1:
──────
addressToSymbol(94138803686098): _ZNK2DB24IAggregateFunctionHelperINS_20AggregateFunctionSumImmNS_24AggregateFunctionSumDataImEEEEE19addBatchSinglePlaceEmPcPPKNS_7IColumnEPNS_5ArenaEAplicar la función a la traza de pila completa
SET allow_introspection_functions=1;
-- The arrayMap function allows to process each individual element of the trace array by the addressToSymbols function.
-- The result of this processing is shown in the trace_symbols column of output.
SELECT
arrayStringConcat(arrayMap(x -> addressToSymbol(x), trace), '\n') AS trace_symbols
FROM system.trace_log
LIMIT 1
FORMAT Vertical;Row 1:
──────
trace_symbols: _ZNK2DB24IAggregateFunctionHelperINS_20AggregateFunctionSumImmNS_24AggregateFunctionSumDataImEEEEE19addBatchSinglePlaceEmPcPPKNS_7IColumnEPNS_5ArenaE
_ZNK2DB10Aggregator21executeWithoutKeyImplERPcmPNS0_28AggregateFunctionInstructionEPNS_5ArenaE
_ZN2DB10Aggregator14executeOnBlockESt6vectorIN3COWINS_7IColumnEE13immutable_ptrIS3_EESaIS6_EEmRNS_22AggregatedDataVariantsERS1_IPKS3_SaISC_EERS1_ISE_SaISE_EERb
_ZN2DB10Aggregator14executeOnBlockERKNS_5BlockERNS_22AggregatedDataVariantsERSt6vectorIPKNS_7IColumnESaIS9_EERS6_ISB_SaISB_EERb
_ZN2DB10Aggregator7executeERKSt10shared_ptrINS_17IBlockInputStreamEERNS_22AggregatedDataVariantsE
_ZN2DB27AggregatingBlockInputStream8readImplEv
_ZN2DB17IBlockInputStream4readEv
_ZN2DB26ExpressionBlockInputStream8readImplEv
_ZN2DB17IBlockInputStream4readEv
_ZN2DB26ExpressionBlockInputStream8readImplEv
_ZN2DB17IBlockInputStream4readEv
_ZN2DB28AsynchronousBlockInputStream9calculateEv
_ZNSt17_Function_handlerIFvvEZN2DB28AsynchronousBlockInputStream4nextEvEUlvE_E9_M_invokeERKSt9_Any_data
_ZN14ThreadPoolImplI20ThreadFromGlobalPoolE6workerESt14_List_iteratorIS0_E
_ZZN20ThreadFromGlobalPoolC4IZN14ThreadPoolImplIS_E12scheduleImplIvEET_St8functionIFvvEEiSt8optionalImEEUlvE1_JEEEOS4_DpOT0_ENKUlvE_clEv
_ZN14ThreadPoolImplISt6threadE6workerESt14_List_iteratorIS0_E
execute_native_thread_routine
start_thread
clonedemangle
Introducido en: v20.1.0
Convierte un símbolo en el nombre de una función de C++.
Normalmente, la función addressToSymbol devuelve el símbolo.
Sintaxis
demangle(symbol)Argumentos
symbol— Símbolo de un archivo objeto.String
Valor devuelto
Devuelve el nombre de la función de C++, o una cadena vacía si el símbolo no es válido. String
Ejemplos
Seleccionar la primera cadena de la tabla del sistema trace_log
SELECT * FROM system.trace_log LIMIT 1 FORMAT Vertical;-- The `trace` field contains the stack trace at the moment of sampling.
Row 1:
──────
event_date: 2019-11-20
event_time: 2019-11-20 16:57:59
revision: 54429
timer_type: Real
thread_number: 48
query_id: 724028bf-f550-45aa-910d-2af6212b94ac
trace: [94138803686098,94138815010911,94138815096522,94138815101224,94138815102091,94138814222988,94138806823642,94138814457211,94138806823642,94138814457211,94138806823642,94138806795179,94138806796144,94138753770094,94138753771646,94138753760572,94138852407232,140399185266395,140399178045583]Obtener el nombre de la función para una sola dirección
SET allow_introspection_functions=1;
SELECT demangle(addressToSymbol(94138803686098)) FORMAT Vertical;Row 1:
──────
demangle(addressToSymbol(94138803686098)): DB::IAggregateFunctionHelper<DB::AggregateFunctionSum<unsigned long, unsigned long, DB::AggregateFunctionSumData<unsigned long> > >::addBatchSinglePlace(unsigned long, char*, DB::IColumn const**, DB::Arena*) constAplicar la función a toda la traza de pila
SET allow_introspection_functions=1;
-- The arrayMap function allows to process each individual element of the trace array by the demangle function.
-- The result of this processing is shown in the trace_functions column of output.
SELECT
arrayStringConcat(arrayMap(x -> demangle(addressToSymbol(x)), trace), '\n') AS trace_functions
FROM system.trace_log
LIMIT 1
FORMAT Vertical;Row 1:
──────
trace_functions: DB::IAggregateFunctionHelper<DB::AggregateFunctionSum<unsigned long, unsigned long, DB::AggregateFunctionSumData<unsigned long> > >::addBatchSinglePlace(unsigned long, char*, DB::IColumn const**, DB::Arena*) const
DB::Aggregator::executeWithoutKeyImpl(char*&, unsigned long, DB::Aggregator::AggregateFunctionInstruction*, DB::Arena*) const
DB::Aggregator::executeOnBlock(...)
DB::Aggregator::executeOnBlock(DB::Block const&, ...)
DB::Aggregator::execute(std::shared_ptr<DB::IBlockInputStream> const&, DB::AggregatedDataVariants&)
DB::AggregatingBlockInputStream::readImpl()
DB::IBlockInputStream::read()
DB::ExpressionBlockInputStream::readImpl()
DB::IBlockInputStream::read()
DB::ExpressionBlockInputStream::readImpl()
DB::IBlockInputStream::read()
DB::AsynchronousBlockInputStream::calculate()
std::_Function_handler<void (), DB::AsynchronousBlockInputStream::next()::{lambda()#1}>::_M_invoke(std::_Any_data const&)
ThreadPoolImpl<ThreadFromGlobalPool>::worker(std::_List_iterator<ThreadFromGlobalPool>)
ThreadFromGlobalPool::ThreadFromGlobalPool<ThreadPoolImpl<ThreadFromGlobalPool>::scheduleImpl<void>(std::function<void ()>, int, std::optional<unsigned long>)::{lambda()#3}>(ThreadPoolImpl<ThreadFromGlobalPool>::scheduleImpl<void>(std::function<void ()>, int, std::optional<unsigned long>)::{lambda()#3}&&)::{lambda()#1}::operator()() const
ThreadPoolImpl<std::thread>::worker(std::_List_iterator<std::thread>)
execute_native_thread_routine
start_thread
cloneisMergeTreePartCoveredBy
Introducido en: v25.6.0
Función que comprueba si la parte del primer argumento queda cubierta por la parte del segundo argumento.
Sintaxis
isMergeTreePartCoveredBy(nested_part, covering_part)Argumentos
nested_part— Nombre de la parte anidada esperada.Stringcovering_part— Nombre de la parte contenedora esperada.String
Valor devuelto
Devuelve 1 si la cubre; 0 en caso contrario. UInt8
Ejemplos
Ejemplo básico
WITH 'all_12_25_7_4' AS lhs, 'all_7_100_10_20' AS rhs
SELECT isMergeTreePartCoveredBy(rhs, lhs), isMergeTreePartCoveredBy(lhs, rhs);┌─isMergeTreePartCoveredBy(rhs, lhs)─┬─isMergeTreePartCoveredBy(lhs, rhs)─┐
│ 0 │ 1 │
└────────────────────────────────────┴────────────────────────────────────┘logTrace
Introducido en: v20.12.0
Emite un mensaje de traza en el registro del servidor.
La función solo acepta un argumento constante, por lo que la llamada se evalúa durante el análisis de la consulta y se sustituye
por su resultado. Por lo tanto, el mensaje se emite una vez mientras se analiza la consulta, y no una vez por cada
bloque procesado: el número de filas y la configuración max_block_size no afectan
a la cantidad de mensajes que aparecen en el log.
Sintaxis
logTrace(message)Argumentos
message— Mensaje que se emite al registro del servidor.const String
Valor devuelto
Devuelve siempre 0. UInt8
Ejemplos
Ejemplo básico
SELECT logTrace('logTrace message');┌─logTrace('logTrace message')─┐
│ 0 │
└──────────────────────────────┘mergeTreePartInfo
Introducido en: v25.6.0
Función que ayuda a extraer los valores relevantes del nombre de la parte de MergeTree.
Sintaxis
mergeTreePartInfo(part_name)Argumentos
part_name— Nombre de la parte que se va a descomprimir.String
Valor devuelto
Devuelve una Tuple con subcolumnas: partition_id, min_block, max_block, level, mutation. Tuple
Ejemplos
Ejemplo básico
WITH mergeTreePartInfo('all_12_25_7_4') AS info
SELECT info.partition_id, info.min_block, info.max_block, info.level, info.mutation;┌─info.partition_id─┬─info.min_block─┬─info.max_block─┬─info.level─┬─info.mutation─┐
│ all │ 12 │ 25 │ 7 │ 4 │
└───────────────────┴────────────────┴────────────────┴────────────┴───────────────┘tid
Introducido en: v20.12.0
Devuelve el ID del hilo en el que se procesa el bloque actual.
Sintaxis
tid()Argumentos
- Ninguno.
Valor devuelto
Devuelve el identificador del hilo actual. UInt64
Ejemplos
Ejemplo de uso
SELECT tid();┌─tid()─┐
│ 3878 │
└───────┘