Proiectul bpftime dezvoltă o implementare a eBPF în spațiul utilizatorului

Este prezentat proiectul bpftime, care dezvoltă un runtime și o mașină virtuală pentru executarea handlerelor eBPF în spațiul utilizatorului. Bpftime permite programelor de urmărire și intervenție a procesului eBPF să ruleze în întregime în spațiul utilizatorului, folosind funcții precum uprobe și interceptarea apelurilor de sistem programatice. Se observă că prin eliminarea comutărilor de context inutile, bpftime poate obține o reducere de zece ori a supraîncărcării în comparație cu utilizarea funcționalității uprobe și uretprobe furnizate de nucleul Linux. În plus, bpftime simplifică foarte mult depanarea, poate fi utilizat pe sisteme fără un nucleu Linux și nu necesită privilegiile ridicate necesare pentru a încărca o aplicație eBPF în nucleu. Codul proiectului este scris în C/C++ și este distribuit sub licența MIT.

Interceptarea apelurilor de sistem și integrarea verificărilor uprobe este implementată folosind tehnica de rescrire a codului executabil (rescriere binară), în care apelurile la apelurile de sistem, punctele de intrare și funcțiile locale sunt înlocuite cu o tranziție la manipulatorii de depanare prin modificarea codului mașinii de aplicația de execuție, care este mult mai eficientă decât organizarea interceptării folosind uprobe la nivel de kernel Linux.

Sunt acceptate operațiuni de înlocuire sau schimbare a funcțiilor, atașarea handler-urilor (cârlige) și filtrelor, redirecționarea, blocarea sau înlocuirea parametrilor de apel de sistem, interceptarea punctelor de intrare și ieșire ale funcțiilor, precum și înlocuirea unui handler la un decalaj arbitrar din cod. Bpftime poate fi atașat la orice proces care rulează pe sistem fără a fi nevoie să-l reporniți sau reconstruiți. Înlocuirea bpftime în procese se poate face pentru rularea proceselor prin ptrace și pentru încărcarea celor prin LD_PRELOAD.

Ca parte a bpftime, se dezvoltă un timp de execuție care vă permite să atașați programe eBPF la apelurile de sistem și la punctele de urmărire; mașină virtuală eBPF cu JIT pentru execuția izolată a programelor eBPF la nivel de proces utilizator (compilarea AOT este suportată suplimentar); un proces de fundal pentru interacțiunea cu nucleul și organizarea compatibilității cu subsistemul uprobe al nucleului (bpftime acceptă modul de încărcare a eBPF în spațiul utilizatorului din nucleu pentru a organiza colaborarea cu programele eBPF din nucleu, utilizat, de exemplu, pentru procesarea kprobe sau setarea filtrelor de rețea).

Mașina virtuală eBPF este concepută ca o bibliotecă de plug-in și oferă un API similar cu ubpf, care îi permite să fie utilizat pentru a integra funcționalitatea eBPF în alte proiecte. Pentru agregarea rezumată a datelor din mai multe procese, este acceptată crearea de hărți comune eBPF situate în memoria partajată. Împreună cu bpftime, pot fi utilizați handlere standard eBPF scrise pentru a fi utilizate în nucleu, iar instrumentele standard bazate pe clang și libbpf pot fi folosite pentru asamblare.

Cu bpftime, sistemele de urmărire precum BCC, bpftrace și Deepflow pot fi executate în spațiul utilizatorului. De exemplu, am demonstrat utilizarea scriptului sslsniff din cadrul BCC pentru a analiza și salva traficul criptat în nginx. În testele efectuate, performanța nginx scade cu 58% la executarea sslsniff pe partea kernelului și cu 12.3% la mutarea handler-ului în spațiul utilizatorului.

Arhitectura de urmărire a procesului folosind eBPF original în nucleu:

Proiectul bpftime dezvoltă o implementare a eBPF în spațiul utilizatorului

Arhitectura de urmărire a spațiului utilizatorului folosind bpftime:

Proiectul bpftime dezvoltă o implementare a eBPF în spațiul utilizatorului

Modul hibrid, în care bpftime lucrează împreună cu eBPF în nucleu, de exemplu, pentru a instala filtre de rețea sau pentru a muta handlere individuali în spațiul utilizatorului:

Proiectul bpftime dezvoltă o implementare a eBPF în spațiul utilizatorului

Planurile de viitor includ: capacitatea de a înlocui excepții (Fault Injection); hot patching (Hot Patching) pentru a schimba logica de funcționare sau a corecta erorile din ansamblurile binare; crearea unui modul pentru Nginx care vă permite să creați extensii folosind programe eBPF (de exemplu, pentru selecția dinamică a rutei, stocarea în cache, aplicarea politicilor de securitate și echilibrarea încărcării); extinderea capabilităților subsistemului FUSE (de exemplu, crearea de extensii la FS pentru stocarea în cache sau controlul accesului sub formă de programe eBPF).

Sursa: opennet.ru

Adauga un comentariu