Jejak Belajar Menggunakan eBPF: Sebuah Panduan dan Contoh

Halo, Habr! Saya membawa perhatian Anda pada terjemahan sebuah artikel oleh Brendan Gregg di eBPF

Setidaknya ada 24 presentasi eBPF di konferensi Linux Plumbers. Dengan cepat menjadi tidak hanya teknologi yang tak ternilai, tetapi juga keterampilan yang dicari. Mungkin Anda ingin menetapkan beberapa tujuan untuk tahun baru - pelajari eBPF!


Istilah eBPF harus berarti sesuatu yang substansial, seperti Virtual Kernel Instruction Set (VKIS), tetapi asalnya adalah Berkeley Packet Filter yang diperluas. Ini berlaku di banyak bidang, seperti kinerja jaringan, firewall, keamanan, tracing, dan driver perangkat. Bagi sebagian dari mereka, ada banyak informasi yang tersedia secara bebas di Internet - misalnya, penelusuran, tetapi bagi yang lain belum. Jejak istilah mengacu pada analisis kinerja dan alat pengawasan yang dapat menghasilkan informasi untuk setiap peristiwa. Anda mungkin sudah menggunakan pelacak - tcpdump dan strace adalah pelacak khusus.


Dalam posting ini, saya akan menjelaskan proses mempelajari penggunaan eBPF untuk tujuan penelusuran, dikelompokkan menjadi beberapa bagian untuk pemula, pengguna tingkat lanjut dan lanjut. Singkatnya:


  • Pemula: meluncurkan alat bcc
  • Berpengalaman: mengembangkan alat bpftrace
  • Advanced: mengembangkan alat bcc , berkontribusi pada bcc dan bpftrace

Pemula


1. Apakah eBPF, bcc, bpftrace, dan iovisor?


eBPF melakukan hal yang sama untuk Linux seperti JavaScript untuk HTML, semacam. Jadi, alih-alih situs HTML statis, JavaScript memungkinkan Anda menentukan program mini yang dijalankan pada acara - seperti klik mouse - yang dijalankan di mesin virtual aman di browser. Dan dengan eBPF - alih-alih mengedit kernel, Anda sekarang dapat menulis program mini yang berjalan pada acara seperti disk I / O pada mesin virtual aman di kernel. Bahkan, eBPF lebih seperti mesin virtual v8 yang menjalankan JavaScript daripada JavaScript itu sendiri. eBPF adalah bagian dari kernel Linux.


Pemrograman langsung di eBPF sangat sulit, seperti halnya bytecode v8. Tetapi tidak ada yang mengkode dalam v8: semua orang menulis dalam JavaScript, atau sering dalam kerangka kerja di atas JavaScript (jQuery, Angular, React, dll.). Hal yang sama dengan eBPF. Orang akan menggunakannya, dan menulis kode melalui kerangka kerja. Yang utama untuk pelacakan adalah bcc dan bpftrace . Mereka tidak tinggal di basis kode kernel, mereka tinggal di proyek Linux Foundation di github bernama iovisor .


2. Apakah mungkin melacak menggunakan eBPF?


Utilitas berbasis eBPF ini menunjukkan sesi TCP yang ditetapkan sepenuhnya dengan ID proses (PID), nama perintah (COMM), byte yang dikirim dan diterima (TX_KB, RX_KB), dan durasi dalam milidetik (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 0 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
 [...] 


Tidak eBPF ini memungkinkan - saya dapat menulis ulang tcplife untuk menggunakan teknologi kernel yang lebih lama. Tetapi jika saya melakukannya, kami tidak akan pernah menjalankan alat seperti itu dalam produksi karena berkurangnya kinerja, masalah keamanan, atau keduanya. eBPF telah menjadikan alat ini praktis : efisien dan aman. Misalnya, ia tidak melacak setiap paket, seperti yang dilakukan dengan pendekatan sebelumnya, dan itu dapat menyebabkan penurunan kinerja yang berlebihan. Sebaliknya, ini hanya melacak peristiwa sesi TCP yang terjadi jauh lebih jarang. Ini membuat biaya overhead sangat rendah sehingga kita dapat menjalankan alat ini dalam mode 24x7.


3. Bagaimana saya menggunakan ini?


Pemula harus mulai menjelajahi bcc. Lihat instruksi instalasi bcc untuk sistem operasi Anda. Untuk Ubuntu, tampilannya seperti ini:


# 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 polling perangkat 4 0 / dev / bus / usb
 ^ C

Di sini saya akhirnya membuka noop untuk menguji fungsionalitas alat. Jika Anda sejauh ini, Anda pasti menggunakan eBPF!


Untuk perusahaan seperti Netflix dan Facebook, bcc diinstal pada semua server secara default. Mungkin Anda ingin melakukan hal yang sama.


4. Apakah ada panduan pemula?


Ya, saya menulis panduan untuk bcc, yang merupakan titik awal yang baik untuk pemula dalam menelusuri dengan eBPF:



Sebagai pemula, Anda tidak perlu menulis kode apa pun untuk eBPF. bcc sudah mengandung lebih dari 70 alat yang dapat Anda gunakan segera. Panduan ini akan memandu Anda melalui langkah-langkah melalui sebelas berikut ini: execsnoop, opensnoop, ext4slower (atau btrfs *, xfs *, zfs *), biolatency, biosnoop, cachestat, tcpconnect, tcpaccept, tcpretrans, runqlat dan profil.


Setelah Anda mencobanya, Anda hanya perlu tahu bahwa ada banyak cara lain:



Mereka juga sepenuhnya didokumentasikan dengan alat halaman manual dan file sampel. File sampel (* _example.txt dalam bcc / tools) berisi tangkapan layar dengan penjelasan: misalnya, biolatency_example.txt . Saya menulis banyak dari mereka (halaman manual dan alat) yang terlihat seperti 50 posting blog tambahan, Anda akan menemukannya di repositori bcc.


Apa yang hilang adalah contoh produksi nyata. Saya menulis dokumentasi ini ketika eBPF sangat baru sehingga hanya tersedia di lingkungan pengujian kami, jadi sebagian besar contoh adalah buatan. Seiring waktu, kami akan menambahkan contoh dunia nyata. Di sinilah pemula dapat membantu: jika Anda memecahkan masalah, pertimbangkan untuk menulis artikel dan berbagi tangkapan layar atau menambahkannya sebagai file contoh.


Untuk berpengalaman


Pada titik ini, Anda harus sudah menjalankan bcc dan mencoba alat-alat ini, serta tertarik untuk memodifikasi mereka dan menulis alat Anda sendiri. Cara terbaik adalah meningkatkan ke bpftrace, yang berisi bahasa tingkat tinggi yang lebih mudah dipelajari. Kelemahannya adalah tidak sefleksibel bcc, jadi Anda mungkin mengalami batasan dan ingin kembali ke bcc.


Lihat instruksi instalasi bpftrace . Ini adalah proyek yang lebih baru, jadi pada saat penulisan ini, paket belum dikompilasi untuk semua sistem. Di masa depan, seharusnya hanya apt-get install bpftrace atau yang serupa.


1. tutorial bpftrace


Saya mengembangkan tutorial yang mengajarkan cara menggunakan bpftrace melalui serangkaian baris tunggal:



Ada 12 pelajaran yang akan mengajarkan Anda bagaimana menggunakan bpftrace langkah demi langkah. Berikut ini sebuah contoh:


# bpftrace -e 'tracepoint: syscalls: sys_enter_open {printf ("% d% s \ n", pid, str (args-> nama file)); } '
 Melampirkan 1 probe ...
 181 / proc / cpuinfo
 181 / proc / stat
 1461 / proc / net / dev
 1461 / proc / net / if_inet6
 ^ C

Ia menggunakan panggilan sistem terbuka sebagai titik jejak untuk melacak PID dan membuka jalur file.


2. Panduan Referensi bpftrace


Untuk informasi lebih lanjut tentang bpftrace, saya menulis panduan yang berisi contoh sintaks, tes, dan perintah bawaan:



Ini demi singkatnya: Saya mencoba menempatkan judul, resume dan tangkapan layar pada satu halaman. Saya pikir ini terlalu lama - jika Anda mencari sesuatu dan Anda perlu menggulir halaman beberapa kali.


3. bpftrace dalam contoh


Ada lebih dari 20 alat dalam repositori bpftrace yang dapat Anda lihat dengan contoh:



Sebagai contoh:


# cat tools / biolatency.bt
 [...]
 DIMULAI
 {
     printf ("Menelusuri blok perangkat I / O ... Tekan Ctrl-C untuk mengakhiri. \ n");
 }

 kprobe: blk_account_io_start
 {
     @mulai [arg0] = nsecs;
 }

 kprobe: blk_account_io_completion
 / @ start [arg0] /

 {
     @ usecs = hist ((nsecs - @start [arg0]) / 1000);
     delete (@start [arg0]);
 }

Seperti bcc, utilitas ini memiliki halaman manual dan file sampel. Misalnya, biolatency_example.txt .


Untuk lanjutan


1. Kami mempelajari pengembangan bcc


Saya membuat dua panduan untuk membantu:



Ada juga banyak contoh di bcc / tools / *. Py. Alat Bcc terdiri dari dua bagian: kode BPF untuk kernel yang ditulis dalam C, dan alat tingkat ruang pengguna yang ditulis dalam Python (atau lua, atau C ++). Pengembangan alat bcc cukup maju dan dapat mencakup beberapa komponen kecil dari kernel atau elemen aplikasi internal.


2. Partisipasi dalam pengembangan


Bantuan diterima dengan:



Untuk bpftrace, saya membuat panduan pengembangan internal bpftrace . Ini sulit ketika Anda memprogram dalam llvm IR, tetapi jika Anda siap menerima tantangan ...


Ada juga inti dari eBPF (alias BPF): jika Anda melihat masalah bcc dan bpftrace, Anda akan melihat beberapa permintaan untuk perbaikan di sana. Sebagai contoh, tag kernel di bpftrace . Juga lihat mailing list netdev untuk pengembangan kernel BPF terbaru yang ditambahkan ke net-next sebelum bergabung dengan garis utama Linux.


Selain menulis kode, Anda juga dapat ikut serta dalam pengujian, membuat paket, blog, dan diskusi.


Kesimpulan


eBPF melakukan banyak hal berbeda. Dalam posting ini, saya melihat penguasaan eBPF untuk penelusuran dan analisis kinerja. Singkatnya:


  • Pemula: meluncurkan alat bcc
  • Berpengalaman: mengembangkan alat bpftrace
  • Advanced: mengembangkan alat bcc , berkontribusi pada bcc dan bpftrace

Saya juga memiliki halaman terpisah tentang Alat Pelacakan eBPF , yang mencakup semua ini secara lebih rinci. Semoga beruntung

Source: https://habr.com/ru/post/id435142/


All Articles