مجموعة مترجم BPF (BCC)
BCC عبارة عن مجموعة أدوات لإنشاء برامج فعالة لتتبع النواة ومعالجتها، وتتضمن العديد من الأدوات والأمثلة المفيدة. فهو يستخدم BPF (مرشحات حزم بيركلي) الموسعة، والمعروفة رسميًا باسم eBPF، وهي ميزة جديدة تمت إضافتها لأول مرة إلى Linux 3.15. يتطلب الكثير مما يستخدمه BCC نظام التشغيل Linux 4.1 والإصدارات الأحدث.
تم وصف eBPF بواسطة Ingo Molnár على النحو التالي:
إحدى الميزات الأكثر إثارة للاهتمام في هذه الدورة هي القدرة على إرفاق برامج eBPF (الرمز الثانوي المحدد بواسطة المستخدم والمنفذ بواسطة النواة) بـ kprobes. يسمح هذا بأدوات محددة من قبل المستخدم على صورة النواة المباشرة التي لا يمكن أن تتعطل أو تتعطل أو تتداخل مع النواة بشكل سلبي.
تعمل BCC على تسهيل كتابة برامج BPF، باستخدام أدوات kernel في لغة C (وتتضمن غلاف C حول LLVM)، والواجهات الأمامية في Python وlua. وهي مناسبة للعديد من المهام، بما في ذلك تحليل الأداء والتحكم في حركة مرور الشبكة.
لقطة الشاشة
يتتبع هذا المثال وظيفة نواة الإدخال/الإخراج للقرص، ويقوم بملء رسم بياني لقوة 2 داخل النواة لحجم الإدخال/الإخراج. لتحقيق الكفاءة، يتم إرجاع ملخص الرسم البياني فقط إلى مستوى المستخدم.
# ./bitehist.py
Tracing... Hit Ctrl-C to end.
^C
kbytes : count distribution
0 - > 1 : 3 | |
2 - > 3 : 0 | |
4 - > 7 : 211 | ********** |
8 - > 15 : 0 | |
16 - > 31 : 0 | |
32 - > 63 : 0 | |
64 - > 127 : 1 | |
128 - > 255 : 800 | ************************************** |
يُظهر الناتج أعلاه توزيعًا ثنائي الوضع، حيث كان حجم أكبر وضع وهو 800 إدخال/إخراج يتراوح بين 128 و255 كيلو بايت.
راجع المصدر: bithist.py. ما يتتبعه هذا، وما يخزنه، وكيفية تقديم البيانات، يمكن تخصيصها بالكامل. وهذا يظهر فقط بعضًا من العديد من الإمكانات الممكنة.
التثبيت
راجع INSTALL.md لمعرفة خطوات التثبيت على النظام الأساسي الخاص بك.
التعليمات
راجع التعليمات.txt للتعرف على الأسئلة الأكثر شيوعًا حول استكشاف الأخطاء وإصلاحها.
دليل مرجعي
راجع docs/reference_guide.md للحصول على الدليل المرجعي لواجهات برمجة تطبيقات bcc وbcc/BPF.
محتويات
بعض هذه الملفات عبارة عن ملفات فردية تحتوي على كل من C وPython، والبعض الآخر يحتوي على زوج من ملفات .c و.py، وبعضها عبارة عن أدلة للملفات.
البحث عن المفقودين
أمثلة
- example/tracing/bitehist.py: رسم بياني لحجم الإدخال/الإخراج. أمثلة.
- example/tracing/disksnoop.py: تتبع زمن الوصول للإدخال/الإخراج لجهاز الحظر. أمثلة.
- أمثلة/hello_world.py: طباعة "Hello, World!" للعمليات الجديدة.
- example/tracing/mysqld_query.py: تتبع استعلامات خادم MySQL باستخدام تحقيقات USDT. أمثلة.
- example/tracing/nodejs_http_server.py: تتبع طلبات خادم Node.js HTTP باستخدام تحقيقات USDT. أمثلة.
- أمثلة/تتبع/stacksnoop: تتبع وظيفة kernel وطباعة جميع آثار مكدس kernel. أمثلة.
- الأدوات/statsnoop: تتبع stat () syscalls. أمثلة.
- example/tracing/task_switch.py: حساب مفاتيح المهام باستخدام معرفات PID وإليها.
- أمثلة/tracing/tcpv4connect.py: تتبع اتصالات TCP IPv4 النشطة. أمثلة.
- examples/tracing/trace_fields.py: مثال بسيط لطباعة الحقول من الأحداث التي تم تتبعها.
- أمثلة/تتبع/undump.py: تفريغ حزم مأخذ توصيل UNIX. أمثلة
- examples/tracing/urandomread.py: مثال لنقطة تتبع kernel، والذي يتتبع عشوائيًا:urandom_read. أمثلة.
- أمثلة/tracing/vfsreadlat.py أمثلة/tracing/vfsreadlat.c: توزيع وقت الاستجابة لقراءة VFS. أمثلة.
- example/tracing/kvm_hypercall.py: نقاط تتبع kernel الثابتة المشروطة لأمثلة دخول KVM والخروج والاتصال الفائق.
أدوات
- الأدوات/argdist: عرض قيم معلمات الوظيفة كمخطط تكراري أو عدد تردد. أمثلة.
- الأدوات/bashreadline: طباعة أوامر bash المُدخلة على مستوى النظام. أمثلة.
- الأدوات/bpflist: عرض العمليات باستخدام برامج وخرائط BPF النشطة. أمثلة.
- الأدوات/القدرة: تتبع عمليات التحقق من القدرة الأمنية. أمثلة.
- أدوات/compactsnoop: تتبع أحداث المنطقة المضغوطة باستخدام PID وزمن الوصول. أمثلة.
- الأدوات/الإحصائيات الحرجة: تتبع الأقسام الذرية الحرجة الطويلة في النواة والإبلاغ عنها. أمثلة
- الأدوات/الجمود: اكتشاف حالات الجمود المحتملة في عملية قيد التشغيل. أمثلة.
- الأدوات/drsnoop: تتبع أحداث الاسترداد المباشرة باستخدام PID وزمن الوصول. أمثلة.
- الأدوات/الوظيفة: حساب استدعاءات وظائف kernel. أمثلة.
- الأدوات/الحقن: حقن الخطأ المستهدف مع أمثلة سلسلة الاتصال والمسندات.
- الأدوات/klockstat: يتتبع أحداث قفل كائن المزامنة kernel ويعرض إحصائيات القفل. أمثلة.
- الأدوات/opensnoop: تتبع syscalls open(). أمثلة.
- الأدوات/readhead: عرض أمثلة على أداء ذاكرة التخزين المؤقت للقراءة المسبقة.
- الأدوات/إعادة التتبع: إعادة ضبط حالة التتبع. أداة الصيانة فقط. أمثلة.
- الأدوات/عدد المكدس: حساب استدعاءات وظائف kernel وتتبعات المكدس الخاصة بها. أمثلة.
- الأدوات/syncsnoop: تتبع مزامنة () syscall. أمثلة.
- الأدوات/threadsnoop: قائمة إنشاء سلسلة رسائل جديدة. أمثلة.
- الأدوات/tplist: عرض نقاط تتبع kernel أو تحقيقات USDT وتنسيقاتها. أمثلة.
- الأدوات/التتبع: تتبع الوظائف التعسفية باستخدام المرشحات. أمثلة.
- أدوات/ttysnoop: شاهد البث المباشر من جهاز tty أو pts. أمثلة.
- الأدوات/ucalls: تلخيص استدعاءات الطريقة أو مكالمات نظام Linux باللغات عالية المستوى. أمثلة.
- الأدوات/uflow: طباعة رسم بياني لتدفق الطريقة بلغات عالية المستوى. أمثلة.
- Tools/ugc: تتبع أحداث جمع البيانات المهملة باللغات عالية المستوى. أمثلة.
- Tools/uobjnew: تلخيص أحداث تخصيص الكائنات حسب نوع الكائن وعدد البايتات المخصصة. أمثلة.
- الأدوات/usstat: جمع الأحداث مثل GCs وإنشاءات الخيوط وتخصيصات الكائنات والاستثناءات والمزيد باللغات عالية المستوى. أمثلة.
- الأدوات/uthreads: تتبع أحداث إنشاء سلسلة المحادثات في Java وpthreads الأولية. أمثلة.
أدوات الذاكرة والعمليات
- الأدوات/execsnoop: تتبع العمليات الجديدة عبر مكالمات النظام exec(). أمثلة.
- الأدوات/exitsnoop: إنهاء عملية التتبع (إشارات الخروج والقاتلة). أمثلة.
- الأدوات/killsnoop: تتبع الإشارات الصادرة عن نظام kill(). أمثلة.
- Tools/kvmexit: عرض سبب الخروج وإحصائياته لكل مخرج من الأجهزة الافتراضية. أمثلة.
- الأدوات/memleak: عرض تخصيصات الذاكرة المتميزة للعثور على تسرب الذاكرة. أمثلة.
- الأدوات/oomkill: تتبع قاتل نفاد الذاكرة (OOM). أمثلة.
- الأدوات/pidpersec: عد العمليات الجديدة (عبر الشوكة). أمثلة.
- الأدوات/rdmaucma: تتبع أحداث الوصول إلى مدير اتصال مساحة المستخدم RDMA. أمثلة.
- الأدوات/shmsnoop: تتبع نظام الذاكرة المشتركة للنظام V. أمثلة.
- الأدوات/slabratetop: معدل تخصيص ذاكرة التخزين المؤقت لذاكرة Kernel SLAB/SLUB أعلى. أمثلة.
أدوات الأداء والوقت
- الأدوات/dbslower: تتبع استعلامات MySQL/PostgreSQL بشكل أبطأ من العتبة. أمثلة.
- الأدوات/dbstat: قم بتلخيص زمن انتقال استعلام MySQL/PostgreSQL كمخطط بياني. أمثلة.
- الأدوات/الفاصل الزمني: الفاصل الزمني بين نفس الوظيفة مثل الرسم البياني. أمثلة.
- الأدوات/الوظيفة: وظائف الوقت وإظهار توزيع زمن الوصول الخاص بها. أمثلة.
- Tools/funcslower: تتبع استدعاءات وظائف المستخدم والنواة البطيئة. أمثلة.
- الأدوات/hardirqs: قياس وقت حدث IRQ (المقاطعة الصعبة). أمثلة.
- Tools/mysqld_qslower: تتبع استعلامات خادم MySQL بشكل أبطأ من العتبة. أمثلة.
- الأدوات/ppchcalls: تلخيص عدد ppc hcall وأزمنة الاستجابة. أمثلة.
- الأدوات/softirqs: قياس وقت حدث IRQ الناعم (المقاطعة الناعمة). أمثلة.
- الأدوات/syscount: تلخيص أعداد syscall وأزمنة الاستجابة. أمثلة.
أدوات وحدة المعالجة المركزية والمجدول
- الأدوات/cpudist: تلخيص وقت تشغيل وحدة المعالجة المركزية وخارجها لكل مهمة في شكل رسم بياني. أمثلة
- Tools/cpuunclaimed: عينة من قوائم انتظار تشغيل وحدة المعالجة المركزية وحساب وحدة المعالجة المركزية الخاملة التي لم تتم المطالبة بها. أمثلة
- Tools/llcstat: تلخيص مراجع ذاكرة التخزين المؤقت لوحدة المعالجة المركزية (CPU) والأخطاء حسب العملية. أمثلة.
- الأدوات/offcputime: تلخيص الوقت خارج وحدة المعالجة المركزية عن طريق تتبع مكدس kernel. أمثلة.
- الأدوات/وقت الاستيقاظ: تلخيص الوقت المحظور من خلال مكدس kernel خارج وحدة المعالجة المركزية ومكدس التنبيه. أمثلة.
- الأدوات/الملف الشخصي: استخدام وحدة المعالجة المركزية لملف التعريف عن طريق أخذ عينات من تتبعات المكدس على فترات زمنية محددة. أمثلة.
- أدوات/runqlat: زمن استجابة قائمة الانتظار (المجدول) كمخطط بياني. أمثلة.
- Tools/runqlen: تشغيل طول قائمة الانتظار كرسم بياني. أمثلة.
- الأدوات/runqslower: تتبع تأخيرات جدولة العمليات الطويلة. أمثلة.
- الأدوات/وقت الاستيقاظ: تلخيص وقت النوم للاستيقاظ من خلال مكدس Waker kernel. أمثلة.
- الأدوات/wqlat: تلخيص زمن انتظار العمل في قائمة انتظار العمل. أمثلة.
أدوات الشبكة والمآخذ
- الأدوات/gethostlatency: إظهار زمن الاستجابة لمكالمات getaddrinfo/gethostbyname[2]. أمثلة.
- الأدوات/bindsnoop: تتبع مكالمات نظام IPv4 وIPv6 bind() (bind()). أمثلة.
- Tools/netqtop Tools/netqtop.c: تتبع وعرض توزيع الحزم على قوائم انتظار NIC. أمثلة.
- الأدوات/sofdsnoop: تتبع FDs عبر مآخذ توصيل Unix. أمثلة.
- الأدوات/العزل: تتبع الاستماع إلى مقبس TCP. أمثلة.
- الأدوات/sslsniff: شم البيانات المكتوبة والمقروءة OpenSSL. أمثلة.
- الأدوات/tcpaccept: تتبع اتصالات TCP السلبية (قبول ()). أمثلة.
- الأدوات/tcpconnect: تتبع اتصالات TCP النشطة (connect()). أمثلة.
- الأدوات/tcpconnlat: تتبع زمن انتقال اتصال TCP النشط (connect()). أمثلة.
- الأدوات/tcpdrop: تتبع قطرات TCP المستندة إلى kernel مع التفاصيل. أمثلة.
- الأدوات/tcplife: تتبع جلسات TCP وتلخيص عمرها. أمثلة.
- الأدوات/tcpretrans: تتبع عمليات إعادة إرسال TCP وTLPs. أمثلة.
- الأدوات/tcprtt: تتبع وقت رحلة TCP ذهابًا وإيابًا. أمثلة.
- الأدوات/tcpstates: تتبع تغييرات حالة جلسة TCP مع الفترات. أمثلة.
- الأدوات/tcpsubnet: تلخيص وتجميع إرسال TCP عبر الشبكة الفرعية. أمثلة.
- الأدوات/tcpsynbl: عرض تراكم TCP SYN. أمثلة.
- الأدوات/tcptop: تلخيص إنتاجية إرسال/تسجيل TCP بواسطة المضيف. أعلى لTCP. أمثلة.
- الأدوات/tcptracer: تتبع اتصالات TCP المنشأة (connect()، Accept()، Close()). أمثلة.
- الأدوات/tcpcong: تتبع مدة حالة التحكم في ازدحام مأخذ توصيل TCP. أمثلة.
أدوات التخزين وأنظمة الملفات
- الأدوات/حجم البت: إظهار الرسم البياني لحجم الإدخال/الإخراج لكل عملية. أمثلة.
- الأدوات/ذاكرة التخزين المؤقت: تتبع نسبة مرات الوصول إلى ذاكرة التخزين المؤقت للصفحة. أمثلة.
- الأدوات/cachetop: تتبع نسبة مرات الدخول/الفشل في ذاكرة التخزين المؤقت للصفحة حسب العمليات. أمثلة.
- أدوات/dcsnoop: تتبع عمليات البحث في ذاكرة التخزين المؤقت لإدخال الدليل (dcache). أمثلة.
- الأدوات/dcstat: إحصائيات ذاكرة التخزين المؤقت لإدخال الدليل (dcache). أمثلة.
- الأدوات/الكمون الحيوي: تلخيص زمن انتقال الإدخال/الإخراج لجهاز الكتلة كرسم بياني. أمثلة.
- أدوات/biotop: الجزء العلوي للأقراص: تلخيص الإدخال/الإخراج لجهاز الكتلة حسب العملية. أمثلة.
- الأدوات/النمط الحيوي: تحديد أنماط الوصول العشوائي/المتسلسل إلى القرص. أمثلة.
- الأدوات/biosnoop: تتبع الإدخال/الإخراج لجهاز كتلة مع PID وزمن الوصول. أمثلة.
- الأدوات/dirtop: يقرأ الملف ويكتبه حسب الدليل. أعلى للدلائل. أمثلة.
- الأدوات/filelife: تتبع عمر الملفات قصيرة العمر. أمثلة.
- الأدوات/filegone: تتبع سبب اختفاء الملف (حذفه أو إعادة تسميته). أمثلة.
- الأدوات/الملفات أقل: تتبع قراءة وكتابة الملف المتزامن البطيء. أمثلة.
- الأدوات/filetop: يقرأ الملف ويكتبه حسب اسم الملف والعملية. أعلى للملفات. أمثلة.
- الأدوات/mdflush: تتبع أحداث التدفق md. أمثلة.
- الأدوات/mountsnoop: تتبع عمليات التثبيت ومكالمات النظام umount على مستوى النظام. أمثلة.
- الأدوات/virtiostat: عرض إحصائيات الإدخال والإخراج لجهاز VIRTIO. أمثلة.
أدوات أنظمة الملفات
- الأدوات/btrfsdist: تلخيص توزيع وقت استجابة عملية btrfs كرسم بياني. أمثلة.
- الأدوات/btrfsslower: تتبع عمليات btrfs البطيئة. أمثلة.
- Tools/ext4dist: تلخيص توزيع زمن انتقال عملية ext4 كرسم بياني. أمثلة.
- الأدوات/ext4slower: تتبع عمليات ext4 البطيئة. أمثلة.
- أدوات/nfsslower: تتبع عمليات NFS البطيئة. أمثلة.
- أدوات/nfsdist: تلخيص توزيع زمن انتقال عملية NFS في شكل رسم بياني. أمثلة.
- الأدوات/vfscount: حساب مكالمات VFS. أمثلة.
- Tools/vfsstat: قم بإحصاء بعض مكالمات VFS مع إخراج العمود. أمثلة.
- Tools/xfsdist: تلخيص توزيع زمن انتقال عملية XFS في شكل رسم بياني. أمثلة.
- Tools/xfsslower: تتبع عمليات XFS البطيئة. أمثلة.
- Tools/zfsdist: قم بتلخيص توزيع زمن انتقال عملية ZFS في شكل رسم بياني. أمثلة.
- Tools/zfsslower: تتبع عمليات ZFS البطيئة. أمثلة.
الشبكات
أمثلة:
- الأمثلة/الشبكات/distributed_bridge/: مثال على الجسر الموزع.
- examples/networking/http_filter/: مثال بسيط لمرشح HTTP.
- examples/networking/simple_tc.py: مثال بسيط للتحكم في حركة المرور.
- أمثلة/networking/simulation.py: مساعد المحاكاة.
- أمثلة/networking/neighbor_sharing/tc_neighbor_sharing.py أمثلة/networking/neighbor_sharing/tc_neighbor_sharing.c: التصنيف لكل IP وتحديد المعدل.
- الأمثلة/الشبكات/tunnel_monitor/: مراقبة تدفقات حركة المرور بكفاءة.
- أمثلة/شبكات/vlan_learning/vlan_learning.py أمثلة/vlan_learning.c: حركة مرور Demux Ethernet إلى مساحات أسماء العمال +.
الاستبطان BPF
الأدوات التي تساعد على استبطان برامج BPF.
- introspection/bps.c: قم بإدراج جميع برامج BPF المحملة في النواة. "ps" لبرامج BPF. أمثلة.
تحفيز
يضمن BPF أن البرامج المحملة في النواة لا يمكن أن تتعطل، ولا يمكن أن تعمل إلى الأبد، ولكن مع ذلك فإن BPF ذو غرض عام يكفي لإجراء العديد من أنواع الحسابات العشوائية. حاليًا، من الممكن كتابة برنامج بلغة C سيتم تجميعه في برنامج BPF صالح، ومع ذلك فمن الأسهل إلى حد كبير كتابة برنامج C سيتم تجميعه في BPF غير صالح (C مثل ذلك). ولن يعرف المستخدم إلا بعد محاولة تشغيل البرنامج ما إذا كان صالحًا أم لا.
مع الواجهة الأمامية الخاصة بـ BPF، يجب أن يكون الشخص قادرًا على الكتابة باللغة وتلقي تعليقات من المترجم حول الصلاحية فيما يتعلق بالواجهة الخلفية لـ BPF. تهدف مجموعة الأدوات هذه إلى توفير واجهة أمامية يمكنها فقط إنشاء برامج BPF صالحة مع الاستمرار في الاستفادة من مرونتها الكاملة.
علاوة على ذلك، فإن عمليات التكامل الحالية مع BPF لها سير عمل فوضوي، يتضمن أحيانًا التجميع مباشرة في شجرة مصدر Linux kernel. تهدف سلسلة الأدوات هذه إلى تقليل الوقت الذي يقضيه المطور في تجميع BPF، والتركيز بدلاً من ذلك على التطبيقات التي يمكن كتابتها والمشكلات التي يمكن حلها باستخدام BPF.
تشمل ميزات مجموعة الأدوات هذه ما يلي:
- سير عمل BPF الشامل في مكتبة مشتركة
- لغة C معدلة للواجهات الخلفية لـ BPF
- التكامل مع الواجهة الخلفية llvm-bpf لـ JIT
- التحميل الديناميكي (إلغاء) لبرامج JITed
- دعم خطافات kernel BPF: مرشحات المقبس، ومصنفات tc، وإجراءات tc، وkprobes
- الارتباطات لبيثون
- أمثلة على مرشحات المقبس، ومصنفات tc، وkprobes
- أدوات قائمة بذاتها لتتبع نظام التشغيل
في المستقبل، من المحتمل أن يتم دعم المزيد من الارتباطات إلى جانب لغة بايثون. لا تتردد في إضافة دعم للغة التي تختارها وإرسال طلب سحب!
دروس
- docs/tutorial.md: استخدام أدوات نسخة مخفية لحل مشكلات الأداء واستكشاف الأخطاء وإصلاحها والشبكات.
- docs/tutorial_bcc_python_developer.md: تطوير برامج نسخة مخفية جديدة باستخدام واجهة Python.
الشبكات
في قمة ريد هات 2015، تم عرض تواصل التغيير السلوكي (BCC) كجزء من جلسة حول BPF. تتم محاكاة بيئة vxlan متعددة المضيفين ويتم استخدام برنامج BPF لمراقبة إحدى الواجهات المادية. يحتفظ برنامج BPF بإحصائيات حول عناوين IP الداخلية والخارجية التي تعبر الواجهة، ويقوم مكون مساحة المستخدم بتحويل هذه الإحصائيات إلى رسم بياني يوضح توزيع حركة المرور بتفاصيل متعددة. انظر الكود هنا.
المساهمة
هل أنت متحمس بالفعل لارتكاب بعض التعليمات البرمجية؟ فيما يلي بعض الموارد للانضمام إلى المناقشات في مجتمع IOVisor ومعرفة ما تريد العمل عليه.
- القائمة البريدية: https://lists.iovisor.org/mailman/listinfo/iovisor-dev
- آي آر سي: #iovisor على irc.oftc.net
- تعقب مشكلة نسخة مخفية الوجهة: مشكلات جيثب
- دليل للبرامج النصية المساهمة: CONTRIBUTING-SCRIPTS.md
روابط خارجية
هل تبحث عن مزيد من المعلومات حول BCC وكيفية استخدامها؟ يمكنك العثور على روابط لمحتوى BCC آخر على الويب في LINKS.md.