Компания Oracle ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π»Π° DTrace для Linux 2.0.0-1.14

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ выпуск инструмСнтария динамичСской ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ DTrace для Linux 2.0.0-1.14, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π² Π²ΠΈΠ΄Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅Π³ΠΎ Π² пространствС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ процСсса, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅Π³ΠΎ подсистСму eBPF ΠΈ ΡˆΡ‚Π°Ρ‚Π½Ρ‹Π΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ трассировки, прСдоставляСмых ядром Linux. По Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ рСализация DTrace Π½Π° Π±Π°Π·Π΅ eBPF Π±Π»ΠΈΠ·ΠΊΠ° ΠΊ ΠΏΠ΅Ρ€Π²ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ DTrace для Linux, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½ΠΎΠΉ Π² Ρ„ΠΎΡ€ΠΌΠ΅ модуля ядра. Код ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° распространяСтся ΠΏΠΎΠ΄ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠ΅ΠΉ GPLv2.

Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ со ΡˆΡ‚Π°Ρ‚Π½Ρ‹ΠΌΠΈ ядрами Linux, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌΠΈ BPF. Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ трСбуСтся Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° libctf с Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° CTF (Compact Type Format), которая Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² состав ΠΏΠ°ΠΊΠ΅Ρ‚Π° binutils, начиная с выпуска 2.40, ΠΈΠ»ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° libdtrace-ctf, портированная ΠΈΠ· Solaris. ΠžΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ прСдлагаСтся Π΄Π²Π° ΠΏΠ°Ρ‚Ρ‡Π° ΠΊ ядру 6.7, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΡ… Π·Π°Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹Π΅ возмоТности для получСния Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΎ модулях ΠΈ ядрС.

ВСхнология DTrace Π±Ρ‹Π»Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π° для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ динамичСской трассировкС ядра ΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмС Solaris. DTrace Π΄Π°Ρ‘Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ систСмы ΠΈ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ диагностику ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. Π’ процСссС ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ DTrace Π½Π΅ влияСт Π½Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ исслСдуСмых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ отраТаСтся Π½Π° ΠΈΡ… ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Ρ‡Ρ‚ΠΎ позволяСт ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Π½Π°Π»ΠΈΠ· Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΡ… систСм Π½Π° Π»Π΅Ρ‚Ρƒ. Из ΡΠΈΠ»ΡŒΠ½Ρ‹Ρ… сторон DTrace отмСчаСтся высокоуровнСвый язык D, ΠΏΠΎΡ…ΠΎΠΆΠΈΠΉ Π½Π° AWK, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΡ‰Π΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ сцСнарии трассировки, Ρ‡Π΅ΠΌ ΠΏΡ€ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΡ‹Ρ… для eBPF срСдств написания ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Π½Π° языках C, Python ΠΈ Lua с внСшними Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ возмоТности:

  • ДоступныС ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Ρ‹:
    • cpc (CPU Performacne Counter) — ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.
    • dtrace — ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ BEGIN, END ΠΈ ERROR, запускаСмыС ΠΏΠ΅Ρ€Π΅Π΄ ΠΈΠ»ΠΈ послС Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ошибок.
    • fbt (Function Boundary Tracing) — отслСТиваниС ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΉ ΠΊ функциям ядра.
    • lockstat — отслСТиваниС состояния Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ.
    • pid — отслСТиваниС ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΉ ΠΊ функциям Π² процСссах, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΡ… Π² пространствС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.
    • proc — отслСТиваниС активности, связанной с процСссами, Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠ°ΠΊ запуск ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ (fork, exec, exit, fault).
    • profile — сохранСниС статистики ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Ρ‡Π΅Ρ€Π΅Π· ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.
    • sdt, rawtp — статичСская трассировка ядра (SDT — Statically Defined Tracing).
    • usdt: статичСская трассировка ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ (USDT — Userspace Statically Defined Tracing)
    • sched — отслСТиваниС распрСдСлСния рСсурсов CPU.
    • sycall — отслСТиваниС Π²Ρ…ΠΎΠ΄Π° Π² систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· Π½ΠΈΡ….
  • АгрСгированиС собираСмых Π΄Π°Π½Π½Ρ‹Ρ…: Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ примСнСния Π°Π³Ρ€Π΅Π³Π°Ρ‚Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ (avg, count, llquantize, lquantize, max, min, quantize, stddev ΠΈ sum) ΠΈ Π°Π³Ρ€Π΅Π³Π°Ρ‚Π½Ρ‹Ρ… дСйствий (clear, normalize, normalize, printa). ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° сохранСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² примСнСния Π°Π³Ρ€Π΅Π³Π°Ρ‚Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ΠΈ ассоциативных массивах.
  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° спСкулятивной трассировки, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅ΠΉ эфСмСрно ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅, Ρ€Π΅ΡˆΠ°Ρ ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠ· Π½ΠΈΡ… слСдуСт Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² Π±ΡƒΡ„Π΅Ρ€Π΅ трассировки, Π° ΠΊΠ°ΠΊΠΈΠ΅ ΠΎΡ‚Π±Ρ€Π°ΡΡ‹Π²Π°Ρ‚ΡŒ. Доступны Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: speculation, speculate, commit ΠΈ discard.
  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΈ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, TLS (Thread-Local Storage), ассоциативных массивов ΠΈ строк.
  • ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ встроСнных ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…: 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.
  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° дСйствий: exit, freopen, ftruncate, mod, printa, printf, raise, setopt, stack, sym, system, trace, tracemem, uaddr, umod, ustack ΠΈ usym.
  • НаличиС встроСнных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ: 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.
  • НаличиС счётчиков Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΡ… Π² Π±ΡƒΡ„Π΅Ρ€Ρ‹ трассировки.
  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° компиляции сцСнариСв трассировки Π½Π° языкС D Π² Ρ„ΠΎΡ€ΠΌΡƒ BPF-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ.
  • ΠŸΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ BPF для Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Ρ… Π²Ρ‹Π·ΠΎΠ²ΠΎΠ².
  • ΠžΠΏΡ†ΠΈΡ bpflog для получСния Π»ΠΎΠ³Π° Π²Π΅Ρ€ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΡ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ BPF.
  • ДинамичСская гСнСрация ΠΊΠΎΠ΄Π° ΠΈ прСдкомпиляция ΠΊΠΎΠ΄Π° для ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ использования Π² BPF-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ….

ИзмСнСния Π² Π½ΠΎΠ²ΠΎΠΉ вСрсии:

  • Π’ ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€ pid, примСняСмый для отслСТивания процСссов Π² пространствС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° отслСТивания выполнСния инструкций ΠΏΠΎ ΠΈΡ… ΡΠΌΠ΅Ρ‰Π΅Π½ΠΈΡŽ Π² ΠΊΠΎΠ΄Π΅.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° использования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ stack() ΠΈ ustack() для агрСгирования собираСмых Π΄Π°Π½Π½Ρ‹Ρ….
  • Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ удалСния ΠΈΠ· ассоциативных массивов элСмСнтов Π»ΡŽΠ±Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Ρ‡Π΅Ρ€Π΅Π· присвоСниС Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π° 0.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ дСйствиС print для Π²Ρ‹Π²ΠΎΠ΄Π° структурированных Π΄Π°Π½Π½Ρ‹Ρ… с аннотациями Ρ‚ΠΈΠΏΠΎΠ².
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π½ΠΎΠ²Ρ‹Π΅ встроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ cleanpath(), d_path() ΠΈ link_ntop().
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ «-xcpu», ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠ²ΡΠ·Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΌ CPU.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ «-xlockmem» для ограничСния Ρ€Π°Π·ΠΌΠ΅Ρ€Π° памяти.
  • ΠžΠ±Π΅ΡΠΏΠ΅Ρ‡Π΅Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ сохранСния Π΄Π°Π½Π½Ρ‹Ρ… трассировки процСссов (USDT) ΠΌΠ΅ΠΆΠ΄Ρƒ пСрСзапусками dtprobed.
  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° BTF (BPF Type Format), ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΈΠΏΠΎΠ² Π² псСвдокодС BPF.
  • Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования скрипта configure для сборки.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru