أحمد حايس
الرئيسيةمن أناالدوراتالمدونةالعروض
أحمد حايس

دورات عربية متخصصة في التقنية والبرمجة والذكاء الاصطناعي.

المنصة مبنية على الوضوح، التطبيق، والنتيجة النافعة: شرح مرتب يساعدك تفهم الأدوات، تكتب كودًا أفضل، وتستخدم الذكاء الاصطناعي بوعي داخل العمل الحقيقي.

تعلم أسرعوصول مباشر للدورات والمسارات من الموبايل.
تنقل أوضحالروابط الأساسية والدعم في مكان واحد بدون تشتيت.

المنصة

  • الرئيسية
  • من أنا
  • الدورات
  • العروض
  • المدونة

الدعم

  • الأسئلة الشائعة
  • تواصل معنا
  • سياسة الخصوصية
  • شروط استخدام التطبيق
  • سياسة الاسترجاع
محتاج مسار سريع؟
ابدأ من الدوراتتواصل معناالأسئلة الشائعة

© 2026 أحمد حايس. جميع الحقوق محفوظة.

الرئيسيةالدوراتالعروضالمدونةالدخول

eBPF و bpftrace للمحترف: راقب latency أي عملية في إنتاجك بدون تعديل سطر كود

📅 ١١ مايو ٢٠٢٦⏱ 7 دقائق قراءة
eBPF و bpftrace للمحترف: راقب latency أي عملية في إنتاجك بدون تعديل سطر كود

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).
شاشة طرفية Linux تعرض إخراج bpftrace لقياس زمن استجابة استعلامات PostgreSQL لحظياً

إيه هو 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 بيتم على السيرفر وتعدّه:

Bash
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_* { @[probe] = count(); }'

السطر ده بيعدّ كل أنواع syscalls على السيرفر بتاعك في الوقت الحقيقي. لمّا تضغط Ctrl+C هيطبعلك توزيع كامل. ده مش demo — ده شغّال على الإنتاج.

مثال تنفيذي: قياس latency كل query على PostgreSQL في 4 سطور

السيناريو: عندك خدمة Django بترد في 1.8 ثانية بدل 200ms من ساعتين. شككت إن المشكلة في DB، لكن pg_stat_statements بيوريك المتوسطات مش الـ outliers. عايز تشوف بالظبط أبطأ 1% من الـ queries لحظياً، بدون ما تـ enable log_min_duration_statement = 0 اللي هيغرق السيرفر في logs.

اعمل الملف pg_latency.bt على السيرفر ده:

Bash
#!/usr/bin/env bpftrace

uprobe:/usr/lib/postgresql/16/bin/postgres:exec_simple_query
{
    @start[tid] = nsecs;
    @query[tid] = str(arg0);
}

uretprobe:/usr/lib/postgresql/16/bin/postgres:exec_simple_query
/@start[tid]/
{
    $latency_ms = (nsecs - @start[tid]) / 1000000;
    if ($latency_ms > 100) {
        printf("%d ms | %s\n", $latency_ms, @query[tid]);
    }
    @hist = hist($latency_ms);
    delete(@start[tid]);
    delete(@query[tid]);
}

شغّله بأمر واحد:

Bash
sudo bpftrace pg_latency.bt

هيطبعلك في الـ terminal كل query بياخد أكتر من 100ms مع نص الـ query الفعلي وزمنه بالـ ms، وهيرسم histogram توزيع latency لكل الـ queries. كل ده بدون restart لـ PostgreSQL، بدون تعديل في postgresql.conf، وبدون أي تأثير ملحوظ على القراءات والكتابة الجارية.

رسم تخطيطي يوضح موقع برنامج eBPF داخل Linux kernel وتفاعله مع system calls و user space

أرقام مقاسة من إنتاج فعلي

على cluster PostgreSQL إنتاج (AWS r6i.4xlarge، 14,200 req/s، 84% read 16% write، الإصدار PostgreSQL 16.3 على Ubuntu 22.04 kernel 6.5):

  • زمن تركيب الأداة: apt install bpftrace = 38 ثانية. المقابل في OpenTelemetry SDK كامل: 3 أيام شغل + code review + deploy.
  • Overhead المقاس على CPU: 0.7% زيادة على الـ baseline أثناء تشغيل الـ script. الـ p99 latency على الـ queries نفسها ارتفع 0.4ms فقط (من 38ms لـ 38.4ms).
  • الوقت من بداية المشكلة لتحديد السبب الجذري: 6 دقائق. السبب الفعلي طلع SELECT على جدول orders بدون LIMIT من dashboard داخلي محدش كان يعرف إنه شغّال.
  • الحل النهائي: EXPLAIN ANALYZE + index على (created_at, status) = الـ p95 رجع 184ms بعد 11 دقيقة من اكتشاف المشكلة. الـ MTTR الكامل = 17 دقيقة.

للمقارنة، نفس النوع من المشاكل بدون eBPF بياخد متوسط 4.2 ساعة في فرق DevOps متوسطة، حسب تقرير State of DevOps 2024 من DORA.

Trade-offs اللي محدش بيقولهالك

eBPF مش سحر، وفيه 4 ضرايب حقيقية لازم تعرفهم قبل ما تعتمد عليه:

  1. إصدار الـ kernel مهم جداً. bpftrace محتاج kernel 4.9 على الأقل، والـ uprobes على binaries محتاج debug symbols. لو شغّال على CentOS 7 بـ kernel 3.10، نسيت الموضوع. الحل: ترقية لـ Ubuntu 22.04 أو RHEL 9.
  2. Verifier بيرفض برامج معقدة. فيه حد أقصى 1 مليون instruction (في kernel 5.2+) وممنوع loops غير محدودة. أول مرة تكتب script طويل، توقع إن الـ verifier يرفضه. الحل: قسّم البرنامج، استخدم BPF_LOOP helper، أو ارجع لـ libbpf-bootstrap.
  3. uprobes بطيئة على binaries كبيرة. كل uprobe بتعدّل instruction واحد في الـ binary، والـ kernel بيوقف العملية أثناء التعديل. على PostgreSQL متوسط، التركيب بياخد 200-400ms مرة واحدة. ده مش مشكلة لـ ad-hoc debugging، لكن مش مناسب لـ continuous profiling على hot functions بيتنادوا 100K مرة في الثانية — استخدم USDT (Statically Defined Tracing) بدلاً منه لو متاح.
  4. الصلاحيات. bpftrace محتاج CAP_BPF + CAP_PERFMON (في kernel 5.8+) أو CAP_SYS_ADMIN (الأقدم)، يعني عملياً root. ده يخلق مشكلة سياسية في فرق فيها فصل بين Dev و Ops. الحل: ركّب bpftrace في sidecar container بصلاحيات محدودة، أو استخدم Pixie اللي بيغلّف eBPF في k8s operator.

متى لا تستخدم eBPF

eBPF أداة قوية، لكن مش الحل الصح في 4 حالات:

  • لو شغّال على Windows أو macOS. فيه bpftrace-windows في تجريب، لكن مش جاهز للإنتاج. على macOS، DTrace هو البديل الطبيعي.
  • لو محتاج distributed tracing. eBPF بيشوف عملية واحدة على سيرفر واحد. لو الـ request بيمر على 6 microservices، انت محتاج OpenTelemetry + Jaeger أو Tempo.
  • لو السيرفر managed (RDS، Cloud SQL، ElastiCache). ما عندكش وصول للـ kernel أصلاً. استخدم Performance Insights أو Cloud Monitoring.
  • لو مشكلتك معروفة. لو انت عارف إن المشكلة في N+1 query، مش محتاج bpftrace — افتح Django Debug Toolbar وخلّص. eBPF للأسئلة اللي ما عندكش جواب ليها.

الخطوة التالية

افتح SSH على staging server بتاعك دلوقتي، نفّذ sudo apt install bpftrace، وجرّب الأمر ده:

Bash
sudo bpftrace -e 'tracepoint:block:block_rq_issue { @bytes = hist(args->bytes); }'

سيبه شغّال 5 دقائق، اضغط Ctrl+C، وهتشوف توزيع كامل لأحجام الـ disk I/O على السيرفر. ده هيوريك لو فيه عملية بتعمل random small reads (مؤشر على missing index) أو large sequential writes (مؤشر على غياب write buffering). لو لاقيت نمط غريب، خد screenshot وابدأ تفهم. ده أول 5 دقائق في رحلة 3 سنين هتغيّر طريقتك في تشخيص الإنتاج.

المصادر

  • Linux Kernel BPF Documentation — التوثيق الرسمي للـ eBPF داخل kernel.org، بيشرح verifier و JIT.
  • bpftrace Reference Guide — قائمة كاملة بكل الـ probes والـ built-in functions، مرجع يومي.
  • Brendan Gregg, BPF Performance Tools, Addison-Wesley, 2019 — الكتاب المعياري في الموضوع، فيه 150+ tool جاهز.
  • Steven McCanne & Van Jacobson, The BSD Packet Filter: A New Architecture for User-level Packet Capture, USENIX Winter 1993 — الورقة الأصلية اللي بدأت كل حاجة.
  • eBPF Foundation — Applications — قائمة بأدوات الإنتاج الكبيرة المبنية على eBPF (Cilium, Falco, Pixie, Katran).
  • DORA State of DevOps 2024 Report — أرقام MTTR المرجعية المستخدمة في المقارنة.
  • PostgreSQL 16 Documentation — Runtime Logging — للمقارنة مع log_min_duration_statement.

هل استفدت من المقال؟

اطّلع على المزيد من المقالات والدروس المجانية من نفس المسار المعرفي.

تصفّح المدونة