Ang proyekto ng bpftime ay bubuo ng pagpapatupad ng user-space ng eBPF

Ang proyekto ng bpftime ay ipinakita, na bumubuo ng isang runtime at isang virtual machine para sa pagpapatupad ng mga humahawak ng eBPF sa espasyo ng gumagamit. Binibigyang-daan ng Bpftime ang pagsubaybay sa eBPF at mga programa ng interbensyon sa proseso na ganap na tumakbo sa espasyo ng user, gamit ang mga feature gaya ng uprobe at programmatic system call interception. Napansin na sa pamamagitan ng pag-aalis ng mga hindi kinakailangang switch ng konteksto, ang bpftime ay makakamit ng sampung beses na pagbawas sa overhead kumpara sa paggamit ng uprobe at uretprobe functionality na ibinigay ng Linux kernel. Bilang karagdagan, lubos na pinapasimple ng bpftime ang pag-debug, posibleng magamit sa mga system na walang kernel ng Linux, at hindi nangangailangan ng mataas na mga pribilehiyong kinakailangan para mag-load ng eBPF application sa kernel. Ang code ng proyekto ay nakasulat sa C/C++ at ipinamamahagi sa ilalim ng lisensya ng MIT.

Ang interception ng mga system call at integration ng uprobe checks ay ipinapatupad gamit ang pamamaraan ng muling pagsulat ng executable code (binary rewriting), kung saan ang mga tawag sa system call, entry point at lokal na function ay pinapalitan ng isang transition sa debugging handler sa pamamagitan ng pagbabago ng machine code ng ang executing application, na mas epektibo kaysa sa pag-aayos ng interception gamit ang uprobe sa Linux kernel level.

Sinusuportahan ang mga pagpapatakbo ng pagpapalit o pagpapalit ng mga function, pag-attach ng mga handler (hooks) at mga filter, pag-redirect, pagharang o pagpapalit ng mga parameter ng system call, pagharang sa mga entry at exit point ng mga function, pati na rin ang pagpapalit ng handler sa isang arbitrary na offset sa code. Maaaring i-attach ang Bpftime sa anumang tumatakbong proseso sa system nang hindi na kailangang i-restart o muling itayo ito. Ang pagpapalit ng bpftime sa mga proseso ay maaaring gawin para sa pagpapatakbo ng mga proseso sa pamamagitan ng ptrace, at para sa pag-load ng mga proseso sa pamamagitan ng LD_PRELOAD.

Isang runtime ang binubuo sa loob ng bpftime na nagpapahintulot sa mga programang eBPF na ikabit sa mga system call trace point at uprobe; birtwal na makina eBPF na may JIT para sa nakahiwalay na pagpapatupad ng mga programang eBPF sa antas ng proseso ng gumagamit (sinusuportahan din ang AOT compilation); isang proseso sa background para sa pakikipag-ugnayan sa kernel at pagbibigay ng pagiging tugma sa uprobe subsystem ng kernel (sinusuportahan ng bpftime ang paglo-load ng eBPF sa espasyo ng gumagamit mula sa kernel upang magbigay ng pakikipagtulungan sa mga programang eBPF sa kernel, na ginagamit, halimbawa, upang iproseso ang kprobe o upang mag-set up ng mga network filter).

Ang eBPF virtual machine ay idinisenyo bilang isang plug-in na library at nagbibigay ng API na katulad ng ubpf, na nagbibigay-daan dito na magamit upang isama ang functionality ng eBPF sa iba pang mga proyekto. Para sa buod na pagsasama-sama ng data mula sa ilang mga proseso, ang paggawa ng magkasanib na eBPF Maps na matatagpuan sa shared memory ay sinusuportahan. Kasama ng bpftime, ang mga karaniwang eBPF handler na isinulat para gamitin sa kernel ay maaaring gamitin, at karaniwang clang at libbpf-based na mga tool ay maaaring gamitin para sa pagpupulong.

Sa bpftime, ang mga sistema ng pagsubaybay tulad ng BCC, bpftrace at Deepflow ay maaaring isagawa sa espasyo ng gumagamit. Halimbawa, ipinakita namin ang paggamit ng script ng sslsniff mula sa balangkas ng BCC upang suriin at i-save ang naka-encrypt na trapiko sa nginx. Sa mga pagsubok na isinagawa, ang pagganap ng nginx ay bumaba ng 58% kapag nagpapatupad ng sslsniff sa gilid ng kernel, at ng 12.3% kapag inililipat ang handler sa espasyo ng gumagamit.

Ang arkitektura ng pagsubaybay sa proseso gamit ang orihinal na eBPF sa kernel:

Ang proyekto ng bpftime ay bubuo ng pagpapatupad ng user-space ng eBPF

Ang arkitektura ng pagsubaybay sa espasyo ng gumagamit gamit ang bpftime:

Ang proyekto ng bpftime ay bubuo ng pagpapatupad ng user-space ng eBPF

Hybrid mode, kung saan gumagana ang bpftime kasama ng eBPF sa kernel, halimbawa, upang mag-install ng mga filter ng network o ilipat ang mga indibidwal na humahawak sa espasyo ng user:

Ang proyekto ng bpftime ay bubuo ng pagpapatupad ng user-space ng eBPF

Kasama sa mga plano sa hinaharap ang: ang kakayahang palitan ang mga eksepsiyon (Fault Injection); hot patching (Hot Patching) para baguhin ang logic ng operasyon o itama ang mga error sa binary assemblies; paggawa ng module para sa Nginx na nagbibigay-daan sa iyong gumawa ng mga extension gamit ang mga programang eBPF (halimbawa, para sa pagpili ng dynamic na ruta, pag-cache, paglalapat ng mga patakaran sa seguridad at pagbabalanse ng load); pagpapalawak ng mga kakayahan ng FUSE subsystem (halimbawa, paggawa ng mga extension sa FS para sa pag-cache o access control sa anyo ng mga eBPF program).

Pinagmulan: opennet.ru

Magdagdag ng komento