Beranda
Topics
ebpf
Extended Berkeley Packet Filter (eBPF) adalah teknologi pemrograman yang memungkinkan pengembang untuk menulis program yang efisien, aman, dan tidak mengganggu yang berjalan langsung di ruang kernel sistem operasi (OS) Linux.
Karena mereka dapat menjalankan program sandbox dalam konteks khusus, seperti kernel OS, eBPF dapat memperluas fitur peranti lunak yang ada pada saat runtime tanpa memodifikasi kode sumber kernel, memuat modul kernel, atau mengganggu eksekusi program secara keseluruhan. Teknologi eBPF merupakan evolusi dari Berkeley Packet Filter (BPF) yang asli, yang menyediakan cara sederhana untuk memilih dan menganalisis paket jaringan dalam program ruang pengguna. Tetapi di luar penyaringan paket, program BPF tidak memiliki fleksibilitas untuk menangani tugas-tugas yang lebih kompleks di dalam kernel.
Menyadari kebutuhan akan teknologi yang lebih serbaguna, komunitas Linux mengembangkan eBPF, yang dibangun di atas fitur-fitur backend BPF tetapi memperluas kemampuan pemrograman di dalam kernel. Fungsionalitas tingkat lanjut dari program eBPF memungkinkan pengembang untuk mengimplementasikan proses penyaringan paket yang disempurnakan, melakukan analisis kinerja kelas atas, dan menginstal firewall dan protokol debugging di pusat data di lokasi dan lingkungan cloud-native.
Kemajuan dalam teknologi eBPF telah mendorong pengembang peranti lunak untuk memperluas aplikasinya ke semua sistem operasi, sehingga platform berbasis non-Linux dapat memanfaatkan kemampuan pelacakan, jaringan, dan pemantauan yang canggih dari eBPF.1 Bahkan, Yayasan eBPF—perpanjangan dari Linux Foundation yang anggotanya antara lain Google, Meta, Netflix, Microsoft, Intel, dan Isovalent—telah berinvestasi besar-besaran dalam perluasan kompatibilitas OS untuk program-program eBPF, dengan harapan pada akhirnya dapat memperluas kegunaan pemrograman eBPF.2
Dapatkan demo IBM Instana Observability untuk melihat bagaimana Anda bisa mencapai observabilitas dan pemantauan full-stack dalam hitungan menit.
Komponen utama program eBPF adalah:
Program eBPF awalnya ditulis dalam subset C terbatas dan kemudian dikompilasi menjadi bytecode eBPF menggunakan alat seperti LLVM, yang berfungsi sebagai arsitektur back-end eBPF untuk bahasa pemrograman front-end seperti Clang. Bytecode pada dasarnya adalah serangkaian instruksi terbatas yang mematuhi arsitektur set instruksi eBPF dan mencegah kesalahan runtime.
Teknologi kernel Linux mampu menerjemahkan bytecode eBPF menjadi tindakan yang dapat dieksekusi, tetapi kompiler just-in-time (JIT) menawarkan kinerja yang unggul. Kompiler JIT dapat menerjemahkan bytecode ke dalam kode mesin asli untuk platform perangkat keras tertentu dengan cepat.
Pemuat ruang pengguna adalah program di ruang pengguna yang memuat kode bytecode eBPF ke dalam kernel, melampirkannya ke pengait yang sesuai dan mengelola peta eBPF yang terkait. Contoh pemuat ruang pengguna termasuk alat seperti BPF Compiler Collection (BCC) dan bpftrace.
Peta eBPF adalah struktur data dengan pasangan kunci-nilai dan akses baca-tulis yang menyediakan ruang penyimpanan bersama dan memfasilitasi interaksi antara program kernel eBPF dan aplikasi ruang pengguna. Dibuat dan dikelola menggunakan panggilan sistem, peta eBPF juga dapat digunakan untuk mempertahankan status di antara berbagai iterasi program eBPF.
Verifikator—komponen penting dari sistem eBPF—memeriksa bytecode sebelum dimuat ke dalam kernel untuk memastikan program tidak mengandung operasi yang berbahaya, seperti loop tak terbatas, instruksi ilegal, atau akses memori di luar batas. Hal ini juga memastikan bahwa semua jalur data dari program berakhir dengan sukses.
Hooks adalah titik-titik dalam kode kernel di mana program eBPF dapat dilampirkan. Ketika kernel mencapai hook, kernel akan mengeksekusi program eBPF yang dilampirkan.
Berbagai jenis hook seperti tracepoint, kprobe, dan antrean penerimaan paket jaringan memberikan program eBPF akses data yang luas dan memungkinkannya melakukan berbagai operasi. Tracepoints, misalnya, memungkinkan program untuk memeriksa dan mengumpulkan data tentang kernel atau proses lainnya, sementara kait kontrol lalu lintas dapat digunakan untuk memeriksa dan memodifikasi paket jaringan.
Karena eBPF tidak dapat menghasilkan fungsi sembarang dan harus menjaga kompatibilitas dengan setiap versi kernel yang memungkinkan, terkadang set instruksi eBPF dasar tidak cukup bernuansa untuk melakukan operasi tingkat lanjut. Fungsi pembantu menjembatani kesenjangan ini.
Fungsi pembantu—sekumpulan fungsi kernel berbasis APIyang telah ditentukan sebelumnya yang dapat dipanggil oleh eBPF dari dalam sistem—menyediakan cara bagi program eBPF untuk melakukan operasi yang lebih kompleks (seperti mendapatkan waktu dan tanggal saat ini atau menghasilkan angka acak) yang tidak secara langsung didukung oleh set instruksi.
Umumnya, eBPF beroperasi sebagai virtual machines (VM) di dalam kernel Linux, yang bekerja pada arsitektur set instruksi tingkat rendah dan mengeksekusi bytecode eBPF. Namun, proses yang kompleks dalam menjalankan program eBPF cenderung mengikuti langkah-langkah utama tertentu.
Pengembang pertama-tama menulis program eBPF dan mengkompilasi bytecode. Tujuan program akan menentukan jenis kode yang sesuai. Misalnya, jika sebuah tim ingin memantau penggunaan CPU, mereka akan menulis kode yang menyertakan fungsionalitas untuk menangkap metrik penggunaan.
Setelah kompiler eBPF mengubah kode C tingkat tinggi menjadi kode bytecode tingkat rendah, pemuat ruang pengguna akan menghasilkan panggilan sistem BPF untuk memuat program ke dalam kernel. Loader juga bertanggung jawab untuk mengatasi kesalahan dan menyiapkan peta eBPF yang dibutuhkan program.
Dengan adanya bytecode dan peta program, eBPF akan menjalankan proses verifikasi untuk memastikan program aman untuk dieksekusi di dalam kernel. Jika dianggap tidak aman, panggilan sistem untuk memuat program akan gagal, dan program pemuat akan menerima pesan kesalahan. Jika program melewati verifikasi, itu diizinkan untuk dijalankan.
Dengan menggunakan interpreter atau kompiler JIT, eBPF akan menerjemahkan bytecode menjadi kode mesin yang dapat ditindaklanjuti. Namun, eBPF adalah teknologi event-driven, sehingga hanya akan berjalan sebagai respons terhadap titik hook atau event tertentu di dalam kernel (misalnya, panggilan sistem, event jaringan, inisiasi proses, idling CPU, dll.). Ketika suatu peristiwa terjadi, eBPF akan menjalankan program bytecode yang sesuai, memungkinkan pengembang untuk memeriksa dan memanipulasi berbagai komponen sistem.
Setelah program eBPF berjalan, pengembang dapat berinteraksi dengan program ini dari ruang pengguna menggunakan peta eBPF. Sebagai contoh, aplikasi dapat memeriksa peta secara berkala untuk mengumpulkan data dari program eBPF, atau memperbarui peta untuk mengubah perilaku program.
Membongkar program adalah langkah terakhir dari sebagian besar proses eksekusi eBPF. Ketika eBPF telah menyelesaikan tugasnya, loader dapat menggunakan panggilan sistem BPF lagi untuk membongkarnya dari kernel, di mana pada saat itu eBPF berhenti berjalan dan membebaskan sumber daya yang terkait. Proses pembongkaran juga dapat mencakup iterasi pada peta eBPF yang tidak lagi dibutuhkan oleh tim untuk membebaskan elemen-elemen individual yang berguna, dan kemudian menghapus peta itu sendiri (menggunakan syscall "hapus").
Teknologi eBPF telah menjadi landasan sistem Linux modern, memungkinkan kontrol yang baik atas kernel Linux dan memberdayakan perusahaan untuk membangun solusi yang lebih inovatif dalam ekosistem Linux.
eBPF telah memfasilitasi kemajuan dalam:
eBPF memungkinkan pengembang untuk menginstal fitur pemrosesan paket yang lebih cepat dan lebih disesuaikan, proses penyeimbangan beban, skrip profil aplikasi, dan praktik pemantauan jaringan. Platform sumber terbuka, seperti Cilium, memanfaatkan eBPF untuk menyediakan jaringan yang aman dan dapat diskalakan untuk cluster dan beban kerja Kubernetes, serta layanan mikro dalam kontainer lainnya. Selain itu, dengan memanfaatkan logika penerusan paket di tingkat kernel, eBPF dapat merampingkan proses perutean dan memungkinkan respons jaringan yang lebih cepat secara keseluruhan.
eBPF memungkinkan pengembang melakukan instrumen pada kernel dan aplikasi ruang pengguna untuk mengumpulkan data dan metrik kinerja yang terperinci tanpa memengaruhi kinerja sistem secara signifikan. Kemampuan ini membantu organisasi untuk tetap berada di depan, memungkinkan pemantauan dan observabilitas secara real-time.
eBPF dapat memonitor panggilan sistem, lalu lintas jaringan, dan perilaku sistem untuk mendeteksi dan merespons potensi ancaman keamanan secara real time. Solusi TI seperti Falco, misalnya, menggunakan eBPF untuk mengimplementasikan audit keamanan runtime dan respons insiden, sehingga meningkatkan keamanan sistem secara keseluruhan.
Dengan menelusuri panggilan sistem, memantau pemanfaatan CPU, dan melacak pemanfaatan sumber daya (seperti disk I/O), eBPF membantu pengembang untuk lebih mudah menyelidiki kemacetan dalam kinerja sistem dan mengidentifikasi peluang untuk pengoptimalan.
IBM Instana mendemokratisasikan observabilitas dengan memberikan solusi yang dapat digunakan siapa pun di DevOps, SRE, platform, ITOps, dan pengembangan untuk mendapatkan data yang diinginkan dengan konteks yang dibutuhkan. Dibangun khusus untuk cloud native namun tidak bergantung pada teknologi, platform ini secara otomatis dan terus menerus menyediakan data dengan ketelitian tinggi—granularitas 1 detik dan pelacakan menyeluruh—dengan konteks ketergantungan logis dan fisik di seluruh seluler, web, aplikasi, dan infrastruktur.
Platform pengoptimalan biaya hybrid cloud IBM Turbonomic memungkinkan Anda untuk terus mengotomatiskan tindakan penting secara real time yang secara proaktif memberikan penggunaan sumber daya komputasi, penyimpanan, dan jaringan yang paling efisien ke aplikasi Anda di setiap lapisan tumpukan.
1 Foundation Mengusulkan Memajukan Adopsi eBPF di Berbagai OS, (tautan berada di luar ibm.com)" DevOps.com, 21 Agustus 2021
2 Kemajuan eBPF Terbaru Merupakan Pertanda Perubahan Besar pada TI (tautan berada di luar ibm.com), DevOps.com, 13 September 2023