يقوم مشروع bpftime بتطوير تطبيق مساحة المستخدم لـ eBPF

تم تقديم مشروع bpftime، الذي يقوم بتطوير وقت تشغيل وجهاز افتراضي لتنفيذ معالجات eBPF في مساحة المستخدم. يسمح Bpftime لبرامج تتبع eBPF وتدخل العمليات بالعمل بالكامل في مساحة المستخدم، باستخدام ميزات مثل اعتراض مكالمات النظام والبرمجة. تجدر الإشارة إلى أنه من خلال التخلص من مفاتيح تبديل السياق غير الضرورية، يمكن لـ bpftime تحقيق انخفاض بمقدار عشرة أضعاف في الحمل مقارنة باستخدام وظيفة uprobe وuretprobe التي توفرها Linux kernel. بالإضافة إلى ذلك، يعمل bpftime على تبسيط عملية تصحيح الأخطاء إلى حد كبير، ويمكن استخدامه على الأنظمة التي لا تحتوي على Linux kernel، ولا يتطلب الامتيازات المرتفعة المطلوبة لتحميل تطبيق eBPF في kernel. كود المشروع مكتوب بلغة C/C++ ويتم توزيعه بموجب ترخيص MIT.

يتم تنفيذ اعتراض مكالمات النظام وتكامل عمليات الفحص الأولية باستخدام تقنية إعادة كتابة التعليمات البرمجية القابلة للتنفيذ (إعادة الكتابة الثنائية)، حيث يتم استبدال استدعاءات مكالمات النظام ونقاط الدخول والوظائف المحلية بالانتقال إلى معالجات تصحيح الأخطاء من خلال تعديل رمز الجهاز التطبيق المنفذ، وهو أكثر فعالية من تنظيم الاعتراض باستخدام uprobe على مستوى Linux kernel.

يتم دعم عمليات استبدال الوظائف أو تغييرها، وإرفاق المعالجات (الخطافات) والمرشحات، وإعادة توجيه أو حظر أو استبدال معلمات استدعاء النظام، واعتراض نقاط الدخول والخروج للوظائف، بالإضافة إلى استبدال المعالج بإزاحة تعسفية في الكود. يمكن ربط Bpftime بأي عملية قيد التشغيل على النظام دون الحاجة إلى إعادة تشغيله أو إعادة بنائه. يمكن إجراء استبدال bpftime في العمليات لتشغيل العمليات عبر ptrace ولتحميل العمليات عبر LD_PRELOAD.

كجزء من bpftime، يتم تطوير وقت تشغيل يسمح لك بإرفاق برامج eBPF باستدعاء النظام واستكشاف نقاط التتبع؛ جهاز eBPF الظاهري مع JIT للتنفيذ المعزول لبرامج eBPF على مستوى عملية المستخدم (يتم دعم تجميع AOT أيضًا)؛ عملية خلفية للتفاعل مع النواة وتنظيم التوافق مع النظام الفرعي uprobe للنواة (يدعم bpftime وضع تحميل eBPF في مساحة المستخدم من النواة لتنظيم التعاون مع برامج eBPF في النواة، المستخدمة، على سبيل المثال، لمعالجة kprobe أو ضبط مرشحات الشبكة).

تم تصميم جهاز eBPF الظاهري كمكتبة إضافية ويوفر واجهة برمجة تطبيقات مشابهة لـ ubpf، مما يسمح باستخدامه لدمج وظائف eBPF في مشاريع أخرى. لتجميع ملخص البيانات من عدة عمليات، يتم دعم إنشاء خرائط eBPF المشتركة الموجودة في الذاكرة المشتركة. جنبًا إلى جنب مع bpftime، يمكن استخدام معالجات eBPF القياسية المكتوبة للاستخدام في kernel، ويمكن استخدام الأدوات القياسية المستندة إلى clang و libbpf للتجميع.

باستخدام bpftime، يمكن تنفيذ أنظمة التتبع مثل BCC وbpftrace وDeepflow في مساحة المستخدم. على سبيل المثال، أظهرنا استخدام البرنامج النصي sslsniff من إطار عمل BCC لتحليل وحفظ حركة المرور المشفرة في nginx. في الاختبارات التي تم إجراؤها، انخفض أداء nginx بنسبة 58% عند تنفيذ sslsniff على جانب النواة، وبنسبة 12.3% عند نقل المعالج إلى مساحة المستخدم.

بنية تتبع العملية باستخدام eBPF الأصلي في النواة:

يقوم مشروع bpftime بتطوير تطبيق مساحة المستخدم لـ eBPF

بنية تتبع مساحة المستخدم باستخدام bpftime:

يقوم مشروع bpftime بتطوير تطبيق مساحة المستخدم لـ eBPF

الوضع المختلط، حيث يعمل bpftime مع eBPF في kernel، على سبيل المثال، لتثبيت مرشحات الشبكة أو نقل المعالجات الفردية إلى مساحة المستخدم:

يقوم مشروع bpftime بتطوير تطبيق مساحة المستخدم لـ eBPF

تتضمن الخطط المستقبلية: القدرة على استبدال الاستثناءات (حقن الخطأ)؛ التصحيح السريع (Hot Patching) لتغيير منطق التشغيل أو تصحيح الأخطاء في التجميعات الثنائية؛ إنشاء وحدة نمطية لـ Nginx تتيح لك إنشاء امتدادات باستخدام برامج eBPF (على سبيل المثال، لاختيار المسار الديناميكي والتخزين المؤقت وتطبيق سياسات الأمان وموازنة التحميل)؛ توسيع قدرات نظام FUSE الفرعي (على سبيل المثال، إنشاء امتدادات لـ FS للتخزين المؤقت أو التحكم في الوصول في شكل برامج eBPF).

المصدر: opennet.ru

إضافة تعليق