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.