eBPF و bpftrace للمحترف: راقب latency أي عملية في إنتاجك بدون تعديل سطر كود
مستوى المقال: محترف (Advanced) — يفترض إنك مرتاح مع Linux kernel على مستوى syscalls، عندك صلاحية root على سيرفرات الإنتاج، وفاهم الفرق بين user space و kernel space. لو لسه بتتعلم Docker الأول، المقال ده هيكون مبكّر عليك.
لو خدمتك في الإنتاج بقت بطيئة من ساعتين، وفريقك بيقترح إضافة OpenTelemetry instrumentation علشان تعرف فين المشكلة، ده معناه 3 أيام شغل + Pull Request + deploy + زيادة 8% على الـ p95 latency بسبب spans. eBPF بيدّيك نفس الإجابات في أقل من 5 دقائق، بدون deploy، بدون restart للخدمة، وبصفر تعديل في الكود.
المشكلة باختصار
الـ observability التقليدي (APM، tracing، profiling) بيشتغل بطريقة واحدة: تضيف SDK في تطبيقك، تـ instrument الكود يدوي أو أوتوماتي، تعمل deploy، ثم تنتظر البيانات. ده بيفشل في 3 سيناريوهات بتحصل كل أسبوع تقريباً:
- الخدمة البطيئة مش تطبيقك، هي MySQL أو Redis أو nginx — ومحدش بيـ instrument الـ binaries دي يدوي.
- المشكلة بتحصل الساعة 3 الصبح ولا تقدر تستنى deploy بعد ساعتين علشان تشوف.
- الـ instrumentation نفسه بيغيّر الأداء، فالأرقام اللي بتشوفها مش الأرقام الحقيقية (Heisenberg observability).
إيه هو eBPF أصلاً؟ (مثال للمبتدئ الأول)
تخيّل عندك مطعم كبير، وعايز تعرف أكتر طبق بياخد وقت في التحضير. الطريقة التقليدية إنك تقعد في المطبخ مع ساعة إيقاف وتقيس كل طلب، لكن وجودك نفسه هيخلّي الطباخين يشتغلوا أبطأ ويتلخبطوا. الطريقة الذكية إنك تركّب كاميرات صغيرة جداً على كل محطة، الكاميرات ميتدخلوش في الشغل بس بيسجلوا التوقيتات، وانت تقعد في مكتبك تقرا الأرقام.
eBPF هو الكاميرا دي، والـ kernel هو المطبخ. هو virtual machine صغيرة جوّا الـ Linux kernel، بتشغّل برامج محدودة (sandboxed) تتعلّق على نقاط اسمها kprobes و uprobes و tracepoints. كل مرة الـ kernel أو أي function في binary معيّن يشتغل، البرنامج بتاعك بيشتغل، يحسب أو يجمّع، ويرجّع، كل ده بـ overhead أقل من 1% في الحالات العادية. الفكرة موجودة من 1992 (BSD Packet Filter)، لكن النسخة الحديثة (extended BPF) دخلت Linux kernel في 2014 ومن ساعتها بقت العمود الفقري لأدوات زي Cilium و Falco و Pixie.
الـ kernel فيه component اسمه verifier، بيتأكد إن البرنامج بتاعك مش هيـ crash الـ kernel ومش هيدخل في loop لا نهائي قبل ما يشغّله. ده اللي بيخلّي eBPF آمن إنك تشغّله على إنتاج بدون خوف من kernel panic.
ليه bpftrace بالظبط؟
تقدر تكتب برامج eBPF بـ C وتشغّلها بـ libbpf، لكن ده زي إنك تفتح الكاميرا وتلحم اللوحة الإلكترونية بإيدك. bpftrace هي high-level language مستوحاة من awk و DTrace، بتخلّيك تكتب one-liner واحد بدل 200 سطر C. مثلاً، علشان تطبع كل syscall بيتم على السيرفر وتعدّه: