Esitletakse bpftime projekti, mis arendab runtime'i ja virtuaalmasinat eBPF töötlejate täitmiseks kasutaja ruumis. Bpftime võimaldab täielikult kasutaja ruumis käitada eBPF jälgimise ja protsesside sekkumise programme, kasutades selliseid võimalusi nagu uprobe ja süsteemikutsungite tarkvaraline ülemineku mõju. Tõdetakse, et bpftime'i tõttu, mis välistab liigseid konteksti vahetusi, on võimalik saavutada kümnekordne kulu vähenemine võrreldes uprobe ja uretprobe funktsionaalsusega, mida pakub Linuxi tuum. Lisaks muudab bpftime oluliselt tõrkeotsingu lihtsamaks, seda saab potentsiaalselt kasutada süsteemides ilma Linuxi tuumata ning see ei nõua eBPF rakenduse laadimiseks tuumas laiendatud õigusi. Projekti kood on kirjutatud keeles C/C++ ja jagatakse MIT litsentsi alusel.
Süsteemikutsungite püüdmine ja uprobe-kontrollide integreerimine on teostatud täitmise koodeksitehnika (binary rewriting) abil, mille käigus asendatakse süsteemikutsungite, sisenevate punktide ja kohalike funktsioonide kutsed ümbersuunamisega silumine töötlejatele, muutes käivitatava rakenduse masinakoode, mis on oluliselt tõhusam kui uprobe taseme püüdmise korral Linuxi tuumas.
Toetatakse funktsioonide asendamise või muutmise, töötlejatõmbluste (hook-ide) ja filtrite kinnitamist, parameetrite süsteemikutsungite ümbersuunamist, blokeerimist või asendamist, sisenevate ja väljuvate punktide püüdmist ning töötleja asendamist suvalises koodiseisundis. Bpftime saab kinnitada igale töötavale protsessile süsteemis, ilma et oleks vaja neid taaskäivitada või uuesti koguda. Bpftime'i asendamine protsessides võib toimuda töötavate protsesside kaudu, kasutades ptrace'i, ja laaditavate kaudu LD_PRELOAD'i.
Bpftime koosseisus arendatakse välja runtime, mis võimaldab kinnitada eBPF-programme süsteemikutsungite ja uprobe jälgimise punktidesse; virtuaalne masin eBPF JIT abil võimaldab isoleeritud eBPF programmide täitmist kasutaja protsessi tasemel (toetatakse ka AOT-kompileerimist); taustprotsess interaktsiooniks tuumaga ja tuuma uprobe-alamhulga ühilduvuse korraldamiseks (bpftime toetab eBPF laadimist kasutaja ruumi tuumast, et koostööd teha eBPF programmidega tuumas, mida kasutatakse näiteks kprobe töötlemiseks või võrgufiltrite rakendamiseks).
eBPF virtuaalne masina on kujundatud pistikbibliotekina ja pakub ubpf-le sarnast API-d, mis võimaldab selle funktsionaalsuse integreerimist teistesse projektidesse. Andmete kokkuvõtmiseks mitmest protsessist toetatakse ühiselt kasutatavate eBPF Mapide loomist jagatud mälus. Koos bpftime'iga saab kasutada ka tüüpilisi eBPF töötlejaid, mis on kirjutatud tuuma kasutamiseks, ja koostamiseks saab kasutada standardseid tööriistu, mis põhinevad clangil ja libbpf'il.
Kasutaja ruumis võivad töötada jälgimissüsteemid nagu BCC, bpftrace ja Deepflow. Näiteks on demonstreeritud BCC raamistikust script sslsniff kasutamine krüpteeritud liikluse analüüsimiseks ja salvestamiseks nginxis. Testide käigus langes nginx-i jõudlus sslsniff'i käivitamisel tuumas 58% ja kasutajaruumis töötava töötleja korral 12,3%.
Protsesside jälgimise arhitektuur, kasutades originaalset eBPF tuumas:

Kasutajaruumis jälgimise arhitektuur, kasutades bpftime:

Hübriidrežiim, kus bpftime töötab koos eBPF-iga tuumas, näiteks võrgufiltrite seadistamiseks või üksikute töötlejate viimiseks kasutajaruumis:

Tuleviku plaanide hulgas on: võimalus exception'e asendada (Fault Injection); kuumate patch'ide pealekandmine (Hot Patching) binaarsete kogumite töölogika muutmiseks või vigade parandamiseks; Nginx'i mooduli loomine, mis võimaldab eBPF programmidega laiendusi luua (nt dünaamiliseks marsruutide valimiseks, vahemäluks, turvapoliitikate rakendamiseks ja koormuse tasakaalustamiseks); FUSE alamsüsteemi võimaluste laiendamine (nt eBPF programmide kujul laienduste loomine failisüsteemile vahemäluks või juurdepääsu haldamiseks).
Allikas: opennet.ru
