A fost introdusă o versiune experimentală a setului de instrumente de depanare dinamică DTrace pentru Linux 2.0.0-1.14, implementat ca un proces în spațiul utilizatorului folosind subsistemul eBPF și mecanismele standard de urmărire furnizate de kernel LinuxÎn ceea ce privește funcționalitatea, implementarea DTrace bazată pe eBPF este apropiată de prima implementare DTrace pentru Linux, implementat ca modul kernel. Codul proiectului este distribuit sub licența GPLv2.
Setul de instrumente poate fi utilizat cu kerneluri standard Linux, suportând BPF. Aceasta necesită biblioteca libctf, care implementează suport pentru formatul de depanare CTF (Compact Type Format), inclus în pachetul binutils încă de la versiunea 2.40, sau biblioteca libdtrace-ctf, portată din Solaris. Două patch-uri pentru kernelul 6.7 sunt disponibile opțional, permițând capacități avansate pentru obținerea de date suplimentare despre module și kernel.
Tehnologia DTrace a fost dezvoltată pentru a rezolva problemele de urmărire dinamică a nucleului și a aplicațiilor finale în sistemul de operare Solaris. DTrace oferă utilizatorului posibilitatea de a monitoriza comportamentul sistemului în detaliu și de a diagnostica problemele în timp real. În timpul procesului de depanare, DTrace nu afectează funcționarea aplicațiilor studiate și nu afectează în niciun fel performanța acestora, ceea ce vă permite să organizați analiza sistemelor care rulează din mers. Unul dintre punctele forte ale DTrace este limbajul D de nivel înalt, similar cu AWK, în care este mult mai ușor să creați scripturi de urmărire decât utilizarea instrumentelor oferite pentru scrierea handlerelor eBPF în C, Python și Lua cu biblioteci externe.
Caracteristici principale:
- Furnizori disponibili:
- cpc (CPU Performacne Counter) - obținerea de informații de performanță.
- dtrace - handlerele BEGIN, END și ERROR rulează înainte sau după alte verificări, precum și atunci când apar erori.
- fbt (Function Boundary Tracing) - urmărirea apelurilor către funcțiile kernelului.
- lockstat - urmărirea stării încuietorilor.
- pid - Urmărește apelurile de funcții în procesele care rulează în spațiul utilizatorului.
- proc - monitorizează activitatea legată de proces, cum ar fi pornirea și oprirea (furcătură, exec, ieșire, eroare).
- profil - salvarea statisticilor de performanță la intervale specificate.
- sdt, rawtp - urmărirea nucleului statică (SDT - Statically Defined Tracing).
- usdt: urmărire statică a aplicației (USDT - Urmărire definită static în spațiul utilizatorului)
- sched - monitorizează alocarea resurselor CPU.
- sycall - Urmărește intrarea și ieșirea apelurilor de sistem.
- Agregarea datelor colectate: capacitatea de a utiliza funcții de agregare (avg, count, llquantize, lquantize, max, min, quantize, stddev și sum) și acțiuni agregate (clear, normalize, normalize, print). Suport pentru stocarea rezultatelor aplicării funcțiilor agregate în tablouri obișnuite și asociative.
- Suport pentru urmărirea speculativă, care vă permite să monitorizați efemer datele, hotărând care dintre ele ar trebui să fie capturate în bufferul de urmărire și care ar trebui eliminate. Funcțiile disponibile sunt speculație, speculație, comitere și renunțare.
- Suport pentru variabile globale și locale, TLS (Thread-Local Storage), matrice asociative și șiruri.
- Furnizarea de variabile încorporate: arg0 - arg9, args[], apelant, curcpu, curthread, epid, errno, execname, gid, id, pid, ppid, probefunc, probemod, probename, probeprov, stackdepth, tid, timestamp, ucaller, uid, uregs[], ustackdepth, walltimestamp.
- Acțiuni suportate: exit, freeopen, ftruncate, mod, printa, printf, raise, setopt, stack, sym, system, trace, tracemem, uaddr, umod, ustack și usym.
- Disponibilitatea funcțiilor încorporate: alloca, basename, bcopy, copyin, copyinstr, copyinto, copyout, copyoutstr, dirname, getmajor, getminor, htonl, htonll, htons, index, inet_ntoa, lltostr, mutex_owned, mutex_owner, mutex_type_ntohls, mutex_typehls, mutex_typehls , ntohll, ntohs, progenyof, rand, rindex, rw_iswriter, rw_read_held, rw_write_held, strchr, strjoin, strlen, strrchr, strstr, strtok, substr.
- Prezența contoarelor de date care nu sunt incluse în buffer-urile de urmărire.
- Suport pentru compilarea scripturilor de urmărire D în forma programului BPF.
- Precompilarea funcțiilor BPF pentru apelurile de bibliotecă.
- Opțiunea bpflog pentru a obține un jurnal de verificare a programelor BPF încărcate.
- Generarea dinamică a codului și precompilarea codului pentru reutilizare în programele BPF.
Modificări în noua versiune:
- Furnizorul pid, folosit pentru a urmări procesele din spațiul utilizatorului, a adăugat suport pentru urmărirea execuției instrucțiunilor prin offset-ul lor în cod.
- S-a adăugat suport pentru utilizarea funcțiilor stack() și ustack() pentru a agrega datele colectate.
- Abilitatea de a elimina elemente de orice tip din tablourile asociative prin atribuirea literalului 0.
- A fost adăugată o acțiune de imprimare pentru ieșirea datelor structurate cu adnotări de tip.
- S-au adăugat noi funcții încorporate cleanpath(), d_path() și link_ntop().
- S-a adăugat parametrul „-xcpu”, care vă permite să legați verificări la anumite procesoare.
- S-a adăugat opțiunea „-xlockmem” pentru a limita dimensiunea memoriei.
- Oferă posibilitatea de a salva datele de urmărire a procesului (USDT) între repornirile dtprobed.
- Suport pentru mecanismul BTF (BPF Type Format), care oferă informații de verificare a tipului în pseudocod BPF.
- Abilitatea de a utiliza scriptul de configurare pentru a construi.
Sursa: opennet.ru
