GNU/Linux >> Belajar Linux >  >> Linux

Pengantar bpftrace untuk Linux

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.


          Linux
          1. Pengenalan Nmap di Kali Linux

          2. 10 Perintah Linux Untuk Diagnostik Jaringan

          3. Pengantar firewall aplikasi web untuk sysadmin Linux

          1. Perintah FreeDOS untuk penggemar Linux

          2. 4 distribusi Linux untuk bermain game

          3. Pengantar singkat tentang peran Ansible untuk administrasi sistem Linux

          1. 5 aplikasi produktivitas untuk Linux

          2. Memilih printer untuk Linux

          3. Pengantar emulator terminal DomTerm untuk Linux