تخطَّ إلى المحتوى

pahole - تحليل تخطيط الهيكل وخط Cache

pahole - تحليل تخطيط الهيكل وخط Cache

pahole (“poke-a-hole”) يقرأ معلومات تصحيح DWARF أو BTF ويطبع تخطيط الذاكرة الفعلي لهياكل C — حيث يجلس كل حقل وكم من الحشو أدرجه المترجم وكم عدد خطوط الكاش التي يمتد الهيكل. المترجمات تحشو الهياكل لإرضاء المحاذاة والهيكل المهمل مرتب يمكن أن يضيع عشرات البايتات ويمتد خطوط كاش إضافية. على بيانات ساخنة تُرجم مباشرة إلى cache misses. pahole يجعل الحشو مرئي حتى تتمكن من إعادة ترتيب الحقول وتقليل ذلك.

التثبيت

المنصةالأمر
Debian/Ubuntusudo apt install dwarves
Fedora/RHELsudo dnf install dwarves
Arch Linuxsudo pacman -S pahole
من المصدرbuild the dwarves project
التحققpahole --version

يجب بناء الثنائي بمعلومات التصحيح (-g). الثنائيات المجردة لا تحتوي على شيء لـ pahole لقراءته.

الاستخدام الأساسي

الأمرالوصف
pahole ./myprogramإظهار جميع الهياكل في الثنائي
pahole -C mystruct ./myprogramهيكل محدد واحد
pahole -C task_struct /sys/kernel/btf/vmlinuxهيكل Kernel عبر BTF
pahole --sizes ./myprogramقائمة أحجام الهيكل
pahole -H 1 ./myprogramفقط الهياكل مع ≥1 hole

قراءة الإخراج

struct example {
        char                       flag;                 /*     0     1 */

        /* XXX 7 bytes hole, try to pack */

        long int                   counter;              /*     8     8 */
        char                       name[16];             /*    16    16 */
        int                        id;                   /*    32     4 */

        /* XXX 4 bytes hole, try to pack */

        void *                     ptr;                  /*    40     8 */

        /* size: 48, cachelines: 1, members: 5 */
        /* sum members: 37, holes: 2, sum holes: 11 */
};
التعليقالمعنى
/* offset size */byte offset وحجم كل حقل
XXX N bytes holeحشو أدرجه المترجم
size:إجمالي حجم الهيكل
cachelines:كم عدد خطوط 64-byte تمتد
sum holes:إجمالي البايتات المهدرة
last cacheline:البايتات المستخدمة في السطر الأخير

البحث عن الهدر عبر Codebase

الأمرالأوجد
pahole -H 1 ./binالهياكل مع ثقوب
pahole --nr_members ./binتصنيف حسب عدد الأعضاء
pahole -c 2 ./binالهياكل التي تمتد ≥2 خطوط كاش
pahole -E ./binتوسيع الهياكل المتداخلة inline
pahole -a ./binعرض تفاصيل المحاذاة/الحشو
# أي الهياكل تهدر أكثر الذاكرة على الحشو؟
pahole -H 8 ./myprogram | head -50

إصلاح التخطيط

الإصلاح القياسي هو ترتيب الحقول من أكبر إلى أصغر محاذاة:

/* قبل: 48 بايت و 11 مهدرة */
struct bad  { char flag; long counter; char name[16]; int id; void *ptr; };

/* بعد: 40 بايت و 0 مهدرة */
struct good { long counter; void *ptr; char name[16]; int id; char flag; };
التقنيةالتأثير
الترتيب بالمحاذاة التنازليةيزيل معظم الثقوب
مجموعة الحقول الساخنة معاًتبقيهم في خط كاش واحد
تقسيم الحقول الباردة إلى هيكل ثانيالبيانات الساخنة تبقى كثيفة
__attribute__((packed))يزيل الحشو — لكن قد يبطئ الوصول غير المحاذي
BitfieldsPack small flags

pahole يمكن حتى أن يقترح إعادة ترتيب مع --reorganize:

pahole --reorganize -C mystruct ./myprogram

Kernel Work (BTF)

الأمرالغرض
pahole -C task_struct /sys/kernel/btf/vmlinuxفحص هيكل kernel حي
pahole -J vmlinuxتوليد BTF من DWARF
pahole --btf_encodeترميز BTF لأدوات eBPF

توليد BTF هو السبب في أن dwarves اعتماد بناء kernel — eBPF’s CO-RE يعتمد عليه.

عندما يهم هذا

الحالةالتأثير
ملايين المثيلات من هيكلتوفير الذاكرة يتسع خطياً
حلقة ساخنة تلمس حقول الهيكلخطوط cache أقل = cache misses أقل
تسلسل الشبكة/القرصهياكل أصغر وأقل I/O
الذاكرة المضمنة/المقيدةكل البايت يهم
هيكل يُستخدم مرتينلا تزعج

pahole مقابل الأدوات ذات الصلة

الأداةالإجابات
paholeكيف يتم تخطيط هذا الهيكل وأين الهدر؟
perfهل أنا بالفعل cache-missing؟
valgrind (cachegrind)سلوك الكاش المحاكى
heaptrackحيث تذهب ذاكرة heap؟

استخدم perf للتأكيد من cache misses هي اختناق ثم pahole لإصلاح التخطيط.

الموارد