Bpftrace adalah pelacak open source baru untuk Linux untuk menganalisis masalah kinerja produksi dan perangkat lunak pemecahan masalah. Pengguna dan kontributornya termasuk Netflix, Facebook, Red Hat, Shopify, dan lainnya, dan dibuat oleh Alastair Robertson, pengembang berbakat yang berbasis di Inggris yang telah memenangkan berbagai kompetisi pengkodean.
Linux sudah memiliki banyak alat kinerja, tetapi sering kali berbasis kontra dan memiliki visibilitas terbatas. Misalnya, iostat(1) atau agen pemantau mungkin memberi tahu Anda latensi disk rata-rata Anda, tetapi bukan distribusi latensi ini. Distribusi dapat mengungkapkan beberapa mode atau outlier, salah satunya mungkin menjadi penyebab sebenarnya dari masalah kinerja Anda. Bpftrace cocok untuk jenis analisis ini:menguraikan metrik menjadi distribusi atau log per peristiwa dan membuat metrik baru untuk visibilitas ke titik-titik buta.
Anda dapat menggunakan bpftrace melalui satu baris atau skrip, dan dikirimkan dengan banyak alat yang telah ditulis sebelumnya. Berikut adalah contoh yang melacak distribusi latensi baca untuk PID 181 dan menunjukkannya sebagai histogram pangkat dua:
# bpftrace -e 'kprobe:vfs_read /pid == 30153/ { @start[tid] = nsecs; }
kretprobe:vfs_read /@start[tid]/ { @ns = hist(nsecs - @start[tid]); delete(@start[tid]); }'
Attaching 2 probes...
^C
@ns:
[256, 512) 10900 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
[512, 1k) 18291 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|
[1k, 2k) 4998 |@@@@@@@@@@@@@@ |
[2k, 4k) 57 | |
[4k, 8k) 117 | |
[8k, 16k) 48 | |
[16k, 32k) 109 | |
[32k, 64k) 3 | |
Contoh ini instrumen satu acara dari ribuan yang tersedia. Jika Anda memiliki masalah kinerja yang aneh, mungkin ada beberapa bpftrace one-liner yang dapat menjelaskannya. Untuk lingkungan yang besar, kemampuan ini dapat membantu Anda menghemat jutaan. Untuk lingkungan yang lebih kecil, ini dapat lebih berguna dalam membantu menghilangkan outlier latensi.
Terminal Linux
- 7 emulator terminal teratas untuk Linux
- 10 alat baris perintah untuk analisis data di Linux
- Unduh Sekarang:lembar contekan SSH
- Lembar contekan perintah Linux tingkat lanjut
- Tutorial baris perintah Linux
Saya sebelumnya menulis tentang bpftrace vs. pelacak lainnya, termasuk BCC (BPF Compiler Collection). BCC sangat bagus untuk alat dan agen kompleks kalengan. Bpftrace adalah yang terbaik untuk skrip pendek dan investigasi ad hoc. Dalam artikel ini, saya akan merangkum bahasa bpftrace, tipe variabel, probe, dan alat.
Bpftrace menggunakan BPF (Berkeley Packet Filter), mesin eksekusi dalam kernel yang memproses set instruksi virtual. BPF telah diperpanjang (alias eBPF) dalam beberapa tahun terakhir untuk menyediakan cara yang aman untuk memperluas fungsionalitas kernel. Ini juga telah menjadi topik hangat dalam rekayasa sistem, dengan setidaknya 24 pembicaraan tentang BPF pada Konferensi Tukang Ledeng Linux terakhir. BPF ada di kernel Linux, dan bpftrace adalah cara terbaik untuk mulai menggunakan BPF agar dapat diamati.
Lihat panduan INSTALL bpftrace untuk cara menginstalnya, dan dapatkan versi terbaru; 0.9.2 baru saja dirilis. Untuk cluster Kubernetes, ada juga kubectl-trace untuk menjalankannya.
Sintaks
probe[,probe,...] /filter/ { action }
Probe menentukan peristiwa apa yang akan diinstrumentasi. Filter bersifat opsional dan dapat memfilter peristiwa berdasarkan ekspresi boolean, dan tindakannya adalah program mini yang berjalan.
Inilah halo dunia:
# bpftrace -e 'BEGIN { printf("Hello eBPF!\n"); }'
Pemeriksaannya MULAI , probe khusus yang berjalan di awal program (seperti awk). Tidak ada saringan. Tindakannya adalah printf() pernyataan.
Sekarang contoh nyata:
# bpftrace -e 'kretprobe:sys_read /pid == 181/ { @bytes = hist(retval); }'
Ini menggunakan kretprobe untuk menginstruksikan kembalinya sys_read() fungsi inti. Jika PID adalah 181, variabel peta khusus @byte diisi dengan fungsi histogram log2 dengan nilai kembalian retval dari sys_read() . Ini menghasilkan histogram dari ukuran baca yang dikembalikan untuk PID 181. Apakah aplikasi Anda melakukan banyak pembacaan satu byte? Mungkin itu bisa dioptimalkan.
Jenis probe
Ini adalah perpustakaan probe terkait. Jenis yang saat ini didukung adalah (lebih banyak akan ditambahkan):
Jenis | Deskripsi |
---|---|
titik jejak | Titik instrumentasi statis kernel |
usdt | Pelacakan statis tingkat pengguna |
kprobe | Instrumentasi fungsi dinamis kernel |
kretprobe | Instrumentasi pengembalian fungsi dinamis kernel |
pencurian | Instrumentasi fungsi dinamis tingkat pengguna |
uretprobe | Instrumentasi pengembalian fungsi dinamis tingkat pengguna |
perangkat lunak | Acara berbasis perangkat lunak kernel |
perangkat keras | Instrumentasi berbasis penghitung perangkat keras |
titik pengawasan | Peristiwa titik pengamatan memori (dalam pengembangan) |
profil | Pengambilan sampel dengan waktu di semua CPU |
interval | Pelaporan berjangka waktu (dari satu CPU) |
MULAI | Awal bpftrace |
AKHIR | Akhir dari bpftrace |
Instrumentasi dinamis (alias pelacakan dinamis) adalah kekuatan super yang memungkinkan Anda melacak fungsi perangkat lunak apa pun dalam biner yang berjalan tanpa memulai ulang. Ini memungkinkan Anda memahami hampir semua masalah. Namun, fungsi yang ditampilkannya tidak dianggap sebagai API yang stabil, karena dapat berubah dari satu versi perangkat lunak ke versi perangkat lunak lainnya. Oleh karena itu instrumentasi statis, di mana titik peristiwa dikodekan dengan keras dan menjadi API yang stabil. Saat Anda menulis program bpftrace, coba gunakan tipe statis terlebih dahulu, sebelum yang dinamis, agar program Anda lebih stabil.
Jenis variabel
Variabel | Deskripsi |
---|---|
@nama | global |
@nama[kunci] | hash |
@nama[tid] | utas-lokal |
$nama | gores |
Variabel dengan @ awalan menggunakan peta BPF, yang dapat berperilaku seperti array asosiatif. Mereka dapat diisi dengan salah satu dari dua cara:
- Penetapan variabel:@name =x;
- Penetapan fungsi:@name =hist(x);
Berbagai fungsi pengisian peta dibangun untuk menyediakan cara cepat untuk meringkas data.
Variabel dan fungsi bawaan
Berikut adalah beberapa variabel dan fungsi bawaan, tetapi masih banyak lagi.
Variabel bawaan:
Variabel | Deskripsi |
---|---|
pid | ID proses |
comm | Proses atau nama perintah |
ndetik | Waktu saat ini dalam nanodetik |
kstack | Pelacakan tumpukan kernel |
ustack | Pelacakan tumpukan tingkat pengguna |
arg0...argN | Argumen fungsi |
args | Argumen titik jejak |
pembalikan | Nilai pengembalian fungsi |
nama | Nama probe lengkap |
Fungsi bawaan:
Fungsi | Deskripsi |
---|---|
printf("...") | Mencetak string berformat |
waktu("...") | Waktu format cetak |
sistem("...") | Jalankan perintah shell |
@ =count() | Hitung acara |
@ =hist(x) | Histogram kekuatan-2 untuk x |
@ =lhist(x, min, max, step) | Histogram linier untuk x |
Lihat panduan referensi untuk detailnya.
Tutorial satu baris
Cara terbaik untuk mempelajari bpftrace adalah melalui one-liners, yang saya ubah menjadi tutorial one-liners yang mencakup hal-hal berikut:
Mendaftarkan pemeriksaan | bpftrace -l 'tracepoint:syscalls:sys_enter_*' |
Halo dunia | bpftrace -e 'BEGIN { printf("hello world\n") }' |
File terbuka | bpftrace -e 'tracepoint:syscalls:sys_enter_open { printf("%s %s\n", comm, str(args->filename)) }' |
Syscall dihitung berdasarkan proses | bpftrace -e 'tracepoint:raw_syscalls:sys_enter { @[comm] =count() }' |
Distribusi read() byte | bpftrace -e 'tracepoint:syscalls:sys_exit_read /pid ==18644/ { @bytes =hist(args->retval) }' |
Pelacakan dinamis kernel dari read() byte | bpftrace -e 'kretprobe:vfs_read { @bytes =lhist(retval, 0, 2000, 200) }' |
Waktu read()s | bpftrace -e 'kprobe:vfs_read { @start[tid] =nsecs } kretprobe:vfs_read /@start[tid]/ { @ns[comm] =hist(nsecs - @start[tid]); delete(@start[tid]) }' |
Hitung peristiwa tingkat proses | bpftrace -e 'tracepoint:sched:sched* { @[nama] =count() } interval:s:5 { exit() }' |
Profil tumpukan kernel di CPU | bpftrace -e 'profile:hz:99 { @[stack] =count() }' |
Pelacakan penjadwal | bpftrace -e 'tracepoint:sched:sched_switch { @[stack] =count() }' |
Blokir pelacakan I/O | bpftrace -e 'tracepoint:block:block_rq_issue { @ =hist(args->byte); } |
Pelacakan struktur kernel (skrip, bukan satu baris) | Perintah: bpftrace path.bt , dengan file path.bt: #include #include kprobe:vfs_open { printf("open path:%s\n", str(((path *)arg0)->dentry->d_name .nama)); } |
Lihat tutorial untuk penjelasan masing-masing.
Alat yang disediakan
Selain satu baris, program bpftrace dapat berupa skrip multi-baris. Bpftrace dikirimkan dengan 28 di antaranya sebagai alat:
Ini dapat ditemukan di /alat direktori:
tools# ls *.bt
bashreadline.bt dcsnoop.bt oomkill.bt syncsnoop.bt vfscount.bt
biolatency.bt execsnoop.bt opensnoop.bt syscount.bt vfsstat.bt
biosnoop.bt gethostlatency.bt pidpersec.bt tcpaccept.bt writeback.bt
bitesize.bt killsnoop.bt runqlat.bt tcpconnect.bt xfsdist.bt
capable.bt loads.bt runqlen.bt tcpdrop.bt
cpuwalk.bt mdflush.bt statsnoop.bt tcpretrans.bt
Terlepas dari penggunaannya dalam mendiagnosis masalah kinerja dan pemecahan masalah umum, mereka juga menyediakan cara lain untuk mempelajari bpftrace. Berikut beberapa contohnya.
Sumber
Berikut kode untuk biolatency.bt :
tools# cat -n biolatency.bt
1 /*
2 * biolatency.bt Block I/O latency as a histogram.
3 * For Linux, uses bpftrace, eBPF.
4 *
5 * This is a bpftrace version of the bcc tool of the same name.
6 *
7 * Copyright 2018 Netflix, Inc.
8 * Licensed under the Apache License, Version 2.0 (the "License")
9 *
10 * 13-Sep-2018 Brendan Gregg Created this.
11 */
12
13 BEGIN
14 {
15 printf("Tracing block device I/O... Hit Ctrl-C to end.\n");
16 }
17
18 kprobe:blk_account_io_start
19 {
20 @start[arg0] = nsecs;
21 }
22
23 kprobe:blk_account_io_done
24 /@start[arg0]/
25
26 {
27 @usecs = hist((nsecs - @start[arg0]) / 1000);
28 delete(@start[arg0]);
29 }
30
31 END
32 {
33 clear(@start);
34 }
Ini lugas, mudah dibaca, dan cukup pendek untuk disertakan pada slide. Versi ini menggunakan pelacakan dinamis kernel untuk melengkapi blk_account_io_start() dan blk_account_io_done() fungsi, dan melewati stempel waktu di antara mereka yang dikunci pada arg0 untuk masing-masing. arg0 di kprobe adalah argumen pertama untuk fungsi itu, yang merupakan permintaan struct * , dan alamat memorinya digunakan sebagai pengenal unik.
Contoh file
Anda dapat melihat tangkapan layar dan penjelasan alat ini di repo GitHub sebagai *_example.txt file. Misalnya:
tools# more biolatency_example.txt
Demonstrations of biolatency, the Linux BPF/bpftrace version.
This traces block I/O, and shows latency as a power-of-2 histogram. For example:
# biolatency.bt
Attaching 3 probes...
Tracing block device I/O... Hit Ctrl-C to end.
^C
@usecs:
[256, 512) 2 | |
[512, 1K) 10 |@ |
[1K, 2K) 426 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|
[2K, 4K) 230 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
[4K, 8K) 9 |@ |
[8K, 16K) 128 |@@@@@@@@@@@@@@@ |
[16K, 32K) 68 |@@@@@@@@ |
[32K, 64K) 0 | |
[64K, 128K) 0 | |
[128K, 256K) 10 |@ |
While tracing, this shows that 426 block I/O had a latency of between 1K and 2K
usecs (1024 and 2048 microseconds), which is between 1 and 2 milliseconds.
There are also two modes visible, one between 1 and 2 milliseconds, and another
between 8 and 16 milliseconds: this sounds like cache hits and cache misses.
There were also 10 I/O with latency 128 to 256 ms: outliers. Other tools and
instrumentation, like biosnoop.bt, can shed more light on those outliers.
[...]
Terkadang akan lebih efektif untuk langsung beralih ke file contoh saat mencoba memahami alat ini, karena hasilnya mungkin sudah jelas (berdasarkan desain!).
Halaman manual
Ada juga halaman manual untuk setiap alat di repo GitHub di bawah /man/man8. Mereka menyertakan bagian pada bidang keluaran dan overhead alat yang diharapkan.
# nroff -man man/man8/biolatency.8
biolatency(8) System Manager's Manual biolatency(8)
NAME
biolatency.bt - Block I/O latency as a histogram. Uses bpftrace/eBPF.
SYNOPSIS
biolatency.bt
DESCRIPTION
This tool summarizes time (latency) spent in block device I/O (disk
I/O) as a power-of-2 histogram. This allows the distribution to be
studied, including modes and outliers. There are often two modes, one
for device cache hits and one for cache misses, which can be shown by
this tool. Latency outliers will also be shown.
[...]
Menulis semua halaman manual ini adalah bagian yang paling tidak menyenangkan dalam mengembangkan alat ini, dan beberapa membutuhkan waktu lebih lama untuk menulis daripada yang dibutuhkan alat untuk mengembangkannya, tetapi senang melihat hasil akhirnya.
bpftrace vs. BCC
Sejak eBPF telah bergabung dalam kernel, sebagian besar upaya telah ditempatkan pada frontend BCC, yang menyediakan perpustakaan BPF dan antarmuka Python, C++, dan Lua untuk menulis program. Saya telah mengembangkan banyak alat di BCC/Python; itu berfungsi dengan baik, meskipun pengkodean dalam BCC bertele-tele. Jika Anda meretas masalah kinerja, bpftrace lebih baik untuk kueri khusus satu kali Anda. Jika Anda sedang menulis alat dengan banyak opsi baris perintah atau agen yang menggunakan pustaka Python, sebaiknya pertimbangkan untuk menggunakan BCC.
Di tim kinerja Netflix, kami menggunakan keduanya:BCC untuk mengembangkan alat kaleng yang dapat digunakan orang lain dengan mudah dan untuk mengembangkan agen; dan bpftrace untuk analisis ad hoc. Tim teknik jaringan telah menggunakan BCC untuk mengembangkan agen untuk kebutuhannya. Tim keamanan paling tertarik pada bpftrace untuk instrumentasi ad hoc cepat untuk mendeteksi kerentanan zero-day. Dan saya berharap tim pengembang akan menggunakan keduanya tanpa menyadarinya, melalui GUI swalayan yang kami buat (Vector), dan terkadang SSH menjadi instance dan menjalankan alat kalengan atau ad hoc bpftrace one-liner.
Pelajari lebih lanjut
- Repositori bpftrace di GitHub
- Tutorial satu baris bpftrace
- Panduan referensi bpftrace
- Repositori BCC untuk alat berbasis BPF yang lebih kompleks
Saya juga memiliki buku yang keluar tahun ini yang mencakup bpftrace:BPF Performance Tools:Linux System and Application Observability , yang akan diterbitkan oleh Addison Wesley, dan yang berisi banyak alat bpftrace baru.
Terima kasih kepada Alastair Robertson karena telah membuat bpftrace, dan komunitas bpftrace, BCC, dan BPF untuk semua pekerjaan selama lima tahun terakhir.