Esitleme eksperimentaalset DTrace dünaamika tõrkeotsingu tööriista väljaandele Linux 2.0.0-1.14, mis on rakendatud kasutajaruumi protsessinana, kasutades eBPF alamsüsteemi ja Linuxi kernelist pakutavaid jälgimise mehhanisme. Funktsionaalsuse poolest on eBPF-põhine DTrace teostus sarnane esimesel DTrace rakendusel Linuxile, mis tehti kernelimoodulina. Projekti kood on litsentseeritud GPLv2 alusel.
Tööriista saab kasutada koos Linuxi ametlike kernelitega, mis toetavad BPF-i. Toimimiseks on vajalik libctf teek, mis rakendab CTF (Compact Type Format) tõrkeformaadi tuge, mis on osa binutils paketist alates väljaandest 2.40, või libdtrace-ctf teek, mis on portitud Solarisest. Valikuliselt on saadaval kaks 6.7 kerneliparandust, mis võimaldavad juurdepääsu täiendavatele andmete omadustele, mis puudutavad mooduleid ja kernelit.
DTrace tehnoloogia loodi selleks, et lahendada dünaamilise jälgimise ülesandeid kernelis ja lõpprakendustes Solaris operatsioonisüsteemis. DTrace võimaldab kasutajal süstemaatiliselt jälgida süsteemi käitumist ja reaalajas tõrkeotsingut teostada. Tõrkeotsingu käigus ei mõjuta DTrace uuritavate rakenduste tööd ega mõjuta nende jõudlust, mistõttu on võimalik analüüsida töötavaid süsteeme reaalajas. DTrace tugevaimaks küljeks on kõrgtaseme D keele olemasolu, mis sarnaneb AWK-ile, kuhu on tunduvalt lihtsam luua jälgimisskripte kui eBPF-i jaoks ette nähtud tööriistade abil, mis kirjutavad töötlejat C, Python ja Lua keeles koos väliste teekidega.
Põhifunktsioonid:
- Saadaval olevad pakkujad:
- cpc (CPU Performance Counter) — teabe saamine jõudluse kohta.
- dtrace — BEGIN, END ja ERROR töötlejad, mis käivitatakse enne või pärast muid teste, samuti vigade esinemisel.
- fbt (Function Boundary Tracing) — jälgimine kernelifunktsioonide kutsumiste kohta.
- lockstat — lukustuste oleku jälgimine.
- pid — kasutajaruumi protsessides funktsioonide kutsumiste jälgimine.
- proc — protsesside tegevuse jälgimine, näiteks käivitamine ja sulgemine (fork, exec, exit, fault).
- profile — jõudluse statistika salvestamine kindlate ajavahemike järel.
- sdt, rawtp — staatiline kernelijälgimine (SDT — Statically Defined Tracing).
- usdt: staatiline rakenduste jälgimine (USDT — Userspace Statically Defined Tracing).
- sched — CPU ressursside jaotuse jälgimine.
- sycall — süsteemikõnetesse sisenemise ja nendest väljumise jälgimine.
- Kogutud andmete kogumine: võimalus rakendada agregaatfunktsioone (avg, count, llquantize, lquantize, max, min, quantize, stddev ja sum) ning agregaattoiminguid (clear, normalize, printa). Tulemuste salvestamise tugi rakendatud agregaatfunktsioonide tavapärastesse ja assotsiatiivsetesse massiividesse.
- Spetsulaarse jälgimise tugi, mis võimaldab kiiresti jälgida andmeid, otsustades, millised tuleb salvestada jälgimispuule ja millised tuleb kõrvaldata. Saadaval on funktsioonid: speculation, speculate, commit ja discard.
- Globaalsete ja kohalike muutujate, TLS (Thread-Local Storage), assotsiatiivsete massiivide ja stringide tugi.
- Sisseehitatud muutujate pakkumine: 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.
- Tegevuste tugi: exit, freopen, ftruncate, mod, printa, printf, raise, setopt, stack, sym, system, trace, tracemem, uaddr, umod, ustack ja usym.
- Sisseehitatud funktsioonide olemasolu: 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.
- Andmete loendurite olemasolu, mis ei satu jälgimispuudesse.
- Tugi jälgimisskripti koostamiseks D keeles BPF-programmidena.
- BPF-funktsioonide eelkompileerimine raamatukogu kutsumiste jaoks.
- bpflog valik BPF-programmide laadimise logimise saamiseks.
- Dünaamiline koodi genereerimine ja eelkompileeritud koodi korduvkasutatavus BPF-programmides.
Uue versiooni muudatused:
- Pakkuja pid, mida kasutatakse protsesside jälgimiseks kasutajaruumis, on lisatud toega instruktsioonide täitmise jälgimiseks nende offsetite põhjal koodis.
- Toetatakse stack() ja ustack() funktsioonide kasutamist kogutud andmete agregaatimiseks.
- Võimalus eemaldada assotsiatiivsetest massiividest elemente mis tahes tüüpidest, määrates neile väärtuseks 0.
- Lisatud print tegevus struktureeritud andmete tippimise ja tüüpide annotatsiooniga.
- Uute sisseehitatud funktsioonide cleanpath(), d_path() ja link_ntop() lisamine.
- Lisatud parameeter „-xcpu”, mis võimaldab siduda kontrollid kindlate CPU-dega.
- Lisatud parameeter „-xlockmem” mälu suuruse piiramiseks.
- Tagatud võimalus salvestada protsesside jälgimise andmeid (USDT) dtprobed taaskäivituste vahel.
- Toetatud BTF (BPF Type Format) mehhanism, mis pakub teavet tüüpide kontrollimiseks BPF pseudokoodis.
- Võimalus kasutada configure skripti kokkupanekuks.
Allikas: opennet.ru
