A fost lansată o versiune experimentală a instrumentului de depanare dinamică DTrace pentru Linux 2.0.0-1.14, implementată ca un proces care funcționează în spațiul utilizatorului, folosind subsystemul eBPF și mecanismele standard de trasare furnizate de nucleul Linux. Din punct de vedere funcțional, implementarea DTrace bazată pe eBPF este similară primei implementări DTrace pentru Linux, realizată sub formă de modul de nucleu. Codul proiectului este distribuit sub licența GPLv2.
Instrumentul poate fi utilizat cu nucleele standard Linux care suportă BPF. Este necesară biblioteca libctf, care implementează suportul pentru formatul de depanare CTF (Compact Type Format), care face parte din pachetul binutils, începând cu versiunea 2.40, sau biblioteca libdtrace-ctf, portată din Solaris. Opțional, sunt oferite două patch-uri pentru nucleul 6.7, care permit activarea funcțiilor extinse pentru obținerea de date suplimentare despre module și nucleu.
Tehnologia DTrace a fost dezvoltată pentru a aborda problemele de trasare dinamică a nucleului și a aplicațiilor finale în sistemul de operare Solaris. DTrace oferă utilizatorului posibilitatea de a urmări detaliat comportamentul sistemului și de a diagnostica probleme în timp real. În timpul depanării, DTrace nu influențează funcționarea aplicațiilor investigate și nu afectează performanța acestora, ceea ce permite analizarea sistemelor în funcțiune. Unul dintre avantajele DTrace este limbajul de nivel înalt D, similar cu AWK, care facilitează semnificativ crearea scripturilor de trasare, comparativ cu instrumentele oferite pentru scrierea handler-elor în eBPF, utilizând limbajele C, Python și Lua cu biblioteci externe.
Funcționalități principale:
- Providerii disponibili:
- cpc (Counter de Performanță CPU) — obținerea informațiilor despre performanță.
- dtrace — handleri BEGIN, END și ERROR, care sunt activate înainte sau după alte verificări, precum și în caz de erori.
- fbt (Function Boundary Tracing) — urmărirea apelurilor la funcțiile nucleului.
- lockstat — urmărirea stării blocajelor.
- pid — urmărirea apelurilor la funcții în procese care rulează în spațiul utilizatorului.
- proc — urmărirea activității legate de procese, cum ar fi pornirea și terminarea (fork, exec, exit, fault).
- profile — salvarea statisticilor despre performanță pe intervale de timp specificate.
- sdt, rawtp - urmărirea statică a nucleului (SDT - Statically Defined Tracing).
- usdt: urmărirea statică a aplicațiilor (USDT - Userspace Statically Defined Tracing)
- sched - urmărirea distribuției resurselor CPU.
- sycall - urmărirea intrărilor în apeluri sistem și ieșirilor din acestea.
- Agregarea datelor colectate: posibilitatea de a aplica funcții agregate (avg, count, llquantize, lquantize, max, min, quantize, stddev și sum) și acțiuni agregate (clear, normalize, printa). Suport pentru salvarea rezultatelor aplicării funcțiilor agregate în array-uri obișnuite și asociative.
- Suport pentru urmărirea speculativă, care permite urmărirea efemeră a datelor, decidând care dintre acestea ar trebui să fie stocate în bufferul de urmărire și care trebuie ignorate. Funcțiile disponibile: speculation, speculate, commit și discard.
- Suport pentru variabile globale și locale, TLS (Thread-Local Storage), array-uri asociative și string-uri.
- Furnizarea variabilelor încorporate: arg0 - arg9, args[], caller, curcpu, curthread, epid, errno, execname, gid, id, pid, ppid, probefunc, probemod, probename, probeprov, stackdepth, tid, timestamp, ucaller, uid, uregs[], ustackdepth, walltimestamp.
- Suport pentru acțiuni: exit, freopen, 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_adaptive, mutex_type_spin, ntohl, ntohll, ntohs, progenyof, rand, rindex, rw_iswriter, rw_read_held, rw_write_held, strchr, strjoin, strlen, strrchr, strstr, strtok, substr.
- Disponibilitatea contoarelor de date care nu intră în bufferul de urmărire.
- Suport pentru compilarea scripturilor de urmărire în limbajul D în forma programelor BPF.
- Precompilarea funcțiilor BPF pentru apeluri de biblioteci.
- Opțiunea bpflog pentru a obține un log de verificare a programelor BPF încărcate.
- Generarea dinamică a codului și precompilarea codului pentru reutilizarea în programele BPF.
Modificări în noua versiune:
- În providerul pid, utilizat pentru urmărirea proceselor în spațiul utilizatorului, a fost adăugată suportul pentru urmărirea execuției instrucțiunilor prin offset-ul lor în cod.
- A fost adăugată suportul pentru utilizarea funcțiilor stack() și ustack() pentru agregarea datelor colectate.
- Posibilitatea de a elimina din array-urile asociative elemente de orice tip prin atribuire a literale 0.
- A fost adăugată acțiunea print pentru a afișa date structurate cu adnotări de tip.
- Funcțiile încorporate cleanpath(), d_path() și link_ntop() au fost adăugate.
- Parametrul „-xcpu” a fost adăugat, permițând asocieri de verificări cu anumite CPU-uri.
- Parametrul „-xlockmem” a fost adăugat pentru a limita dimensiunea memoriei.
- S-a asigurat posibilitatea salvării datelor de urmărire a proceselor (USDT) între repornirile dtprobed.
- Suport pentru mecanismul BTF (BPF Type Format), care oferă informații pentru verificarea tipurilor în pseudocodul BPF.
- Posibilitatea utilizării scriptului configure pentru compilare.
Sursa: opennet.ro
