المستوي: مبتدئ
لو محتاج تعرف بالظبط أي system call بياكل CPU السيرفر، أو أي ملف بيتفتح كل ثانية، أو أي packet داخل أي pod في Kubernetes، eBPF بيوريك ده كله بأمر واحد. بدون ما تعدّل سطر كود في تطبيقك، وبدون ما تعمل restart للسيرفر، وبـ overhead أقل من 2%.
eBPF للمبتدئ: شوف كل syscall على السيرفر بدون تعديل سطر كود
المشكلة باختصار
السيرفر بيعمل CPU 87% فجأة، والـ logs نضيفة، وكل dashboard بتاعك بيقولك "كله تمام". الطرق التقليدية للتشخيص بتطلب منك تنزّل agent جديد، أو تشغّل strace اللي بيبطّأ التطبيق 3x، أو تعدّل الكود علشان تضيف tracing. الثلاثة دول مش حلول، دول تنازلات. eBPF بيخلّيك تشوف اللي بيحصل جوّا الـ kernel نفسه، في الإنتاج مباشرة، بـ overhead صغير جدًا.
مثال يقرّب الفكرة
تخيّل إنك مدير مطعم كبير وفيه 40 جرسون شغّالين. لما طلب يتأخر، فيه 3 طرق تعرف بيها السبب:
- الطريقة الأولى: توقف كل جرسون وتسأله "إنت بتعمل إيه دلوقتي؟". بتوقف شغل الكل (=
strace). - الطريقة الثانية: تطلب من كل جرسون يكتب يومية مفصّلة. وقت ضايع وورق كتير (= application logging يدوي).
- الطريقة الثالثة: تحط كاميرا صامتة في السقف بتسجّل حركة الكل بدون ما تأثّر عليهم. ده eBPF.
الكاميرا (eBPF) شايفة كل حاجة من فوق، بتكلفة بسيطة، وبدون تعديل في طريقة شغل الجرسون.
ما هو eBPF علميًا
eBPF (extended Berkeley Packet Filter) هو virtual machine صغير جوّا الـ Linux kernel بيشغّل برامج موقّعة وآمنة عند نقاط محددة (probes) في الكيرنل. لمّا syscall زي open() بيتنفّذ، الكيرنل بيشغّل برنامج eBPF بتاعك قبل أو بعد الاستدعاء، وبيمرّر له الـ context كامل. البرنامج بيتجمّع لـ bytecode بيتحقق منه verifier (بيمنع الـ loops اللانهائية واللي ممكن يعمل crash للكيرنل) وبعدين JIT compiler بيحوّله لـ native instructions.
النتيجة: monitoring جوّا الكيرنل، بدون kernel modules خطرة، وبدون لمس كود التطبيق. التقنية موجودة من 2014 لما Alexei Starovoitov أضاف eBPF لـ kernel 3.18، ودلوقتي بتشغّل Cilium وFalco وPixie وDatadog، وKubernetes networking في Google.
مثال تنفيذي قابل للنسخ
هنشغّل أبسط أداة eBPF اسمها bpftrace. الأمر اللي تحت بيعرض كل process بيفتح ملف على السيرفر، لحظة بلحظة:
# تركيب bpftrace على Ubuntu 22.04+
sudo apt-get install -y bpftrace
# اعرض كل ملف بيتفتح + اسم الـ process
sudo bpftrace -e '
tracepoint:syscalls:sys_enter_openat {
printf("%-16s %s\n", comm, str(args->filename));
}
'
# مخرج فعلي بعد ثانيتين:
# nginx /etc/nginx/conf.d/api.conf
# postgres /var/lib/postgresql/16/main/pg_stat_tmp/global.stat
# python3 /home/app/.cache/configstore.json
# node /app/node_modules/express/package.json