Koleksi Penyusun BPF (BCC)
BCC adalah perangkat untuk membuat program pelacakan dan manipulasi kernel yang efisien, dan mencakup beberapa alat dan contoh yang berguna. Itu menggunakan BPF (Berkeley Packet Filters) yang diperluas, yang secara resmi dikenal sebagai eBPF, sebuah fitur baru yang pertama kali ditambahkan ke Linux 3.15. Sebagian besar penggunaan BCC memerlukan Linux 4.1 dan yang lebih baru.
eBPF dijelaskan oleh Ingo Molnár sebagai:
Salah satu fitur yang lebih menarik dalam siklus ini adalah kemampuan untuk melampirkan program eBPF (bytecode sandbox yang ditentukan pengguna dan dijalankan oleh kernel) ke kprobes. Hal ini memungkinkan instrumentasi yang ditentukan pengguna pada image kernel aktif yang tidak akan pernah crash, hang, atau mengganggu kernel secara negatif.
BCC membuat program BPF lebih mudah untuk ditulis, dengan instrumentasi kernel dalam C (dan menyertakan pembungkus C di sekitar LLVM), dan front-end dalam Python dan lua. Ini cocok untuk banyak tugas, termasuk analisis kinerja dan kontrol lalu lintas jaringan.
Tangkapan layar
Contoh ini menelusuri fungsi kernel I/O disk, dan mengisi histogram power-of-2 dalam kernel dengan ukuran I/O. Untuk efisiensi, hanya ringkasan histogram yang dikembalikan ke tingkat pengguna.
# ./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 | ************************************** |
Output di atas menunjukkan distribusi bimodal, dimana mode terbesar dari 800 I/O berukuran antara 128 dan 255 Kbytes.
Lihat sumbernya: bitehist.py. Apa yang dilacak, apa yang disimpan, dan bagaimana data disajikan, dapat disesuaikan sepenuhnya. Ini hanya menunjukkan beberapa dari sekian banyak kemungkinan kemampuan.
Menginstal
Lihat INSTALL.md untuk langkah-langkah instalasi pada platform Anda.
Pertanyaan Umum
Lihat FAQ.txt untuk pertanyaan pemecahan masalah paling umum.
Panduan referensi
Lihat docs/reference_guide.md untuk panduan referensi tentang API bcc dan bcc/BPF.
Isi
Beberapa di antaranya adalah file tunggal yang berisi C dan Python, yang lain memiliki sepasang file .c dan .py, dan beberapa lagi merupakan direktori file.
Pelacakan
Contoh
- contoh/tracing/bitehist.py: Histogram ukuran blok I/O. Contoh.
- contoh/tracing/disksnoop.py: Melacak latensi I/O perangkat blok. Contoh.
- contoh/hello_world.py: Mencetak "Halo, Dunia!" untuk proses baru.
- contoh/tracing/mysqld_query.py: Melacak kueri server MySQL menggunakan probe USDT. Contoh.
- contoh/tracing/nodejs_http_server.py: Melacak permintaan server HTTP Node.js menggunakan probe USDT. Contoh.
- contoh/tracing/stacksnoop: Melacak fungsi kernel dan mencetak semua jejak tumpukan kernel. Contoh.
- alat/statsnoop: Melacak stat() panggilan sistem. Contoh.
- contoh/tracing/task_switch.py: Menghitung peralihan tugas dengan dari dan ke PID.
- contoh/tracing/tcpv4connect.py: Melacak koneksi aktif TCP IPv4. Contoh.
- example/tracing/trace_fields.py: Contoh sederhana bidang pencetakan dari peristiwa yang dilacak.
- contoh/tracing/undump.py: Buang paket soket UNIX. Contoh
- example/tracing/urandomread.py: Contoh tracepoint kernel, yang menelusuri random:urandom_read. Contoh.
- example/tracing/vfsreadlat.py example/tracing/vfsreadlat.c: Distribusi latensi baca VFS. Contoh.
- contoh/tracing/kvm_hypercall.py: Titik jejak kernel statis bersyarat untuk contoh masuk, keluar, dan hypercall KVM.
Peralatan
- tools/argdist: Menampilkan nilai parameter fungsi sebagai histogram atau hitungan frekuensi. Contoh.
- tools/bashreadline: Cetak perintah bash yang dimasukkan di seluruh sistem. Contoh.
- tools/bpflist: Menampilkan proses dengan program dan peta BPF yang aktif. Contoh.
- alat/mampu: Melacak pemeriksaan kemampuan keamanan. Contoh.
- tools/compactsnoop: Melacak peristiwa zona kompak dengan PID dan latensi. Contoh.
- tools/criticalstat: Lacak dan laporkan bagian penting atom yang panjang di kernel. Contoh
- tools/deadlock: Mendeteksi potensi kebuntuan pada proses yang sedang berjalan. Contoh.
- tools/drsnoop: Melacak kejadian reklamasi langsung dengan PID dan latensi. Contoh.
- tools/funccount: Menghitung panggilan fungsi kernel. Contoh.
- alat/injeksi: Injeksi kesalahan yang ditargetkan dengan rantai panggilan dan predikat Contoh.
- tools/klockstat: Melacak peristiwa kunci mutex kernel dan menampilkan statistik kunci. Contoh.
- tools/opensnoop: Melacak panggilan sistem open(). Contoh.
- tools/readahead: Menampilkan kinerja contoh cache read-ahead.
- tools/reset-trace: Menyetel ulang status penelusuran. Alat pemeliharaan saja. Contoh.
- tools/stackcount: Menghitung panggilan fungsi kernel dan jejak tumpukannya. Contoh.
- alat/syncsnoop: Lacak sinkronisasi() panggilan sistem. Contoh.
- tools/threadsnoop: Daftar pembuatan thread baru. Contoh.
- tools/tplist: Menampilkan titik jejak kernel atau probe USDT dan formatnya. Contoh.
- alat/jejak: Melacak fungsi arbitrer, dengan filter. Contoh.
- tools/ttysnoop: Tonton keluaran langsung dari perangkat tty atau pts. Contoh.
- tools/ucalls: Meringkas panggilan metode atau syscall Linux dalam bahasa tingkat tinggi. Contoh.
- tools/uflow: Cetak grafik alur metode dalam bahasa tingkat tinggi. Contoh.
- tools/ugc: Melacak peristiwa pengumpulan sampah dalam bahasa tingkat tinggi. Contoh.
- tools/uobjnew: Meringkas peristiwa alokasi objek berdasarkan jenis objek dan jumlah byte yang dialokasikan. Contoh.
- alat/ustat: Kumpulkan peristiwa seperti GC, pembuatan thread, alokasi objek, pengecualian, dan lainnya dalam bahasa tingkat tinggi. Contoh.
- tools/uthreads: Melacak peristiwa pembuatan thread di Java dan pthreads mentah. Contoh.
Alat Memori dan Proses
- tools/execsnoop: Melacak proses baru melalui syscall exec(). Contoh.
- tools/exitsnoop: Melacak penghentian proses (sinyal keluar dan fatal). Contoh.
- tools/killsnoop: Melacak sinyal yang dikeluarkan oleh syscall kill(). Contoh.
- tools/kvmexit: Menampilkan alasan_keluar dan statistiknya dari setiap pintu keluar vm. Contoh.
- tools/memleak: Menampilkan alokasi memori yang luar biasa untuk menemukan kebocoran memori. Contoh.
- tools/oomkill: Lacak pembunuh kehabisan memori (OOM). Contoh.
- tools/pidpersec: Menghitung proses baru (melalui fork). Contoh.
- tools/rdmaucma: Melacak peristiwa Akses Manajer Koneksi Ruang Pengguna RDMA. Contoh.
- tools/shmsnoop: Melacak syscall memori bersama Sistem V. Contoh.
- tools/slabratetop: Tingkat alokasi cache memori Kernel SLAB/SLUB teratas. Contoh.
Alat Kinerja dan Waktu
- tools/dbslower: Melacak kueri MySQL/PostgreSQL lebih lambat dari ambang batas. Contoh.
- tools/dbstat: Ringkas latensi kueri MySQL/PostgreSQL sebagai histogram. Contoh.
- tools/funcininterval: Interval waktu antara fungsi yang sama dengan histogram. Contoh.
- alat/fungsi: Fungsi waktu dan menunjukkan distribusi latensinya. Contoh.
- tools/funcslower: Melacak kernel lambat atau panggilan fungsi pengguna. Contoh.
- tools/hardirqs: Mengukur waktu kejadian IRQ keras (interupsi keras). Contoh.
- tools/mysqld_qslower: Melacak kueri server MySQL yang lebih lambat dari ambang batas. Contoh.
- tools/ppchcalls: Ringkas jumlah dan latensi ppc hcall. Contoh.
- tools/softirqs: Mengukur waktu kejadian IRQ lunak (interupsi lunak). Contoh.
- tools/syscount: Meringkas jumlah dan latensi syscall. Contoh.
Alat CPU dan Penjadwal
- tools/cpudist: Ringkas waktu aktif dan nonaktif CPU per tugas sebagai histogram. Contoh
- tools/cpuunclaimed: Contoh antrian menjalankan CPU dan menghitung CPU idle yang tidak diklaim. Contoh
- tools/llcstat: Meringkas referensi cache CPU dan kesalahan proses. Contoh.
- tools/offcputime: Ringkas waktu di luar CPU berdasarkan jejak tumpukan kernel. Contoh.
- tools/offwaketime: Ringkas waktu yang diblokir berdasarkan tumpukan kernel di luar CPU dan tumpukan bangun. Contoh.
- alat/profil: Profil penggunaan CPU dengan mengambil sampel jejak tumpukan pada interval waktu tertentu. Contoh.
- tools/runqlat: Jalankan latensi antrian (penjadwal) sebagai histogram. Contoh.
- tools/runqlen: Jalankan panjang antrian sebagai histogram. Contoh.
- tools/runqslower: Melacak penundaan penjadwalan proses yang panjang. Contoh.
- alat/waktu bangun: Ringkas waktu tidur hingga bangun berdasarkan tumpukan kernel bangun. Contoh.
- tools/wqlat: Meringkas latensi tunggu pekerjaan pada antrian kerja. Contoh.
Alat Jaringan dan Soket
- tools/gethostlatency: Menampilkan latensi untuk panggilan getaddrinfo/gethostbyname[2]. Contoh.
- tools/bindsnoop: Melacak panggilan sistem bind() IPv4 dan IPv6 (bind()). Contoh.
- tools/netqtop tools/netqtop.c: Melacak dan menampilkan distribusi paket pada antrian NIC. Contoh.
- tools/sofdsnoop: Melacak FD yang melewati soket unix. Contoh.
- alat/solisten: Lacak soket TCP, dengarkan. Contoh.
- tools/sslsniff: Mengendus data tertulis dan membaca OpenSSL. Contoh.
- tools/tcpaccept: Melacak koneksi pasif TCP (accept()). Contoh.
- tools/tcpconnect: Melacak koneksi aktif TCP (connect()). Contoh.
- tools/tcpconnlat: Melacak latensi koneksi aktif TCP (connect()). Contoh.
- tools/tcpdrop: Melacak paket TCP berbasis kernel dengan detailnya. Contoh.
- tools/tcplife: Melacak sesi TCP dan meringkas masa pakainya. Contoh.
- tools/tcpretrans: Melacak transmisi ulang TCP dan TLP. Contoh.
- tools/tcprtt: Melacak waktu pulang pergi TCP. Contoh.
- tools/tcpstates: Melacak perubahan status sesi TCP dengan durasi. Contoh.
- tools/tcpsubnet: Meringkas dan menggabungkan pengiriman TCP berdasarkan subnet. Contoh.
- tools/tcpsynbl: Tampilkan simpanan TCP SYN. Contoh.
- tools/tcptop: Meringkas throughput pengiriman/penerimaan TCP berdasarkan host. Atas untuk TCP. Contoh.
- alat/tcptracer: Melacak koneksi yang dibuat TCP (koneksi(), terima(), tutup()). Contoh.
- tools/tcpcong: Melacak durasi status kontrol kemacetan soket TCP. Contoh.
Alat Penyimpanan dan Sistem File
- tools/bitesize: Menampilkan histogram ukuran I/O per proses. Contoh.
- alat/cachestat: Melacak rasio hit/miss cache halaman. Contoh.
- alat/cachetop: Melacak rasio hit/miss cache halaman berdasarkan proses. Contoh.
- tools/dcsnoop: Melacak pencarian cache entri direktori (dcache). Contoh.
- alat/dcstat: Statistik entri direktori cache (dcache). Contoh.
- alat/biolatensi: Ringkas latensi I/O perangkat blok sebagai histogram. Contoh.
- tools/biotop: Teratas untuk disk: Ringkas blok I/O perangkat berdasarkan proses. Contoh.
- alat/biopattern: Mengidentifikasi pola akses disk acak/berurutan. Contoh.
- tools/biosnoop: Melacak I/O perangkat blok dengan PID dan latensi. Contoh.
- tools/dirtop: File dibaca dan ditulis berdasarkan direktori. Teratas untuk direktori. Contoh.
- tools/filelife: Melacak umur file yang berumur pendek. Contoh.
- tools/filegone: Lacak mengapa file hilang (dihapus atau diganti namanya). Contoh.
- tools/fileslower: Melacak pembacaan dan penulisan file sinkron yang lambat. Contoh.
- alat/filetop: File membaca dan menulis berdasarkan nama file dan proses. Teratas untuk file. Contoh.
- tools/mdflush: Melacak kejadian md flush. Contoh.
- tools/mountsnoop: Melacak mount dan umount syscalls di seluruh sistem. Contoh.
- alat/virtiostat: Menampilkan statistik IO perangkat VIRTIO. Contoh.
Alat Sistem File
- tools/btrfsdist: Ringkas distribusi latensi operasi btrfs sebagai histogram. Contoh.
- tools/btrfsslower: Melacak operasi btrfs yang lambat. Contoh.
- tools/ext4dist: Ringkas distribusi latensi operasi ext4 sebagai histogram. Contoh.
- tools/ext4slower: Melacak operasi ext4 yang lambat. Contoh.
- tools/nfsslower: Melacak operasi NFS yang lambat. Contoh.
- tools/nfsdist: Ringkas distribusi latensi operasi NFS sebagai histogram. Contoh.
- tools/vfscount: Menghitung panggilan VFS. Contoh.
- tools/vfsstat: Menghitung beberapa panggilan VFS, dengan keluaran kolom. Contoh.
- tools/xfsdist: Ringkas distribusi latensi operasi XFS sebagai histogram. Contoh.
- tools/xfsslower: Melacak operasi XFS yang lambat. Contoh.
- tools/zfsdist: Ringkas distribusi latensi operasi ZFS sebagai histogram. Contoh.
- tools/zfsslower: Melacak operasi ZFS yang lambat. Contoh.
Jaringan
Contoh:
- contoh/jaringan/distributed_bridge/: Contoh jembatan terdistribusi.
- contoh/jaringan/http_filter/ : Contoh filter HTTP sederhana.
- example/networking/simple_tc.py : Contoh kontrol lalu lintas sederhana.
- example/networking/simulation.py: Pembantu simulasi.
- example/networking/neighbor_sharing/tc_neighbor_sharing.py example/networking/neighbor_sharing/tc_neighbor_sharing.c: Klasifikasi per-IP dan pembatasan laju.
- example/networking/tunnel_monitor/: Memantau arus lalu lintas secara efisien.
- example/networking/vlan_learning/vlan_learning.py example/vlan_learning.c: Demux lalu lintas Ethernet ke veth+namespace pekerja.
Introspeksi BPF
Alat yang membantu melakukan introspeksi program BPF.
- introspection/bps.c: Daftar semua program BPF yang dimuat ke dalam kernel. 'ps' untuk program BPF. Contoh.
Motivasi
BPF menjamin bahwa program yang dimuat ke dalam kernel tidak akan crash, dan tidak dapat berjalan selamanya, namun BPF dapat digunakan secara umum untuk melakukan banyak jenis komputasi yang sewenang-wenang. Saat ini, dimungkinkan untuk menulis sebuah program dalam C yang akan dikompilasi menjadi program BPF yang valid, namun jauh lebih mudah untuk menulis program C yang akan dikompilasi menjadi BPF yang tidak valid (C memang seperti itu). Pengguna tidak akan tahu sampai mencoba menjalankan program apakah itu valid atau tidak.
Dengan frontend khusus BPF, seseorang harus dapat menulis dalam suatu bahasa dan menerima umpan balik dari compiler mengenai validitas yang berkaitan dengan backend BPF. Toolkit ini bertujuan untuk menyediakan frontend yang hanya dapat membuat program BPF yang valid namun tetap memanfaatkan fleksibilitas penuhnya.
Selain itu, integrasi saat ini dengan BPF memiliki alur kerja yang rumit, terkadang melibatkan kompilasi langsung di pohon sumber kernel linux. Toolchain ini bertujuan untuk meminimalkan waktu yang dihabiskan pengembang untuk mengkompilasi BPF, dan fokus pada aplikasi yang dapat ditulis dan masalah yang dapat diselesaikan dengan BPF.
Fitur-fitur dari perangkat ini meliputi:
- Alur kerja BPF ujung ke ujung di perpustakaan bersama
- Bahasa C yang dimodifikasi untuk backend BPF
- Integrasi dengan backend llvm-bpf untuk JIT
- Pemuatan program JIT secara dinamis (tidak).
- Dukungan untuk kait kernel BPF: filter soket, pengklasifikasi tc, tindakan tc, dan kprobe
- Binding untuk Python
- Contohnya untuk filter soket, pengklasifikasi tc, dan kprobe
- Alat mandiri untuk melacak sistem yang sedang berjalan
Di masa depan, lebih banyak binding selain python kemungkinan besar akan didukung. Jangan ragu untuk menambahkan dukungan untuk bahasa pilihan Anda dan kirimkan permintaan tarik!
Tutorial
- docs/tutorial.md: Menggunakan alat bcc untuk menyelesaikan masalah kinerja, pemecahan masalah, dan jaringan.
- docs/tutorial_bcc_python_developer.md: Mengembangkan program bcc baru menggunakan antarmuka Python.
Jaringan
Pada Red Hat Summit 2015, BCC dipresentasikan sebagai bagian dari sesi mengenai BPF. Lingkungan vxlan multi-host disimulasikan dan program BPF digunakan untuk memantau salah satu antarmuka fisik. Program BPF menyimpan statistik pada alamat IP dalam dan luar yang melintasi antarmuka, dan komponen ruang pengguna mengubah statistik tersebut menjadi grafik yang menunjukkan distribusi lalu lintas pada berbagai rincian. Lihat kodenya di sini.
Berkontribusi
Sudah bersemangat untuk melakukan beberapa kode? Berikut beberapa sumber daya untuk bergabung dalam diskusi di komunitas IOVisor dan melihat apa yang ingin Anda kerjakan.
- Milis: https://lists.iovisor.org/mailman/listinfo/iovisor-dev
- IRC: #iovisor di irc.oftc.net
- Pelacak Masalah BCC: Masalah Github
- Panduan untuk menyumbangkan skrip: CONTRIBUTING-SCRIPTS.md
Tautan eksternal
Mencari informasi lebih lanjut tentang BCC dan cara penggunaannya? Anda dapat menemukan tautan ke konten BCC lainnya di web di LINKS.md.