Bemutatkozik a bpftime projekt, amely a runtime-ot és egy virtuális gépet fejleszt a felhasználói térben végrehajtott eBPF kezelők számára. A bpftime lehetővé teszi teljes mértékben a felhasználói térben végrehajtott eBPF nyomkövető és beavatkozási programok futtatását, amelyek olyan funkciókat használnak, mint az uprobe és a rendszerhívások szoftveres megfigyelése. Megjegyzik, hogy a felesleges kontextusváltások kizárásával a bpftime akár tízszeres költségcsökkentést is lehetővé tesz az uprobe és uretprobe funkcionalitáshoz képest, amelyet a Linux kernel biztosít. Ezen kívül a bpftime jelentősen megkönnyíti a hibakeresést, potenciálisan alkalmazható Linux kernel nélküli rendszereken, és nem igényel széleskörű jogosultságokat, amelyek szükségesek eBPF alkalmazások kernelbe történő betöltéséhez. A projekt kódja C/C++ nyelveken íródott és MIT licenc alatt terjesztik.
A rendszerhívások megfigyelése és az uprobe-ellenőrzések integrációja a végrehajtott kód újraírásának technikájával valósul meg, amely során a rendszerhívások, belépési pontok és lokális funkciók hívásait a hibakereső kezelőkre irányítják a végrehajtott alkalmazás gépi kódjának módosításával, ami lényegesen hatékonyabb, mint az uprobe szintű kernel megfigyelés.
Támogatja a funkciók cseréjét vagy módosítását, kezelők (hook-ok) és szűrők csatolását, paraméterek irányítását, blokkolását vagy cseréjét a rendszerhívások során, belépési és kilépési pontok megfigyelését, valamint kezelők behelyettesítését a kódban található tetszőleges eltolásnál. A bpftime bármely futó folyamathoz csatlakoztatható a rendszerben a folyamok újraindítása vagy újrafordítása nélkül. A bpftime beillesztése folyamatokhoz ptrace segítségével történhet, míg a betöltésekhez LD_PRELOAD használható.
A bpftime keretén belül egy runtime fejlődik, amely lehetővé teszi eBPF programok csatlakoztatását a rendszerhívási és uprobe nyomkövetési pontokhoz; virtuális gép eBPF JIT-tel a felhasználói folyamat szintjén végrehajtott eBPF programok elkülönített futtatása érdekében (továbbá támogatott az AOT-compiler); háttérfolyamat a maggal való kölcsönhatásra és az uprobe alrendszerrel való kompatibilitás megszervezésére (a bpftime támogatja az eBPF betöltési módját a felhasználói térbe a magból, lehetővé téve az együttműködést a magban használt eBPF programokkal, például kprobe-ok feldolgozására vagy hálózati szűrők beállítására).
Az eBPF virtuális gépe csatlakoztatható könyvtár formájában van megvalósítva, és hasonló API-t kínál, mint az ubpf, lehetővé téve annak integrálását más projektekbe. Támogatja a több folyamatból származó adatok összesítését megosztott memóriában elhelyezett közös eBPF Map létrehozásával. A bpftime-mal együtt használhatók a magban használt eBPF tipikus kezelők is, és a gyűjtéshez a clang és libbpf alapú szabványos eszközök alkalmazhatók.
A bpftime-mal a felhasználói térben futtathatók olyan nyomkövető rendszerek, mint a BCC, bpftrace és Deepflow. Például bemutatásra került a BCC keretrendszerből származó sslsniff scripttel végzett titkosított forgalom elemzése és tárolása az nginx-ben. A végzett tesztek során az nginx teljesítménye sslsniff kernel oldali végrehajtásakor 58%-kal csökkent, míg a kezelő felhasználói térbe helyezése esetén 12,3%-kal.
A folyamatok nyomkövetésének architektúrája az eredeti eBPF használatával a magban:

A felhasználói térbeli nyomkövetés architektúrája bpftime használatával:

Hibrid üzemmód, amelyben a bpftime együttműködik az eBPF-fel a magban, például hálózati szűrők beállítására vagy egyes kezelők felhasználói térbe való áthelyezésére:

A jövőbeli tervekből kiemelendő: hibaillesztési lehetőségek (Fault Injection); forró javítások (Hot Patching) a logika módosítására vagy a bináris összesítések hibáinak javítására; Nginx modul létrehozása, amely lehetővé teszi eBPF programokkal való kiterjesztések létrehozását (például dinamikus útvonalválasztás, gyorsítótárazás, biztonsági politikák alkalmazása és terheléselosztás); a FUSE alrendszer funkcionalitásának bővítése (például eBPF programok formájában kiterjesztések létrehozása a fájlrendszer gyorsítótárazására vagy hozzáférés kezelésére).
Forrás: opennet.ru
