الانتقال إلى المحتوى الرئيسي
يمكنك استخدام الدوال الموضحة في هذا الفصل لاستبطان ELF وDWARF لأغراض تحليل أداء الاستعلامات.
هذه الدوال بطيئة وقد تترتب عليها اعتبارات أمنية.
لكي تعمل دوال الاستبطان بشكل صحيح:
  • ثبّت الحزمة clickhouse-common-static-dbg.
  • اضبط الإعداد allow_introspection_functions على القيمة 1. لأسباب أمنية، تكون دوال الاستبطان معطّلة افتراضيًا.
يحفظ ClickHouse تقارير Profiler في جدول النظام trace_log. تأكد من إعداد الجدول وProfiler بشكل صحيح.

addressToLine

أُضيف في: v20.1.0 يحوّل عنوانًا في الذاكرة الافتراضية داخل عملية خادم ClickHouse إلى اسم ملف ورقم سطر في الشيفرة المصدرية لـ ClickHouse.
هذه الدالة بطيئة وقد تترتب عليها اعتبارات أمنية.
لتمكين دالة الاستبطان هذه: البنية
addressToLine(address_of_binary_instruction)
الوسيطات
  • address_of_binary_instruction — عنوان التعليمة في عملية قيد التشغيل. UInt64
القيمة المعادة تعيد اسم ملف الشيفرة المصدرية ورقم السطر، مفصولين بنقطتين، على سبيل المثال: /build/obj-x86_64-linux-gnu/../src/Common/ThreadPool.cpp:199. وتعيد اسم ملف تنفيذي إذا تعذر العثور على معلومات تصحيح الأخطاء، أو سلسلة فارغة إذا كان العنوان غير صالح. String أمثلة اختيار السلسلة الأولى من جدول النظام trace_log
Query
SET allow_introspection_functions=1;
SELECT * FROM system.trace_log LIMIT 1 \G;
Response
-- 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]
الحصول على اسم ملف الشيفرة المصدرية ورقم السطر لعنوانٍ واحد
Query
SET allow_introspection_functions=1;
SELECT addressToLine(94784076370703) \G;
Response
Row 1:
──────
addressToLine(94784076370703): /build/obj-x86_64-linux-gnu/../src/Common/ThreadPool.cpp:199
تطبيق function على أثر المكدس بالكامل
Query
-- 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
\G
Response
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:97

addressToLineWithInlines

أُضيفت في: v22.2.0 تشبه addressToLine، لكنها تُرجع Array تحتوي على جميع الدوال المضمّنة inline. ولذلك، فهي أبطأ من addressToLine. لتمكين دالة الاستبطان هذه: البنية
addressToLineWithInlines(address_of_binary_instruction)
الوسائط
  • address_of_binary_instruction — عنوان تعليمة في عملية قيد التشغيل. UInt64
القيمة المعادة تعيد مصفوفةً يكون عنصرها الأول اسم ملف الشيفرة المصدرية ورقم السطر، مفصولين بنقطتين. أما العنصر الثاني والثالث وهكذا، فيسرد أسماء ملفات الشيفرة المصدرية للدوال المضمّنة وأرقام الأسطر وأسماء الدوال. إذا تعذر العثور على معلومات التصحيح، فستُعاد مصفوفة تحتوي على عنصر واحد يساوي اسم الملف التنفيذي. أما إذا كان العنوان غير صالح، فستُعاد مصفوفة فارغة. Array(String) أمثلة تطبيق الدالة على عنوان
Query
SET allow_introspection_functions=1;
SELECT addressToLineWithInlines(531055181::UInt64);
Response
┌─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'] │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
تطبيق الدالة على أثر المكدس بالكامل
Query
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';
Response
┌────────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

استُحدث في: v20.1.0 يحوّل عنوانًا في الذاكرة الافتراضية داخل عملية خادم ClickHouse إلى رمز من ملفات الكائنات الخاصة بـ ClickHouse. الصيغة
addressToSymbol(address_of_binary_instruction)
المعاملات
  • address_of_binary_instruction — عنوان التعليمة ضمن عملية قيد التشغيل. UInt64
القيمة المُعادة تُرجِع الرمز من ملفات الكائن الخاصة بـ ClickHouse، أو سلسلة فارغة إذا كان العنوان غير صالح. String أمثلة تحديد السلسلة الأولى من جدول النظام trace_log
Query
SET allow_introspection_functions=1;
SELECT * FROM system.trace_log LIMIT 1 \G;
Response
-- 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]
الحصول على رمز لعنوان واحد
Query
SET allow_introspection_functions=1;
SELECT addressToSymbol(94138803686098) \G;
Response
Row 1:
──────
addressToSymbol(94138803686098): _ZNK2DB24IAggregateFunctionHelperINS_20AggregateFunctionSumImmNS_24AggregateFunctionSumDataImEEEEE19addBatchSinglePlaceEmPcPPKNS_7IColumnEPNS_5ArenaE
تطبيق الدالة على أثر المكدس بالكامل
Query
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
\G
Response
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
clone

demangle

أُضيف في: v20.1.0 يحوّل رمزًا إلى اسم دالة في C++. وعادةً ما تُرجِع هذا الرمز الدالة addressToSymbol. البنية
demangle(symbol)
الوسائط
  • symbol — رمز من ملف كائن. String
القيمة المُعادة يُعيد اسم دالة C++، أو سلسلة نصية فارغة إذا لم يكن الرمز صالحًا. String أمثلة استرجاع أول سلسلة نصية من جدول النظام trace_log
Query
SELECT * FROM system.trace_log LIMIT 1 \G;
Response
-- 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]
الحصول على اسم دالة من عنوان واحد
Query
SET allow_introspection_functions=1;
SELECT demangle(addressToSymbol(94138803686098)) \G;
Response
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*) const
تطبيق function على كامل أثر المكدس
Query
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
\G
Response
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
clone

isMergeTreePartCoveredBy

استُحدثت في: v25.6.0 دالة تتحقق مما إذا كان الجزء في الوسيط الأول مشمولًا بالجزء في الوسيط الثاني. البنية
isMergeTreePartCoveredBy(nested_part, covering_part)
المعاملات
  • nested_part — اسم الجزء المتداخل المتوقع. String
  • covering_part — اسم الجزء المُغطّي المتوقع. String
القيمة المعادة تُرجع 1 إذا كان يغطيه، وإلا 0. UInt8 أمثلة مثال أساسي
Query
WITH 'all_12_25_7_4' AS lhs, 'all_7_100_10_20' AS rhs
SELECT isMergeTreePartCoveredBy(rhs, lhs), isMergeTreePartCoveredBy(lhs, rhs);
Response
┌─isMergeTreePartCoveredBy(rhs, lhs)─┬─isMergeTreePartCoveredBy(lhs, rhs)─┐
│                                  0 │                                  1 │
└────────────────────────────────────┴────────────────────────────────────┘

logTrace

أُضيف في: v20.12.0 يُصدر رسالة trace log في server log لكل كتلة. البنية
logTrace(message)
الوسائط
  • message — الرسالة التي تُسجَّل في سجل الخادم. const String
القيمة المُعادة يعيد 0 دائمًا. UInt8 أمثلة مثال بسيط
Query
SELECT logTrace('logTrace message');
Response
┌─logTrace('logTrace message')─┐
│                            0 │
└──────────────────────────────┘

mergeTreePartInfo

طُرحت في: v25.6.0 دالة تساعد على استخراج القيم المفيدة من اسم الجزء في MergeTree. الصيغة
mergeTreePartInfo(part_name)
المعاملات
  • part_name — اسم الجزء المراد فك ضغطه. String
القيمة المُعادة تُرجع قيمة من النوع Tuple مع أعمدة فرعية: partition_id, min_block, max_block, level, mutation. Tuple أمثلة مثال بسيط
Query
WITH mergeTreePartInfo('all_12_25_7_4') AS info
SELECT info.partition_id, info.min_block, info.max_block, info.level, info.mutation;
Response
┌─info.partition_id─┬─info.min_block─┬─info.max_block─┬─info.level─┬─info.mutation─┐
│ all               │             12 │             25 │          7 │             4 │
└───────────────────┴────────────────┴────────────────┴────────────┴───────────────┘

tid

قُدِّمت في: v20.12.0 تعيد معرّف الخيط الذي تُعالَج فيه الكتلة الحالية. البنية
tid()
الوسائط
  • لا توجد.
القيمة المُعادة يعيد معرّف الخيط الحالي. UInt64 أمثلة مثال على الاستخدام
Query
SELECT tid();
Response
┌─tid()─┐
│  3878 │
└───────┘
آخر تعديل في ٢٥ يونيو ٢٠٢٦