مرحبا يا هبر! أوجه انتباهكم إلى ترجمة لمقال بقلم بريندان جريج على موقع eBPF
كان هناك ما لا يقل عن 24 عرضًا تقديميًا من eBPF في مؤتمر Linux Plumbers. سرعان ما أصبحت تقنية لا تقدر بثمن ، ولكن أيضًا مهارة مطلوبة. ربما ترغب في تعيين بعض الأهداف للعام الجديد - تعلم eBPF!
يجب أن يعني المصطلح eBPF شيئًا مهمًا ، مثل Virtual Kernel Instruction Set (VKIS) ، لكن أصله هو تصفية Berkeley Packet ممتدة. وهو قابل للتطبيق في العديد من المناطق ، مثل أداء الشبكة ، والجدران النارية ، والأمن ، والتتبع ، وبرامج تشغيل الأجهزة. بالنسبة للبعض منهم ، هناك الكثير من المعلومات المتاحة مجانًا على الإنترنت - على سبيل المثال ، البحث عن المفقودين ، ولكن بالنسبة للبعض الآخر ، فهي ليست بعد. يشير مصطلح التتبع إلى أدوات تحليل الأداء والمراقبة التي يمكنها توليد معلومات لكل حدث. ربما تكون قد استخدمت بالفعل التتبع - tcpdump و strace هي أدوات تتبع متخصصة.
في هذا المنشور ، سوف أصف عملية دراسة استخدام eBPF لأغراض التتبع ، مجمعة في أقسام للمبتدئين والمستخدمين المتقدمين والمتقدمين. باختصار:
- المبتدئين: إطلاق أدوات مخفية
- من ذوي الخبرة: تطوير أدوات bpftrace
- المتقدمة: تطوير أدوات مخفية ، المساهمة في مخفية و bpftrace
مبتدئين
1. ما هي eBPF و bcc و bpftrace و iovisor؟
يفعل eBPF نفس الشيء بالنسبة لنظام Linux كما يفعل JavaScript في HTML ، نوعًا ما. لذا ، بدلاً من موقع HTML ثابت ، يتيح لك JavaScript تحديد البرامج المصغرة التي يتم تنفيذها على الأحداث - مثل النقر بالماوس - والتي تعمل في جهاز ظاهري آمن في المستعرض. ومع eBPF - بدلاً من تحرير kernel ، يمكنك الآن كتابة برامج مصغرة تعمل على أحداث مثل القرص I / O على جهاز ظاهري آمن في kernel. في الواقع ، يشبه eBPF جهاز v8 الظاهري الذي يقوم بتشغيل JavaScript من JavaScript نفسها. eBPF جزء من Linux kernel.
البرمجة مباشرة في eBPF صعبة للغاية ، تمامًا مثل v8 bytecode. لكن لا أحد يقوم بالترميز في الإصدار الثامن: كل شخص يكتب في JavaScript ، أو غالبًا في إطار أعلى JavaScript (jQuery ، Angular ، React ، إلخ). نفس الشيء مع eBPF. سيستخدمها الناس ، وكتابة التعليمات البرمجية من خلال الأطر. أهمها للبحث عن المفقودين هي bcc و bpftrace . إنهم لا يعيشون في قاعدة كود kernel ؛ إنهم يعيشون في مشروع Linux Foundation على جيثب يسمى iovisor .
2. هل من الممكن تتبع باستخدام eBPF؟
توضح هذه الأداة المساعدة المستندة إلى eBPF جلسات TCP المنشأة بالكامل بمعرف العملية (PID) واسم الأمر (COMM) والبايتات المرسلة والمستلمة (TX_KB و RX_KB) والمدة بالمللي ثانية (MS):
# tcplife PID COMM LADDR LPORT RADDR RPORT TX_KB RX_KB MS
22597 recordProg 127.0.0.1 46644 127.0.0.1 28527 0 0 0.23
3277 redis-serv 127.0.0.1 28527 127.0.0.1 46644 0 0 0.28
22598 curl 100.66.3.172 61620 52.205.89.26 80 - 1 91.79
22604 curl 100.66.3.172 44400 52.204.43.121 80 0 1 121.38
22624 recordProg 127.0.0.1 46648 127.0.0.1 28527 0 0 0.22
3277 redis-serv 127.0.0.1 28527 127.0.0.1 46648 0 0 0.27
22647 recordProg 127.0.0.1 46650 127.0.0.1 28527 0 0 0.21
3277 redis-serv 127.0.0.1 28527 127.0.0.1 46650 0 0 0.26
[...]
لا يجعل eBPF هذا ممكنًا - يمكنني إعادة كتابة tcplife لاستخدام تقنيات kernel الأقدم. ولكن إذا قمت بذلك ، فلن نتمكن من تشغيل مثل هذه الأداة في الإنتاج بسبب انخفاض الأداء أو مشكلات الأمان أو كليهما. لقد جعل eBPF هذه الأداة عملية : إنها فعالة وآمنة. على سبيل المثال ، لا يتتبع كل حزمة ، كما حدث مع الأساليب السابقة ، وقد يؤدي ذلك إلى انخفاض مفرط في الأداء. بدلاً من ذلك ، يتعقب أحداث جلسة TCP فقط التي تحدث بشكل أقل كثيرًا. هذا يجعل النفقات العامة منخفضة جدًا بحيث يمكننا تشغيل هذه الأداة في وضع 24 × 7.
3. كيف يمكنني استخدام هذا؟
يجب أن يبدأ المبتدئين في استكشاف نسخة مخفية الوجهة. راجع إرشادات تثبيت bcc لنظام التشغيل الخاص بك. بالنسبة إلى أوبونتو ، يبدو الأمر كما يلي:
# sudo apt-get update
# sudo apt-get install bpfcc-tools
# sudo / usr / share / bcc / tools / opensnoop PID COMM FD ERR PATH
25548 gnome-shell 33 0 / proc / self / stat
10190 opensnoop -1 2 / usr/lib/python2.7/encodings/ascii.x86_64-linux-gnu.so
10190 opensnoop -1 2 / usr/lib/python2.7/encodings/ascii.so
10190 opensnoop -1 2 / usr/lib/python2.7/encodings/asciimodule.so
10190 opensnoop 18 0 / usr/lib/python2.7/encodings/ascii.py
10190 opensnoop 19 0 / usr/lib/python2.7/encodings/ascii.pyc
25548 gnome-shell 33 0 / proc / self / stat
29588 استطلاع الجهاز 4 0 / dev / bus / usb
^ ج
هنا انتهى بي الأمر opennoop لاختبار وظيفة الأدوات. إذا وصلت إلى هذا الحد ، فبالتأكيد استخدمت eBPF!
بالنسبة لشركات مثل Netflix و Facebook ، يتم تثبيت bcc على جميع الخوادم افتراضيًا. ربما تريد أن تفعل الشيء نفسه.
4. هل هناك دليل للمبتدئين؟
نعم ، كتبت دليلًا إلى bcc ، والذي يعد نقطة انطلاق جيدة للمبتدئين في التتبع باستخدام eBPF:
كمبتدئ ، لا تحتاج إلى كتابة أي كود لـ eBPF. يحتوي bcc بالفعل على أكثر من 70 أداة يمكنك استخدامها على الفور. سيرشدك هذا الدليل خلال الخطوات خلال الأحد عشر التالية: execsnoop ، opensnoop ، ext4slower (أو btrfs *، xfs *، zfs *)، biolatency، biosnoop، cachestat، tcpaccept، tcpretrans، runclat and profile.
بعد أن تجربهم ، تحتاج فقط إلى معرفة أن هناك العديد من الوسائل الأخرى:

كما أنها موثقة بالكامل مع أدوات صفحة الرجل وملفات العينة. تحتوي ملفات النماذج (* _example.txt في bcc / tools) على لقطات شاشة مع شرح: على سبيل المثال ، biolatency_example.txt . لقد كتبت الكثير منها (صفحات الرجل والأدوات) التي تبدو وكأنها 50 وظيفة بلوق إضافية ، وسوف تجدها في مستودع نسخة مخفية الوجهة.
ما هو مفقود هي أمثلة الإنتاج الحقيقي. كتبت هذه الوثائق عندما كان eBPF جديدًا إلى درجة أنه كان متاحًا فقط في بيئات الاختبار الخاصة بنا ، وبالتالي فإن معظم الأمثلة مصطنعة. بمرور الوقت ، سنضيف أمثلة من العالم الحقيقي. هذا هو المكان الذي يمكن للمبتدئين المساعدة فيه: إذا كنت تعمل على حل مشكلة ، ففكر في كتابة مقال ومشاركة لقطات الشاشة أو إضافتها كمثال للملفات.
ل ذوي الخبرة
في هذه المرحلة ، يجب عليك بالفعل تشغيل نسخة مخفية الوجهة وتجربة هذه الأدوات ، وكذلك الاهتمام بتعديلها وكتابة الأدوات الخاصة بك. أفضل طريقة هي الترقية إلى bpftrace ، التي تحتوي على لغة عالية المستوى وأسهل بكثير للتعلم. الجانب السلبي هو أنها ليست مرنة مثل مخفية ، لذلك قد تواجه قيود وتريد العودة إلى مخفية.
الرجوع إلى تعليمات التثبيت bpftrace . هذا مشروع أحدث ، لذا في وقت كتابة هذا التقرير ، لم يتم تجميع الحزم بعد لجميع الأنظمة. في المستقبل ، ينبغي أن يكون مجرد apt-get install bpftrace أو شيء مشابه.
1. bpftrace تعليمي
قمت بتطوير برنامج تعليمي يعلم كيفية استخدام bpftrace من خلال سلسلة من سطر واحد:
هناك 12 درسًا ستعلمك كيفية استخدام bpftrace خطوة بخطوة. هنا مثال:
# bpftrace -e 'tracepoint: syscalls: sys_enter_open {printf ("٪ d٪ s \ n"، pid، str (args-> filename))؛ } ' جارٍ إرفاق 1 مسبار ...
181 / proc / cpuinfo
181 / بروك / القانون الأساسي
1461 / بروك / صافي / ديف
1461 / proc / net / if_inet6
^ ج
يستخدم استدعاء النظام المفتوح كنقطة تتبع لتتبع PID وفتح مسارات الملفات.
2. bpftrace الدليل المرجعي
لمزيد من المعلومات حول bpftrace ، كتبت دليلًا يحتوي على أمثلة بناء جملة واختبارات وأوامر مضمنة:
هذا من أجل الإيجاز: أحاول وضع العنوان واستئنافه ولقطة الشاشة في صفحة واحدة. أعتقد أن هذا طويل جدًا - إذا كنت تبحث عن شيء وتحتاج إلى التمرير عبر الصفحة عدة مرات.
3. bpftrace في الأمثلة
يوجد أكثر من 20 أداة في مستودع bpftrace والتي يمكنك الاطلاع عليها بأمثلة:
على سبيل المثال:
# أدوات القط / biolatency.bt [...]
تبدأ
{
printf ("I / O جهاز تتبع التتبع ... اضغط على Ctrl-C لإنهاء. \ n") ؛
}
kprobe: blk_account_io_start
{
start [arg0] = nsecs؛
}
kprobe: blk_account_io_completion
/ @ start [arg0] /
{
usecs = hist ((nsecs -start [arg0]) / 1000)؛
delete (start [arg0]) ؛
}
مثل مخفية ، هذه الأدوات لديها صفحات رجل وملفات العينة. على سبيل المثال ، biolatency_example.txt .
لالمتقدمة
1. ندرس تطوير مخفية
قمت بإنشاء دليلين للمساعدة:
هناك أيضًا العديد من الأمثلة في bcc / tools / *. Py. تتكون أدوات نسخة مخفية الوجهة من جزأين: رمز BPF للنواة المكتوبة بلغة C ، وأداة مستوى مساحة المستخدم المكتوبة في Python (أو lua ، أو C ++). تم تطوير أدوات نسخة مخفية إلى حد كبير وقد تتضمن بعض المكونات الصغيرة من عناصر التطبيق أو النواة الداخلية.
2. المشاركة في التطوير
المساعدة مرحب بها مع:
بالنسبة لـ bpftrace ، قمتُ بإنشاء دليل التطوير الداخلي bpftrace . هذا أمر صعب عندما تقوم بالبرنامج في llvm IR ، ولكن إذا كنت مستعدًا لقبول التحدي ...
يوجد أيضًا جوهر eBPF (المعروف أيضًا باسم BPF): إذا نظرت إلى مشكلات bcc و bpftrace ، فستشاهد عدة طلبات للتحسينات هناك. على سبيل المثال ، علامة kernel في bpftrace . راجع أيضًا قائمة مراسلات netdev للحصول على أحدث تطورات نواة BPF التي تمت إضافتها إلى net-next قبل دمجها مع خط Linux الرئيسي.
بالإضافة إلى كتابة التعليمات البرمجية ، يمكنك أيضًا المشاركة في الاختبار وإنشاء الحزم والمدونات والمناقشات.
الخاتمة
يقوم eBPF بالكثير من الأشياء المختلفة. في هذا المنشور ، نظرت إلى إتقان eBPF للبحث عن المفقودين وتحليل الأداء. باختصار:
- المبتدئين: إطلاق أدوات مخفية
- من ذوي الخبرة: تطوير أدوات bpftrace
- المتقدمة: تطوير أدوات مخفية ، المساهمة في مخفية و bpftrace
لدي أيضًا صفحة منفصلة حول أدوات تتبع eBPF ، والتي تغطي كل هذا بمزيد من التفصيل. حظا سعيدا