GNU/Linux >> Znalost Linux >  >> Linux

Úvod do bpftrace pro Linux

Bpftrace je nový open source tracer pro Linux pro analýzu problémů s produkčním výkonem a řešení problémů se softwarem. Mezi jeho uživatele a přispěvatele patří Netflix, Facebook, Red Hat, Shopify a další a vytvořil jej Alastair Robertson, talentovaný britský vývojář, který vyhrál různé soutěže v kódování.

Linux již má mnoho nástrojů pro výkon, ale často jsou založeny na pultech a mají omezenou viditelnost. Například iostat(1) nebo monitorovací agent vám mohou sdělit průměrnou latenci disku, ale ne distribuci této latence. Distribuce mohou odhalit více režimů nebo odlehlých hodnot, z nichž oba mohou být skutečnou příčinou vašich problémů s výkonem. Bpftrace je vhodný pro tento druh analýzy:rozkládání metrik do distribucí nebo protokolů jednotlivých událostí a vytváření nových metrik pro viditelnost slepých míst.

Bpftrace můžete používat prostřednictvím jednoduchých řádků nebo skriptů a je dodáván s mnoha předem napsanými nástroji. Zde je příklad, který sleduje rozložení latence čtení pro PID 181 a zobrazuje jej jako histogram s mocninou dvou:

# 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 |                                                    |

Tento příklad zahrnuje jednu událost z tisíce dostupných. Pokud máte nějaký podivný problém s výkonem, pravděpodobně existuje nějaký bpftrace one-liner, který to může objasnit. Ve velkých prostředích vám tato schopnost může pomoci ušetřit miliony. Pro menší prostředí může být užitečnější při eliminaci odlehlých hodnot latence.

Linuxový terminál

  • 7 nejlepších emulátorů terminálu pro Linux
  • 10 nástrojů příkazového řádku pro analýzu dat v systému Linux
  • Stáhnout nyní:SSH cheat sheet
  • Cheat sheet pro pokročilé příkazy systému Linux
  • Výukové programy příkazového řádku systému Linux

Již dříve jsem psal o bpftrace vs. jiných tracerech, včetně BCC (BPF Compiler Collection). BCC je skvělé pro předem připravené komplexní nástroje a agenty. Bpftrace je nejlepší pro krátké skripty a ad hoc vyšetřování. V tomto článku shrnu jazyk bpftrace, typy proměnných, sondy a nástroje.

Bpftrace používá BPF (Berkeley Packet Filter), prováděcí jádro v jádře, které zpracovává virtuální sadu instrukcí. BPF byl v posledních letech rozšířen (aka eBPF), aby poskytoval bezpečný způsob rozšíření funkčnosti jádra. Také se stal horkým tématem v systémovém inženýrství, s nejméně 24 přednáškami o BPF na poslední Linux Plumber's Conference. BPF je v jádře Linuxu a bpftrace je nejlepší způsob, jak začít používat BPF pro pozorovatelnost.

Podívejte se na příručku bpftrace INSTALL, jak ji nainstalovat, a získejte nejnovější verzi; 0.9.2 byla právě vydána. Pro clustery Kubernetes existuje také kubectl-trace pro jeho spuštění.

Syntaxe

probe[,probe,...] /filter/ { action }

Sonda specifikuje, jaké události se mají použít. Filtr je volitelný a dokáže odfiltrovat události na základě booleovských výrazů a akcí je miniprogram, který se spustí.

Tady je ahoj světe:

# bpftrace -e 'BEGIN { printf("Hello eBPF!\n"); }'

Sonda je BEGIN , speciální sonda, která běží na začátku programu (jako awk). Není tam žádný filtr. Akce je printf() prohlášení.

Nyní skutečný příklad:

# bpftrace -e 'kretprobe:sys_read /pid == 181/ { @bytes = hist(retval); }'

To používá kretprobe k instrumentaci návratu sys_read() funkce jádra. Pokud je PID 181, speciální mapová proměnná @bytes je vyplněna funkcí histogramu log2 s návratovou hodnotou retval z sys_read() . Tím se vytvoří histogram vrácené velikosti čtení pro PID 181. Provádí vaše aplikace mnoho čtení jednoho bajtu? Možná to půjde optimalizovat.

Typy sond

Jedná se o knihovny příbuzných sond. Aktuálně podporované typy jsou (další budou přidány):

Typ Popis
sledovací bod Statické body instrumentace jádra
usdt Staticky definované trasování na uživatelské úrovni
kprobe Instrumentace dynamických funkcí jádra
kretprobe Instrumentace vracení dynamických funkcí jádra
uprobe Instrumentace dynamických funkcí na uživatelské úrovni
uretsonda Instrumentace vracení dynamických funkcí na uživatelské úrovni
software Události založené na softwaru jádra
hardwaru Hardwarové čítačové vybavení
bod sledování Události sledovacích bodů paměti (ve vývoji)
profil Časované vzorkování napříč všemi CPU
interval Časované hlášení (z jednoho CPU)
ZAČÁTEK Začátek bpftrace
KONEC Konec bpftrace

    Dynamická instrumentace (neboli dynamické trasování) je superschopnost, která vám umožní sledovat jakoukoli softwarovou funkci v běžícím binárním systému, aniž byste ji restartovali. To vám umožní dostat se na dno téměř jakéhokoli problému. Funkce, které odhaluje, však nejsou považovány za stabilní API, protože se mohou z jedné verze softwaru měnit. Proto je statická instrumentace, kde jsou body událostí pevně zakódovány a stávají se stabilním API. Když píšete programy bpftrace, zkuste nejprve použít statické typy před dynamickými, aby byly vaše programy stabilnější.

    Typy proměnných

    Proměnná Popis
    @jméno globální
    @jméno[klíč] hash
    @jméno[tid] místní vlákno
    $name škrábání

      Proměnné s @ prefix používají BPF mapy, které se mohou chovat jako asociativní pole. Mohou být naplněny jedním ze dvou způsobů:

      • Přiřazení proměnné:@name =x;
      • Přiřazení funkce:@name =hist(x);

      Zabudovány jsou různé funkce vyplňování map, které poskytují rychlé způsoby shrnutí dat.

      Vestavěné proměnné a funkce

      Zde jsou některé z vestavěných proměnných a funkcí, ale je jich mnohem více.

      Vestavěné proměnné:

      Proměnná Popis
      pid ID procesu
      comm Název procesu nebo příkazu
      nsecs Aktuální čas v nanosekundách
      kstack Trace zásobníku jádra
      ustack Trace zásobníku na uživatelské úrovni
      arg0...argN Argumenty funkcí
      args Argumenty sledovacího bodu
      retval Vrácená hodnota funkce
      jméno Celý název sondy

        Vestavěné funkce:

        Funkce Popis
        printf("...") Vytisknout formátovaný řetězec
        čas("...") Vytisknout formátovaný čas
        systém("...") Spustit příkaz shell
        @ =count() Počítat události
        @ =hist(x) Histogram mocniny 2 pro x
        @ =lhist(x, min, max, krok) Lineární histogram pro x

          Podrobnosti naleznete v referenční příručce.

          Výukový program One-liner

          Skvělý způsob, jak se naučit bpftrace, je přes jednořádkové, které jsem přeměnil na výukový program s jedním řádkem, který pokrývá následující:

          Výpis sond bpftrace -l 'tracepoint:syscalls:sys_enter_*'
          Ahoj světe bpftrace -e 'BEGIN { printf("ahoj světe\n") }'
          Soubor se otevře bpftrace -e 'tracepoint:syscalls:sys_enter_open { printf("%s %s\n", comm, str(args->název souboru)) }'
          Počty systémových volání podle procesu bpftrace -e 'tracepoint:raw_syscalls:sys_enter { @[comm] =count() }'
          Distribuce read() bajtů bpftrace -e 'tracepoint:syscalls:sys_exit_read /pid ==18644/ { @bytes =hist(args->retval) }'
          Dynamické trasování jádra bajtů read() bpftrace -e 'kretprobe:vfs_read { @bytes =lhist(retval, 0, 2000, 200) }'
          Časování read()s bpftrace -e 'kprobe:vfs_read { @start[tid] =nsecs } kretprobe:vfs_read /@start[tid]/ { @ns[comm] =hist(nsecs - @start[tid]); delete(@start[tid]) }'
          Počítání událostí na úrovni procesu bpftrace -e 'tracepoint:sched:sched* { @[jméno] =count() } interval:s:5 { exit() }'
          Profilové zásobníky jádra na CPU bpftrace -e 'profile:hz:99 { @[stack] =count() }'
          Trasování plánovače bpftrace -e 'tracepoint:sched:sched_switch { @[stack] =count() }'
          Blokovat trasování I/O bpftrace -e 'tracepoint:blok:block_rq_issue { @ =hist(args->bytes); }
          Trasování struktury jádra (skript, nikoli jednořádkový) Příkaz: bpftrace path.bt , kde je soubor path.bt:



          #include

          #include




          kprobe:vfs_open { printf("otevřená cesta:%s\n", str(((cesta *)arg0)->dentry->d_name .název)); }

          Vysvětlení každého z nich naleznete v tutoriálu.

          Poskytované nástroje

          Kromě jednořádkových skriptů mohou být programy bpftrace víceřádkové skripty. Bpftrace se dodává s 28 z nich jako nástroje:

          Ty lze nalézt v /tools adresář:

          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

          Kromě jejich použití při diagnostice problémů s výkonem a obecném odstraňování problémů poskytují také další způsob, jak se naučit bpftrace. Zde je několik příkladů.

          Zdroj

          Zde je kód na 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  }

          Je přímočarý, snadno čitelný a dostatečně krátký, aby se dal zařadit na snímek. Tato verze používá dynamické trasování jádra k instrumentaci blk_account_io_start() a blk_account_io_done() funkce a předává mezi nimi časové razítko zadané na arg0 ke každému. arg0 na kprobe je prvním argumentem této funkce, což je požadavek struktury * a jeho adresa paměti se používá jako jedinečný identifikátor.

          Ukázkové soubory

          Snímky obrazovky a vysvětlení těchto nástrojů můžete vidět v repozitáři GitHubu jako *_example.txt soubory. Například:

          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.
          [...]

          Někdy může být nejúčinnější přejít přímo na ukázkový soubor, když se pokoušíte porozumět těmto nástrojům, protože výstup může být samozřejmý (je navržen!).

          Manuálové stránky

          Existují také manuálové stránky pro každý nástroj v úložišti GitHub pod /man/man8. Zahrnují části o výstupních polích a očekávané režii nástroje.

          # 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.
          [...]

          Psaní všech těchto manuálových stránek bylo tou nejméně zábavnou částí vývoje těchto nástrojů a psaní některých trvalo déle než vývoj nástroje, ale je hezké vidět konečný výsledek.

          bpftrace vs. BCC

          Od doby, kdy se eBPF začlenilo do jádra, bylo největší úsilí věnováno frontendu BCC, který poskytuje knihovnu BPF a rozhraní Python, C++ a Lua pro psaní programů. Vyvinul jsem spoustu nástrojů v BCC/Pythonu; funguje to skvěle, i když kódování v BCC je podrobné. Pokud řešíte problém s výkonem, bpftrace je lepší pro vaše jednorázové vlastní dotazy. Pokud píšete nástroj s mnoha možnostmi příkazového řádku nebo agenta, který používá knihovny Python, měli byste zvážit použití BCC.

          V týmu pro výkon Netflix používáme oba:BCC pro vývoj předpřipravených nástrojů, které mohou ostatní snadno používat, a pro vývoj agentů; a bpftrace pro ad hoc analýzu. Tým síťových inženýrů používá BCC k vývoji agenta pro své potřeby. Bezpečnostní tým se nejvíce zajímá o bpftrace pro rychlou ad hoc instrumentaci pro detekci zero-day zranitelností. A očekávám, že vývojářské týmy budou používat obojí, aniž by o tom věděly, prostřednictvím samoobslužných GUI, která vytváříme (Vector), a příležitostně mohou SSH do instance a spustit předpřipravený nástroj nebo ad hoc bpftrace one-liner.

          Další informace

          • Úložiště bpftrace na GitHubu
          • Výukový program bpftrace one-liner
          • Referenční příručka bpftrace
          • Úložiště BCC pro složitější nástroje založené na BPF

          Také mám letos vydanou knihu, která se zabývá bpftrace:BPF Performance Tools:Linux System and Application Observability , kterou vydá Addison Wesley a která obsahuje mnoho nových nástrojů bpftrace.

          Děkuji Alastairu Robertsonovi za vytvoření bpftrace a komunitám bpftrace, BCC a BPF za veškerou práci za posledních pět let.


          Linux
          1. Úvod do Nmap na Kali Linuxu

          2. 10 Linuxových příkazů pro diagnostiku sítě

          3. Úvod do firewallů webových aplikací pro správce systému Linux

          1. Příkazy FreeDOS pro fanoušky Linuxu

          2. 4 linuxové distribuce pro hraní her

          3. Stručný úvod do rolí Ansible pro správu systému Linux

          1. 5 aplikací pro zvýšení produktivity pro Linux

          2. Výběr tiskárny pro Linux

          3. Úvod do emulátoru terminálu DomTerm pro Linux