Your SlideShare is downloading. ×
0
Вениамин Гвоздиков: Особенности использования DTrace
Вениамин Гвоздиков: Особенности использования DTrace
Вениамин Гвоздиков: Особенности использования DTrace
Вениамин Гвоздиков: Особенности использования DTrace
Вениамин Гвоздиков: Особенности использования DTrace
Вениамин Гвоздиков: Особенности использования DTrace
Вениамин Гвоздиков: Особенности использования DTrace
Вениамин Гвоздиков: Особенности использования DTrace
Вениамин Гвоздиков: Особенности использования DTrace
Вениамин Гвоздиков: Особенности использования DTrace
Вениамин Гвоздиков: Особенности использования DTrace
Вениамин Гвоздиков: Особенности использования DTrace
Вениамин Гвоздиков: Особенности использования DTrace
Вениамин Гвоздиков: Особенности использования DTrace
Вениамин Гвоздиков: Особенности использования DTrace
Вениамин Гвоздиков: Особенности использования DTrace
Вениамин Гвоздиков: Особенности использования DTrace
Вениамин Гвоздиков: Особенности использования DTrace
Вениамин Гвоздиков: Особенности использования DTrace
Вениамин Гвоздиков: Особенности использования DTrace
Вениамин Гвоздиков: Особенности использования DTrace
Вениамин Гвоздиков: Особенности использования DTrace
Вениамин Гвоздиков: Особенности использования DTrace
Вениамин Гвоздиков: Особенности использования DTrace
Вениамин Гвоздиков: Особенности использования DTrace
Вениамин Гвоздиков: Особенности использования DTrace
Вениамин Гвоздиков: Особенности использования DTrace
Вениамин Гвоздиков: Особенности использования DTrace
Вениамин Гвоздиков: Особенности использования DTrace
Вениамин Гвоздиков: Особенности использования DTrace
Вениамин Гвоздиков: Особенности использования DTrace
Вениамин Гвоздиков: Особенности использования DTrace
Вениамин Гвоздиков: Особенности использования DTrace
Вениамин Гвоздиков: Особенности использования DTrace
Вениамин Гвоздиков: Особенности использования DTrace
Вениамин Гвоздиков: Особенности использования DTrace
Вениамин Гвоздиков: Особенности использования DTrace
Вениамин Гвоздиков: Особенности использования DTrace
Вениамин Гвоздиков: Особенности использования DTrace
Вениамин Гвоздиков: Особенности использования DTrace
Вениамин Гвоздиков: Особенности использования DTrace
Вениамин Гвоздиков: Особенности использования DTrace
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Вениамин Гвоздиков: Особенности использования DTrace

1,490

Published on

Вначале рассмотрим возможности DTrace для трассировки приложений в реальном времени. Затем перейдём на особенности его использования на разных ОС и их ограничения. В конце будут приведены задания с …

Вначале рассмотрим возможности DTrace для трассировки приложений в реальном времени. Затем перейдём на особенности его использования на разных ОС и их ограничения. В конце будут приведены задания с динамически создаваемыми пробами для прикладной разработки на LUA в Tarantool.

Published in: Technology, Business
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,490
On Slideshare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
14
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. DTrace integration and quick start ruBSD Dec 2013 Veniamin Gvozdikov vg@FreeBSD.org
  • 2. What is DTrace? • Dynamic tracing framework • Works on Solaris/FreeBSD/OSX/QNX/Linux !2
  • 3. Who uses it? • Apple’s Xcode Instruments • Cloud Analytics in Joyent SmartDataCenter • Oracle’s ZFS Storage Appliance analytics • Brendan’s Flame Graphs • Command line DTraceToolkit !3
  • 4. Xcode Instruments !4
  • 5. Cloud Analytics !5
  • 6. Oracle’s ZFS-SA analytics !6
  • 7. Flame Graphs !7
  • 8. DTraceToolkit !8
  • 9. Terminology • probe • provider • module !9
  • 10. How it works? dtrace (1) libproc libdtrace user space /dev/dtrace DTrace !10 kernel space
  • 11. Providers dtrace: tcp: fbt: dtmalloc: io: lockstat: syscall: profile: kernel space !11 and others:
  • 12. dtrace(1) • Command line frontend • Shows available probes/providers • Enable probes and attach to processes • D Language compiler • Works via libdtrace and libproc • ETC… !12
  • 13. Available probes To see all probes on the system you need to run: # dtrace -l [ … many lines … ] To see probes by dtrace provider: # dtrace -l -n 'dtrace:::' ID PROVIDER MODULE 1 dtrace 2 dtrace 3 dtrace !13 FUNCTION NAME BEGIN END ERROR
  • 14. D program structure D language is like C and AWK: provider:module:function:probe / predicates / { action; } !14
  • 15. First D program # dtrace -q -n ' > syscall::open:entry { > printf("%st%sn", execname, copyinstr(arg0)); >} > profile:::tick-1s { > exit(0); >} >' ! tmux /dev/null sh /etc/libmap.conf sh /var/run/ld-elf.so.hints sh /lib/libedit.so.7 sh /lib/libncurses.so.8 sh /lib/libc.so.7 !15
  • 16. Built-in Variables (not all) args pid probeprov errno probefunc timestamp execname probemod vtimestamp !16
  • 17. Aggregating Functions Function Name Arguments count none sum scalar expression avg scalar expression min scalar expression max scalar expression lquantize scalar expression, lower bound, upper bound, step value quantize scalar expression !17
  • 18. Tracing applications • Trace with pid provider • Trace with USDT (Userland Statically Defined Traces) !18
  • 19. DTrace integration examples Please clone repo (seeing code is required for next slides): http://clck.ru/8wWyv !19
  • 20. int length_fast(char *); int length_slow(char *); int main(void) { int counter = 0; int c_loop = 0; char *Lines[] = { "x", "tt", "Test", NULL }; char *line; printf("%10s %4sn", "STRING", "LEN"); while (15 > c_loop) { while (NULL != Lines[counter]) { line = Lines[counter]; printf("%10s: %02dn", line, length_fast(line)); printf("%10s: %02dn", line, length_slow(line)); ++counter; } ++c_loop; counter = 0; sleep(c_loop); } ! return 0; } !20
  • 21. #00 pid provider 00_script.sh pid$target::length_*:entry { self->ts = timestamp; printf("String: %sn", copyinstr(arg0)); } !21
  • 22. pid$target::length_*:return /self->ts/ { @num[probefunc] = count(); @sum[probefunc] = sum(timestamp - self->ts); @q[probefunc] = quantize(timestamp - self->ts); ! self->ts = 0; } ! profile:::tick-10sec { exit(0); } !22
  • 23. END { printf("Count of call functions:n"); printa(@num); printf("Time of call functions:n"); printa(@sum); printf("Distribution of times by functions:n"); printa(@q); } !23
  • 24. Distribution of times by functions: result Count of call functions: ! length_fast length_slow ! Time of call functions: ! length_fast length_slow ! length_fast value ------------- Distribution ------------- count 2048 | 0 4096 |@@@@@@@@@@@@@@@@@@@@ 3 8192 |@@@@@@@ 1 16384 | 0 32768 | 0 65536 | 0 131072 |@@@@@@@@@@@@@ 2 262144 | 0 6 6 ! 434394 500954 length_slow value ------------- Distribution ------------- count 4096 | 0 8192 |@@@@@@@ 1 16384 |@@@@@@@ 1 32768 |@@@@@@@@@@@@@ 2 65536 | 0 131072 |@@@@@@@@@@@@@ 2 262144 | 0 !24
  • 25. #01 First USDT provider dtrace_demo.d: provider demo { probe start(); probe stop(); }; Generate header file: # dtrace -h -s dtrace_demo.d !25
  • 26. #01 Adding probes while (1) { if (DEMO_START_ENABLED()) DEMO_START(); while (NULL != Lines[counter]) { [ … lines … ] } counter = 0; sleep(1); if (DEMO_STOP_ENABLED()) DEMO_STOP(); } !26
  • 27. Compile applications Make object file: # clang -c main.c -DENABLE_DTRACE ! Run dtrace(1) on object file: # dtrace -G -s dtrace_demo.d main.o ! Link objects to application: # clang -lelf main.o dtrace_demo.o -o demo !27
  • 28. #01 Trace application 01_script.sh result #!/usr/sbin/dtrace -Zs # scripts/01_script.sh time: 1006057576 time: 1008003117 time: 1007984334 time: 1008002385 time: 1034989225 time: 1007995235 time: 1008000837 time: 1007991571 time: 1007992224 time: 1007998339 ! #pragma D option quiet ! demo*:::start { self->ts = timestamp; } ! demo*:::stop { printf("time: %dn", timestamp - self->ts); self->ts = 0; } !28
  • 29. #02 Probes with arguments dtrace_demo.d: provider demo { probe start(char *); probe stop(int); }; Generate header file: # dtrace -h -s dtrace_demo.d !29
  • 30. #02 Adding probes int length_fast(char *string) { int i; ! ! } int length_slow(char *string) { int i; if (DEMO_START_ENABLED()) if (DEMO_START_ENABLED()) DEMO_START(string); DEMO_START(string); ! for (i = 0; '0' != *string; ++i) { for (i = 0; '0' != *string; ++i) { ++string; ++string; usleep(i*i); } } if (DEMO_STOP_ENABLED()) if (DEMO_STOP_ENABLED()) DEMO_STOP(i); DEMO_STOP(i); return i; return i; } !30
  • 31. #!/usr/sbin/dtrace -Zs ! #pragma D option quiet ! BEGIN { self->start = timestamp; self->ts = 0; printf("Start tracing....nn"); } ! ! demo*:::stop /self->ts/ { printf("len: %2d time: %6d n", arg0, timestamp - self->ts); @[arg0] = quantize((timestamp - self->ts) / 1000); self->ts = 0; } ! END demo*:::start { { printf("Time %d.%d secn", self->ts = timestamp; (timestamp - self->start)/1000/1000/1000, printf("String: %10s ", copyinstr(arg0)); (timestamp - self->start)/1000/1000/100); } } !31
  • 32. result # scripts/02_script.sh Start tracing.... ! String: tt len: 2 time: 24425 String: Test len: 4 time: 5131 String: Test len: 4 time: 39085 String: x len: 1 time: 12314 String: x len: 1 time: 11881 String: tt len: 2 time: 4949 String: x len: 1 time: 11692 String: x len: 1 time: 8848 String: tt len: 2 time: 4430 String: tt len: 2 time: 24967 String: Test len: 4 time: 4561 String: Test len: 4 time: 37770 ^C Time 12.126 sec ! [ … skipped distributions …] !32
  • 33. #03 Evolution interface dtrace_demo.d: typedef struct { int dummy; } dline_t; typedef struct { int dummy; } demo_t; ! provider demo { probe start(); probe stop(dline_t *dp) : (demo_t *dp); }; ! #pragma D attributes Evolving/Evolving/ISA #pragma D attributes Private/Private/Unknown #pragma D attributes Private/Private/Unknown #pragma D attributes Private/Private/ISA #pragma D attributes Evolving/Evolving/ISA !33 provider demo provider provider demo module provider demo function provider demo name provider demo args
  • 34. #03 Fill structure demo_provider.h: typedef struct { const char *mystr; int len; } dline_t; int length_fast(char *string) { dline_t data; int i; if (DEMO_START_ENABLED()) { data.mystr = string; DEMO_START(); } [ … some action … ] if (DEMO_STOP_ENABLED()) { data.len = i; DEMO_STOP(&data); } return i; } !34
  • 35. #03 First DTrace library demo.d: typedef struct { char *mystr; int len; } dline_t; ! typedef struct { string str; int len; } demo_t; copy demo.d to /usr/lib/dtrace! or run:! # dtrace -L /path/to/dtrace/libs some args ! #pragma D binding "1.7" translator translator demo_t < dline_t *p > { str = copyinstr(*(uintptr_t *)copyin((uintptr_t)&p->mystr, sizeof (char*))); len = *(uint64_t *)copyin((uintptr_t)&p->len, sizeof (p->len)); }; !35
  • 36. #03 Access to structure 03_script.sh: demo*:::stop /self->ts/ { printf("String: %10s len: %2d time: %6dn", args[0]->str, args[0]->len, timestamp - self->ts); @[args[0]->str] = quantize((timestamp - self->ts) / 1000); self->ts = 0; } !36
  • 37. result # scripts/03_script.sh Start tracing.... ! String: x len: 1 time: 5178 String: x len: 1 time: 3485 String: tt len: 2 time: 1415 String: tt len: 2 time: 334482 String: Test len: 4 time: 1673 String: Test len: 4 time: 899032 ^C Time 2.20 sec [ … skipped distributions … ] !37
  • 38. libusdt • Creates DTrace probes at runtime • Bindings to Lua/Ruby/node.js/Perl !38
  • 39. libusdt and tarantool Please clone repo recursively from dtrace branch: http://clck.ru/8wX24 See README.DTrace for more details !39
  • 40. lua usdt init.lua: provider = usdt.provider("init_script", "tarantool_box") probe = provider:probe("dt_hello", "entry", "char *", "int") provider:enable() ! function dt_hello(mystr) probe:fire(mystr, string.len(mystr)) end !40
  • 41. Example # dtrace -l -n 'init_script*:::' ID PROVIDER MODULE 249651 init_script18132 tarantool_box FUNCTION NAME dt_hello entry localhost> for _, val in ipairs({"Test", "tt", "xxx"}) do dt_hello(val) end --... # dtrace -q -n 'init_script*:::entry { printf("String %10s len: %02dn", copyinstr(arg0), arg1) } tick-2s {exit(0);}' String Test len: 04 String tt len: 02 String xxx len: 03 !41
  • 42. References • http://dtrace.org/ • http://wiki.FreeBSD.org/ • http://www.dtracebook.com • http://docs.oracle.com/cd/E18752_01/html/819-5488/docinfo.html • http://www.youtube.com/watch?v=i47XhPsAVTQ • http://dev.mysql.com/doc/refman/5.6/en/dba-dtrace-server.html • http://www.joyent.com/developers/resources/cloud-analytics-in-joyent-smartdatacenter • http://www.brendangregg.com/dtracetoolkit.html • https://github.com/brendangregg/dtrace-cloud-tools • https://github.com/brendangregg/FlameGraph • https://github.com/davepacheco/mod_usdt • https://github.com/chrisa/libusdt • https://github.com/chrisa/lua-usdt

×