SYSTEM، وأوامر الكلمات ذات الأحرف الأربعة (4LW) في Keeper. وهناك عدة طرق لفحص النتائج:
- اجمع العينات في
system.trace_logتحت النوعJemallocSampleلإجراء تحليل لكل استعلام على حدة. - اعرض إحصاءات الذاكرة المباشرة واسترجع ملف تعريف الكومة عبر واجهة الويب المدمجة لـ jemalloc (26.2+).
- استعلم عن ملف تعريف الكومة الحالي مباشرةً من SQL باستخدام
system.jemalloc_profile_text(26.2+). - حلّل تجزئة الذاكرة من SQL باستخدام
system.jemalloc_sampled_allocations(26.9+). - نفّذ flush لملفات ملف تعريف الكومة إلى disk ثم حلّلها باستخدام
jeprof.
ينطبق هذا الدليل على الإصدارات 25.9+.
أما الإصدارات الأقدم، فيُرجى مراجعة تنميط التخصيص للإصدارات الأقدم من 25.9.
أخذ عينات من تخصيصات الذاكرة
لأخذ عينات من تخصيصات الذاكرة وتنميطها، شغّل ClickHouse/Keeper مع تفعيل إعدادjemalloc_enable_global_profiler:
jemalloc عينات من عمليات تخصيص الذاكرة ويخزّن المعلومات داخليًا.
يمكنك أيضًا تمكين أخذ العينات لكل query باستخدام الإعداد jemalloc_enable_profiler.
تخزين عينات jemalloc في system.trace_log
يمكنك تخزين عينات jemalloc في system.trace_log ضمن النوع JemallocSample.
لتمكين ذلك على مستوى النظام بالكامل، استخدم إعداد jemalloc_collect_global_profile_samples_in_trace_log:
jemalloc_collect_profile_samples_in_trace_log.
مثال: تحليل استهلاك الذاكرة لاستعلام
أولًا، شغِّل استعلامًا مع تفعيل مُحلِّل jemalloc واجمع العيّنات فيsystem.trace_log:
إذا كان ClickHouse قد بدأ التشغيل مع
jemalloc_enable_global_profiler، فلن تحتاج إلى تفعيل jemalloc_enable_profiler.
وينطبق الأمر نفسه على jemalloc_collect_global_profile_samples_in_trace_log وjemalloc_collect_profile_samples_in_trace_log.system.trace_log:
واجهة ويب jemalloc
ينطبق هذا القسم على الإصدارات 26.2+.
/jemalloc.
وتعرض مقاييس الذاكرة المباشرة مع مخططات، بما في ذلك الذاكرة المخصصة والنشطة والمقيمة والمعيّنة، بالإضافة إلى إحصاءات كل ساحة وكل bin.
ويمكنك أيضًا جلب ملفات ملف تعريف الكومة العامة وملفات ملف تعريف الكومة لكل استعلام مباشرةً من الواجهة.
- ClickHouse
- Keeper
جلب ملفات تعريف heap من SQL
ينطبق هذا القسم على الإصدارات 26.2+.
system.jemalloc_profile_text جلب ملف تعريف الكومة الحالي لـ jemalloc وعرضه مباشرةً من SQL، من دون الحاجة إلى أدوات خارجية أو إلى تفريغه إلى القرص أولًا.
يحتوي الجدول على عمود واحد:
يمكنك الاستعلام عن الجدول مباشرةً — لا حاجة إلى تفريغ ملف تعريف الكومة مسبقًا:
تنسيق الإخراج
يُتحكَّم في تنسيق الإخراج بواسطة الإعدادjemalloc_profile_text_output_format، الذي يدعم ثلاث قيم:
raw— ملف تعريف الكومة خام كما يُنتجه jemalloc.symbolized— تنسيق متوافق مع jeprof مع تضمين رموز الدوال. وبما أن الرموز مضمنة بالفعل، يمكن لـjeprofتحليل المخرجات دون الحاجة إلى ملف ClickHouse التنفيذي.collapsed(الافتراضي) — مكدسات مطوية متوافقة مع FlameGraph، بمكدس واحد في كل سطر مع عدد البايتات.
إعدادات إضافية
jemalloc_profile_text_symbolize_with_inline(Bool، الافتراضي:true) — ما إذا كان سيتم تضمين الإطارات المضمّنة عند فكّ الرموز. يؤدي تعطيل هذا الخيار إلى تسريع فكّ الرموز بشكل ملحوظ، لكنه يقلل الدقة لأن استدعاءات الدوال المضمّنة لن تظهر في المكدسات. لا يؤثر ذلك إلا في التنسيقينsymbolizedوcollapsed.jemalloc_profile_text_collapsed_use_count(Bool، الافتراضي:false) — عند استخدام التنسيقcollapsed، يتم التجميع حسب عدد التخصيصات بدلًا من البايتات.
مثال: إنشاء مخطط اللهب من SQL
بما أن تنسيق الإخراج الافتراضي هوcollapsed، يمكنك تمرير الإخراج مباشرةً إلى FlameGraph:
تحليل تجزئة الذاكرة من SQL
ينطبق هذا القسم على الإصدارات 26.9 وما بعدها.
system.jemalloc_arena_binsيُظهر مقدار الذاكرة التي يهدرها كل صنف حجم في كل ساحة. وwasteهو عدد البايتات المحتفظ بها في الشرائح دون أن تستخدمها تخصيصات حيّة. أماpurposeفيشير إلى الساحات المخصّصة (mergetree،jit،cache)؛ وهي تحتفظ ببيانات طويلة العمر بحكم التصميم، لذا استبعدها باستخدامpurpose = ''عند البحث عن تجزئة ذاكرة غير متوقعة. ويحتويsystem.jemalloc_binsعلى البيانات نفسها مجموعةً على مستوى الساحات.system.jemalloc_sampled_allocationsيسرد التخصيصات المأخوذة كعيّنات والتي لا تزال حيّة، بصف واحد لكل عيّنة: تتبّع المكدس (trace)، ومدة بقائها حيّة (age_ns)، والحجم وصنف الحجم، والساحة. وقراءة هذا الجدول تُجري flush لملف heap profile جديد.
- لا تُنتج العيّنات إلا الخيوط التي يكون الـ profiler مفعّلًا فيها (
jemalloc_enable_global_profilerفي config أو الإعدادjemalloc_enable_profiler). - يمثّل كل صف نحو
weightمن التخصيصات الحقيقية، والتخصيصات الصغيرة تُؤخذ كعيّنات بمعدّل منخفض. عدّلjemalloc_profiler_sampling_rateإذا لم تكن هناك عيّنات لأصناف الأحجام التي تهمّك. - لا تُخزَّن التخصيصات المأخوذة كعيّنات في الشرائح، لذا فهي لا تزيد
wasteبذاتها، وإنما تدلّك فقط على الشيفرة التي تخصّص في صنف الحجم ذاك. - تستهلك كل عيّنة حيّة صفحتين إضافيتين (128 كيبي بايت في builds ذات الصفحات بحجم 64 كيبي بايت) حتى يتحرّر التخصيص. وتعطيل الـ profiler يوقف العيّنات الجديدة لكنه لا يحرّر القائمة منها.
مثال: توليد مخطط اللهب للتجزئة
يمكن للـ query نفسه أن يوزّع الهدر في كل صنف حجم على تتبّعات المكدس الخاصة به، بالتناسب مع عدد allocations القديمة في كل منها، ثم يطبع النتيجة بتنسيقcollapsed المخصص لـ flamegraph.pl. أما أصناف الحجم التي بها هدر لكن ليس لديها samples قديمة بما يكفي، فتُدرج تحت frame باسم [unattributed]، بحيث يكون مجموع مخطط اللهب هو إجمالي الهدر. واقرأ system.jemalloc_sampled_allocations مرة واحدة فقط لكل query، إذ إن كل عملية قراءة تُنفّذ flush لـ profile جديد، ومن ثمّ فإن استخدام subqueries اثنين سيؤدي إلى رؤية بيانات مختلفة.
تفريغ ملفات تعريف الكومة إلى القرص
إذا كنت بحاجة إلى حفظ ملفات تعريف الكومة كملفات لتحليلها دون اتصال باستخدامjeprof، فيمكنك تفريغها إلى القرص.
افتراضيًا، سيتم إنشاء ملف تعريف الكومة في /tmp/jemalloc_clickhouse._pid_._seqnum_.heap، حيث يشير _pid_ إلى معرّف العملية (PID) الخاص بـ ClickHouse، ويشير _seqnum_ إلى رقم التسلسل العام لملف تعريف الكومة الحالي.
بالنسبة إلى Keeper، يكون الملف الافتراضي هو /tmp/jemalloc_keeper._pid_._seqnum_.heap، ويتبع القواعد نفسها.
لتفريغ ملف التعريف الحالي:
- ClickHouse
- Keeper
prof_prefix إلى متغير البيئة MALLOC_CONF.
على سبيل المثال، إذا كنت تريد إنشاء ملفات التعريف في المجلد /data بحيث تكون بادئة اسم الملف هي my_current_profile، فيمكنك تشغيل ClickHouse/Keeper باستخدام متغير البيئة التالي:
تحليل ملفات ملف تعريف الكومة باستخدام jeprof
بعد تفريغ ملفات ملف تعريف الكومة إلى القرص، يمكن تحليلها باستخدام أداة jemalloc المسماة jeprof. ويمكن تثبيتها بعدة طرق:
- باستخدام مدير الحزم الخاص بالنظام
- استنساخ مستودع jemalloc وتشغيل
autogen.shمن المجلد الجذر. سيوفّر لك ذلك البرنامج النصيjeprofداخل المجلدbin
jeprof --help للحصول على القائمة الكاملة بالخيارات.
ملفات تعريف الكومة المُرمَّزة بالرموز
اعتبارًا من الإصدار 26.1+، ينشئ ClickHouse تلقائيًا ملفات تعريف كومة مُرمَّزة بالرموز عند تنفيذ عمليةflush باستخدام SYSTEM JEMALLOC FLUSH PROFILE.
ويحتوي ملف التعريف المُرمَّز بالرموز (ذو الامتداد .symbolized) على رموز الدوال المضمّنة، ويمكن تحليله باستخدام jeprof دون الحاجة إلى الملف التنفيذي لـ ClickHouse.
على سبيل المثال، عند تشغيل:
/tmp/jemalloc_clickhouse.12345.0.heap.symbolized).
يمكنك بعد ذلك تحليله مباشرةً باستخدام jeprof:
لا حاجة إلى الملف التنفيذي: عند استخدام ملفات التعريف مُرمَّزة بالرموز (ملفات
.symbolized)، لن تحتاج إلى تمرير مسار الملف التنفيذي لـ ClickHouse إلى jeprof. وهذا يجعل تحليل ملفات التعريف أسهل بكثير على أجهزة مختلفة أو بعد تحديث الملف التنفيذي.بالنسبة إلى ملفات التعريف غير المُرمَّزة بالرموز، يستخدم وبدلًا من ذلك، يعمل
jeprof الأداة addr2line لإنشاء stacktraces، وقد يكون ذلك بطيئًا جدًا.
إذا كان الأمر كذلك، فيُوصى بتثبيت نسخة بديلة من هذه الأداة.llvm-addr2line بالكفاءة نفسها (لكن انتبه إلى أن llvm-objdump غير متوافق مع jeprof)ثم استخدمه لاحقًا على النحو التالي: jeprof --tools addr2line:/usr/bin/llvm-addr2line,nm:/usr/bin/llvm-nm,objdump:/usr/bin/objdump,c++filt:/usr/bin/llvm-cxxfilt--base:
أمثلة
استخدام ملفات التعريف مُرمَّزة بالرموز (مُستحسن):- أنشئ ملفًا نصيًا تُكتب فيه كل دالة في سطر منفصل:
- أنشئ ملف PDF يتضمن مخطط الاستدعاءات:
- أنشئ ملفًا نصيًا بحيث يُكتب كل إجراء في سطر مستقل:
- أنشئ ملف PDF يحتوي على مخطط الاستدعاءات:
إنشاء مخطط اللهب
يتيح لكjeprof إنشاء مكدس مطوي لاستخدامها في إنشاء مخططات اللهب.
تحتاج إلى استخدام الوسيط --collapsed:
flamegraph.pl:
خيارات إضافية لـ Profiler
يوفّرjemalloc العديد من الخيارات المرتبطة بـ Profiler، ويمكن التحكم فيها عبر تعديل متغير البيئة MALLOC_CONF.
على سبيل المثال، يمكن التحكم في الفاصل الزمني بين عينات التخصيص باستخدام lg_prof_sample.
إذا كنت تريد إخراج ملف تعريف الكومة كل N بايت، فيمكنك تفعيل ذلك باستخدام lg_prof_interval.
يُنصح بالرجوع إلى الصفحة المرجعية الخاصة بـ jemalloc للحصول على قائمة كاملة بالخيارات.
موارد أخرى
يعرض ClickHouse/Keeper مقاييس مرتبطة بـjemalloc بطرق عديدة ومختلفة.
جدول النظام asynchronous_metrics
جدول النظام jemalloc_bins
يحتوي على معلومات عن تخصيصات الذاكرة التي يجريها مُخصِّص jemalloc عبر فئات الأحجام المختلفة (bins)، والمجمّعة من جميع الساحات.
مرجع
جدول النظام jemalloc_stats (26.2+)
يعرض الناتج الكامل للدالة malloc_stats_print() كسلسلة نصية واحدة. وهو مكافئ للأمر SYSTEM JEMALLOC STATS.
Prometheus
تُعرَض أيضًا جميع المقاييس المتعلقة بـjemalloc من asynchronous_metrics عبر نقطة نهاية Prometheus في كلٍّ من ClickHouse وKeeper.
مرجع
أمر jmst 4LW في Keeper
يدعم Keeper الأمر jmst 4LW الذي يعرض إحصاءات أساسية للمخصِّص: