Observing and Optimizing your Application with DTraceassets.en.oreilly.com/1/event/45/Observing and...

262
Observing and Optimizing your Application with DTrace Angelo Rajadurai Principal Software Engineer Oracle

Transcript of Observing and Optimizing your Application with DTraceassets.en.oreilly.com/1/event/45/Observing and...

Observing and Optimizing your Application with DTrace

Angelo Rajadurai Principal Software EngineerOracle

2

Learn how to use DTrace for observing applications. We will cover a wide range of applications in this lab.

You will have opportunity to look at AMP stack, scripting languages and some Web 2.0 technologies

How we will work?

We will spend the first hour and a half in presentations

The presentation covers ✦ Basics of DTrace✦ Demo of D-scripts✦ DTrace Design Patters - developing D-scripts✦ DTrace for performance tuning

You will have two hours work on the labs. Labs will be available on AWS

Let me know if you need access Feel free to ask for help

3

4

DTrace lab sitehttp://dtracehol.com/

5

Slides are available ashttp://dtracehol.com/OSCON-DTrace.pdf

6

Google Group for Labhttp://groups.google.com/group/dtracehol

Why Dynamic Tracing

7

8

Native Apps

ruby

C C++

Database MySQL/Oracle/Postgres

Operating System Solaris/Linux/OS X/Windows

Container Glassfish/J2EE

Frameworks

Today’s application

PresentationJSP/Javascript/Ajax/JavaFX

python

php

perl

shell

Apps run in VM

Traditional Tools

• Development Debugging tools - Tightly bound to programing language, Framework or Application

• System Tools (vmstat mpstat iostat) - Get system wide view but no ability to drill down to workload

• truss pstack - not great for going beyond single process views

• mdb(1) - Typically used as postmortem rather than live analysis

9

The Blame Game

10

Devel

oper:

“I’d as

k the

datab

ase ad

min” Database Admin:

“May be the middleware guys

will know”

Sysadmin

“I don’t know! Ask the

Developer” Middlew

are Ex

pert:

“Lets

ask th

e Sysa

dmin”

Static Instrumentation

11

Instrument Validate

Run in production

Collect infoProcess

Add Code Compile

Custom Instruments

Stop App Restart w/ flags

Prebuilt Instruments

Debugging Transient Problems In production!

12

Please let me observe a live system.

Dynamic Tracing

13

Native

cc+ph

perl pyth

oru

b

shelDatabase

Operating System Solaris/Linux/OS X/

Container Glassfish/

Frameworks

Application Logic

PresentationJSP/Javascript/Ajax

12::SELECT id, name, symbol, conversion_rate FROM currencies WHEREstatus = 'Active' and deleted = 012::SELECT category, name, value FROM config12::SELECT id FROM outbound_email WHERE type = 'system'

• Turn ON and OFF dynamically• Probe any arbitrary location

• not just pre-defined probe points• Ability to collect arbitrary data • Overhead of probing is small• No Overhead for disabled probes

So what is Dynamic Tracing?

14

Answer!

15

DTrace

16

The D - Language

Basicsof

Dynamic Instrumentation

17

/ /predicate when

{

}

actions do what

D - Scripts

: : :provider module probe name whereprobe

18

DTrace command line

# dtrace -n probe’/predicate/{action}’

19

demo

20

Aggregation

=> mmap mmap 5 <= mmap mmap 5 => munmap munmap 5 <= munmap munmap 5 => setcontext setcontext 5 <= setcontext setcontext 5 => getrlimit getrlimit 5 <= getrlimit getrlimit 5 => getpid getpid

5 <= getpid getpid 5 => setcontext setcontext 5 <= setcontext setcontext 5 => sysi86 sysi86 5 <= sysi86 sysi86 5 => brk brk 5 <= brk brk 5 => brk brk 5 <= brk brk 5 => xstat xstat

5 <= xstat xstat 5 => resolvepath resolvepath 5 <= resolvepath resolvepath 5 => open open 5 <= open open 5 => mmap mmap 5 <= mmap mmap 5 => mmap mmap 5 <= mmap mmap 5 => mmap mmap 5 <= mmap mmap 5 => mmap mmap 5 <= mmap mmap 5 => munmap munmap 5 <= munmap munmap

5 => memcntl memcntl 5 <= memcntl memcntl 5 => close close 5 <= close close 5 => xstat xstat 5 <= xstat xstat 5 => resolvepath resolvepath 5 <= resolvepath resolvepath 5 => open open 5 <= open open

5 => mmap mmap 5 <= mmap mmap 5 => mmap mmap 5 <= mmap mmap 5 => mmap mmap 5 <= mmap mmap 5 => mmap mmap 5 <= mmap mmap 5 => mmap mmap 5 <= mmap mmap

5 => munmap munmap 5 <= munmap munmap 5 => memcntl memcntl 5 <= memcntl memcntl 5 => close close 5 <= close close 5 => munmap munmap 5 <= munmap munmap 5 => ioctl ioctl 5 <= ioctl ioctl 5 => ioctl ioctl 5 <= ioctl ioctl 5 => brk brk 5 <= brk brk 5 => brk brk 5 <= brk brk 5 => fsat fsat 5 <= fsat fsat 5 => fcntl fcntl 5 <= fcntl fcntl

5 => fstat64 fstat64 5 <= fstat64 fstat64 5 => getdents64 getdents64 5 <= getdents64 getdents64 5 => getdents64 getdents64 5 <= getdents64 getdents64 5 => close close 5 <= close close 5 => ioctl ioctl 5 <= ioctl ioctl

5 => fstat64 fstat64 5 <= fstat64 fstat64 5 => write write 5 <= write write 5 => close close 5 <= close close 5 => close close 5 <= close close 5 => rexit rexit

rexit 1 fcntl 2 fsat 2 getpid 2 getrlimit 2 sysi86 2 write 2 fstat64 4 getdents64 4 memcntl 4 open 4 resolvepath 4 setcontext 4

xstat 4 ioctl 6

brk 8 munmap 8 close 10 mmap 20

dtrace -P syscall

dtrace -P syscall’{@[probefunc]=count()}’

21

Demo

Other Providers

22

DTrace providers

javaperlruby

javascript mysqlpostgres

cpciptcpudp

plockstatnfsv3

nfsv4

kerberose

sh

iSCSI

USDT

FC

DTracecore provider

DTracecore

IOsyscall

profilesysinfo

vminfo

PID

mib

fbtproc

lockstat

python

DTrace for your Day Job

23

• Pre-built D-scripts• D-Script Design Patters

• Framework for developing D-scripts

• Excellent collection of D-script• DTraceToolKit• Docs/Examples - this directory has examples for each script.

• DTrace and IDE integration• Project D-Light

• DTrace visualization• Chime & DTrace Java API

D-Script Collections

24

• Simplify D-script development• DTrace design Patterns

• The event trace pattern• The count pattern• What’s in between pattern• Time spent pattern• Profile Pattern• Call flow pattern

DTrace Design Patterns

25

• Good for rare events• Samples

dtrace -n swapin’{trace(execname)}’

syscall::read:entry/strstr(fds[arg0].fi_pathname,$$1)!=0/{

printf(“%s read from %s\n”,execname, $$1);}

Event Trace Pattern

26

• Good for collecting summary of events• Samples

dtrace -n on-cpu’{@[execname]=count()}’

syscall:::entry/execname==$$1/{

@[probefunc]=count();}

Count Pattern

27

• Good for drilling down into details

pid$1::$$2:entry{

self->traceme=1;}

pid$1:::method-entry/self->traceme/{

@[probefunc]=count();}

pid$1::$$2:return{

self->traceme=0;}

What’s In Between?

28

• Find time spent in functions

syscall:::entry{

self->ts=timestamp;}

syscall:::return/self->ts/{

@[probefunc]=sum(timestamp-self->ts);self->ts=0;

}

Time Spent Pattern

29

• An inexpensive way to find offending method

• See hotuser & hotkernel scripts in DTraceToolkit

dtrace -n profile-101’/arg1/{@[ufunc(arg1),caller]=count()}’

Profile Pattern

30

• DTrace a great tool for perf tuning• Ability to observe as problem happens• Correlate various layers• Ability to drill down to root cause

DTrace Performance Tuning

31

• Probe effect• DTrace safe for production• This does not mean no effect on performance

• DTrace is not pixie dust• It can answer questions but

• Does not know what Questions to ask• Does not interpret the answer

Gotcha’s

32

• Before you start using DTrace• Make sure you know and agree on the problem statement

• “System is Slow” is not a problem statement• Find out what is “known” - but verify• Is problem reproducible?• Can you split problem into CPU, IO & Network?• Are application instrumentation available?• Are other non-dtrace tools more appropriate?

Approaching Performance

33

Solaris Tool chest

34

Proc tools

cputrack - per-processor hw counters pargs – process arguments pflags – process flags pcred – process credentialspldd – process's library dependencies plockstat – process lock statistics psig – process signal disposition pstack – process stack dumppmap – process memory map pfiles – open files and names prstat – process statistics ptree – process treeptime – process microstate times pwdx – process working directorypgrep – grep for processes pkill – kill processes list pstop – stop processes prun – start processes prctl – view/set process resources pwait – wait for processpreap – reap a zombie process

Tracing & Debugging

abitrace - trace ABI interfaces mdb – debug process/kernel

truss – trace function and system calls

System Statistics

acctcom – process accounting busstat – Bus hardware counters

cpustat – CPU hardware counters iostat – IO & NFS statistics

kstat – display kernel statistics mpstat – processor statistics

netstat – network statistics nfsstat – nfs server stats

sar – kitchen sink utility vmstat – virtual memory stats

Toolkits

DTraceToolkit – DTrace Tools K9Toolkit – perl perf tools

nicstat – network stats

• Start with vmstat, mpstat, iostat, etc.• Drill down with DTrace

• Each of the columns has DTrace probe equiv.• Use “Count Design Pattern” to get summary

System Wide Issues

35

mpstat - dtrace drill down

36

• minf (Minor faults) dtrace -n as_fault’{@[execname]=count()}’

• majf (Major faults)dtrace -n maj_fault’{@[execname]=count()}’

• xcal (Cross calls)dtrace -n xcalls’{@[execname]=count()}’

• intr and ithr (Interrupts)#!/usr/sbin/dtrace -qsinterrupt-start{ this->name=stringof(`devnamesp[((struct dev_info *)arg0)->devi_major].dn_name); @[this->name]=count();}or look at DTraceToolkit inttimes

mpstat - dtrace drill down (con’t…)

37

• csw (Context switches) dtrace -n pswitch’{@[execname]=count()}’

• icsw (Involuntary context switch)dtrace -n inv_swtch’{@[execname]=count()}’

• smtx (Spin on mutexes)dtrace -n adative-spin,adaptive-block’{@[execname]=count()}’

• migr (Thread migration)#!/usr/sbin/dtrace -qsoff-cpu{ self->cpu=cpu; }

on-cpu{ @[execname,self->cpu,cpu]=count(); self->cpu=0; }

mpstat - dtrace drill down (con’t…)

38

• usr/sys/wt/idle (CPU utilization) #!/usr/sbin/dtrace -qson-cpu{ self->ts=timestamp; }

off-cpu/self->ts/{ @[execname]=sum(timestamp - self->ts); self->ts=0; }

vmstat - dtrace drill down

39

• re (Page reclaim) dtrace -n page_reclaim’{@[execname]=count()}’

• epi (Executable pages paged in)dtrace -n execpgin’{@[execname]=count()}’

• api (Anonymous pages paged in)dtrace -n anonpgin’{@[execname]=count()}’

• apo (Anonymous pages paged out)dtrace -n anonpgout’{@[execname]=count()}’

• fpi (Filesystem pages paged in)dtrace -n fspgin’{@[execname]=count()}’

• fpo (Filesystem pages paged out)dtrace -n fspgout’{@[execname]=count()}’

iostat - dtrace drill down

40

• Look at the IO provider!• io:::start & io:::done - Sync IO• io:::wait-start & io:::wait-done - ASync IO

• DTraceToolkit also has some nice scripts• iosnoop - snoop I/O events as they occur• iotop - display top disk I/O events by process• iofileb.d - I/O bytes by file and process• iofile.d - I/O wait time by file and process• iopattern - print disk I/O pattern• iopending - graph number of pending disk events

• DTrace can give some excellent insight into processes• pid provider

• Get into the heart of the process• Just don’t go overboard (pid:::entry - is normally a bad idea)

• profile provider• easy low cost way to get good information!

Process Level Observation

41

• Finding hot user function is easydtrace -n profile-1001’/arg/{@[ufunc(arg1)=count()}’

• So is hot user librariesdtrace -n profile-1001’/arg/{@[umod(arg1)=count()}’

• You can even find hot callersdtrace -n profile-1001’/arg/{@[ufunc(arg1),ufunc(ucaller)=count()}’

• What is the hottest non-idle loop, kernel func?dtrace -n profile-1001'/arg0 && curthread->t_pri!=-1/{@[func(arg0)]=count()}'

• So is hot kernel moduledtrace -n profile-1001'/arg0 && curthread->t_pri!=-1/{@[mod(arg0)]=count()}'

Hot Functions & Hot Libs

42

• Counting methods is easy (may have big probe effect)dtrace -n pid$1:libc::entry’{@[probefunc]=count()}’

• Time spent in methods#!/usr/sbin/dtrace -qspid$1:libc::entry{ self->ts[probefunc]=timestamp;}pid$1:libc::return/self->ts[probefunc]/{ @[probefunc]=sum(timestamp - self->ts[probefunc]); self->ts[probefunc]=0;}

Method Count / Time Spent

43

#!/usr/sbin/dtrace -qs

#pragma D option strsize=204800pid$1::$$2:entry

{ self->ts=timestamp;

self->cf=strjoin("->", probefunc); self->ats[probefunc]=timestamp;

}pid$1:::entry

/self->ts && probefunc!=$$2/{ self->cf=strjoin(self->cf,strjoin("\n->",probefunc));

self->ats[probefunc]=timestamp;}

pid$1:::return/self->ts && probefunc!=$$2/

{ self->cf=strjoin(self->cf,strjoin("\n<-",probefunc));

@ac[probefunc]=count(); @at[probefunc]=sum(timestamp - self->ats[probefunc]);

self->ats[probefunc]=0;

}

Much More Complicated Call flow tracking

44

pid$1:::return

/self->ts && probefunc==$$2/{

self->cf=strjoin(strjoin(self->cf,"\n<-"), probefunc); @t[self->cf]=sum(timestamp - self->ts);

@i[self->cf]=min(timestamp - self->ts);

@a[self->cf]=max(timestamp - self->ts); @v[self->cf]=avg(timestamp - self->ts);

@c[self->cf]=count(); self->cf=0;

self->ts=0;

@ac[probefunc]=count(); @at[probefunc]=sum(timestamp - self->ats[probefunc]);

self->ats[probefunc]=0;}

END

{ printa("%s\n Total Time: %@d :: Fastest: %@d :: Slowest: %@d :: Average: %@d :: Count: %@d\n\n\n",@t, @i, @a, @v, @c);

printf("\n\nSUMMARY of all methods called from %s\n",$$1); printf("%-7s %-15s %s\n","COUNT", "TOTAL","CLASS.METHOD" );

printa("%@-7d %@-15d %s\n",@ac, @at);

}

45

DTrace Hands-on-lab

46

Quick Walk-through

The lab will be run on a instance on Amazon EC2. Each one of you will have your own instance If you have not logged in, please log in with the details

on your one pager. Goto http://dtracehol.com/ This will have the instructions for the lab All necessary software and lab files are already

installed on each instance.

47

Secure Global Desktop

Secure Global Desktop allows you to experience OpenSolaris

DOIP - Display Over IP Simple Web based interface

48

Bandwidth consideration

If we find that we are running out of network bandwidth then we will use just use ssh!

ssh -X will login and set the X Display for you. If you have X11 on your desktop then ssh -X may be a

way to reduce bandwidth Except for one or two lab exercises almost all can be

done with ssh

49

Demo

Lets see Secure Global Desktop & ssh

50

Lab Format

We have 5 tracks for this lab. You can pick one or more1.DTrace basics2.DTrace and JDK 7.03.DTrace for scripting languages4.DTrace for system admins5.DTrace advanced topics

Solutions to exercises are in /export/home/dhol/solutions

All the docs are in http://dtracehol.com/ Lab docs are also available as

/export/home/dhol/dtracelab.pdf

51

Lab track explanation

Lab Introduction

52

Exercise - Overview

Each lab exercise is self contained. Exercise 1 – 3 : DTrace introduction Exercise 4 : DTrace Design Patterns Exercise 5 – 6 : DTrace for Java 7.0 & 6.0 Exercise 7 – 10 : DTrace for the AMP stack Exercise 11-12 : DTrace and Python/Ruby Exercise 13 : DTrace toolkit Exercise 14 : DTrace visualization Exercise 15-16 : DTrace C & Java API Exercise 17 : JDK 7.0 JSDT probes

53

Exercise – 5 TracksI. DTrace fundamental Concepts

1. DTrace introduction and command line2. D-Script syntax and examples3. DTrace aggregates4. DTrace Design Patterns

II. DTrace in Java 6.0 & 7.0 – Hotspot provider4. DTrace Design Patterns5. Introduction to hotspot provider & GC probes6. Hotspot – classloading, threads and methods14.JSDT Embedding DTrace probes in Java applications.

III. DTrace for scripting languages and Web 2.04. DTrace Design Patterns7. DTrace and PHP8. DTrace and Javascript9. DTrace and MySQL10.DTrace and AMP stack11.DTrace and Python12.DTrace and Ruby

54

Exercise – 5 Tracks

IV. DTrace for System Administrators4. DTrace Design Patterns13.DTraceToolkit14.Visualizing DTrace data - Chime

V. Advanced topics15.libdtrace C API for DTrace16.Java API for DTrace17.JSDT Embedding DTrace probes in Java applications.

55

What you need to know to use the next 200 slides?

Introduction to reference slides

56

Reference Slides

For your reference we have a few extra slides. These are material about the various use of DTrace.

Here is how the slides are organized Slide 63 - D-Language fundamentals Slide 71 - Aggregates Slide 78 - Variables in DTrace Slide 83 - DTrace providers Slide 86 - DTrace visualization - Chime Slide 91 - DTrace toolkit

57

Reference Slides

slide 113 - Performance scenarios slide 128 - DTrace & C slide 136 - DTrace and distructive actions slide 145 - DTrace and C++ slide 149 - DTrace and Java slide 151 - DTrace and Java 6.0 & 7.0 slide 167 - DTrace and Java 1.4.2 & 1.5 slide 175 - DTrace and scripting languages slide 177 - DTrace and PHP slide 185 - DTrace and Javascript slide 189 – DTrace and Python slide 193 – DTrace and Ruby

58

Reference Slides

slide 198 - DTrace and Databases slide 200 - DTrace and Postgres slide 211 - DTrace and MySQL slide 216 - DTrace and Oracleslide

slide 221 - Make your own DTrace provider slide 227 - DTrace Providers examples slide 246 - DTrace Data structures slide 249 - Postmortem tracing slide 252 - Speculative tracing slide 255 - DTrace configuration slide 259 - DTrace more resources.

59

Enjoy the Lab

60

Q & A

Observing and Optimizing your Application with DTrace

Angelo Rajadurai

[email protected]

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 62

Reference Slides

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 63

D- LanguageD-Language - Quick overview

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 64

D Language - Format.probe description/ predicate /{ action statements}

When a probe fires then action is executed if predicate evaluates true. Example, “Print the pid and current working directory when bash forks”

#!/usr/sbin/dtrace -qssysinfo:::fork/execname==”bash”/{ printf("bash(%d) forked. Current working directory %s\n",pid,cwd);}

sysfork.d

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 65

Probe Probes are points of instrumentation Probes are made available by providers Probes identify the module and function that

they instruments Each probe has a name These four attributes define a tuple that uniquely

identifies each probeprovider:module:function:name Examplefbt:unix:mutex_init:entryvminfo:genunix:swapin:pgswapin

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 66

Listing Probes. Probes can be listed with the “-l” option to dtrace(1M)

in a specific function with “-f function” in a specific module with “-m module” with a specific name with “-n name” from a specific provider with “-P provider”

Empty components match all possible probes. Wild card can be used in naming probe.

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 67

Providers Providers represent a methodology for instrumenting

the system Providers make probes available to the DTrace

framework DTrace informs providers when a probe is to be

enabled Providers transfer control to DTrace when an enabled

probe is fired Examplessyscall provider provides probes in every system callfbt provider provides probe into every function in the kernel

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 68

Predicates A predicate is a D expression Actions will only be executed if the predicate

expression evaluates to true A predicate takes the form “/expression/” and is

placed between the probe description and the action

ExamplesPrint the pid of every process that is started by uid 0proc:::exec-success/uid == 0/{ printf("New process %s(%d) started\n",execname, pid);}

pred.d

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 69

Actions Actions are executed when a probe fires Actions are completely programmable Most actions record some specified state in the

system Some actions change the state of the system system

in a well-defined manner These are called destructive actions and are

disabled by default. Probes may provide parameters than can be used in

the actions.

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 70

Data types & Operators D Language provides standard data types.

Integer types(32 bit size, 64-bit size) char(1,1), short(2,2),int(4,4), long(4,8),long long(8,8)

Float types(32-bit size, 64-bit size) float(4,4), double(8,8),long double(16,16)

Integer float and string constants are present in D. add(+), sub(-), mul(*), div(/), mod(%) math operators less than (<), less than or equal(<=) etc. defined logical AND(&&), OR(||) & XOR(^^) bitwise operations and standard assignment ops present.

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 71

AggregationPerformance enhancer – huge time

saver!

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 72

Aggregation Think of a case when you are want to know the “total” time the

system spends in a function. We can save the amount of time spent by the function every time

it is called and then add the total. If the function was called 1000 times that is 1000 bits of info

stored in the buffer just for us to finally add to get the total. Instead if we just keep a running total then it is just one piece of

info that is stored in the buffer. We can use the same concept when we want averages, count,

min or max. Aggregation is a D construct for this purpose.

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 73

Aggregation - Format @name[keys] = aggfunc(args); '@' - key to show that name is an aggregation. keys – comma separated list of D expressions. aggfunc could be one of...

sum(expr) – total value of specified expression count()- number of times called. avg(expr) – average of expression min(expr)/max(expr) – min and max of expressions quantize()/lquantize() - power of two & linear distribution

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 74

Aggregation Example 1.#!/usr/bin/dtrace -ssysinfo:::pswitch{ @[execname] = count();}

aggr.d

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 75

Aggregation Example 2.#!/usr/sbin/dtrace -spid$target:libc:malloc:entry{ @["Malloc Distribution"]=quantize(arg0);}

$ aggr2.d -c whodtrace: script './aggr2.d' matched 1 probe...dtrace: pid 6906 has exited

Malloc Distribution value ------------- Distribution ------------- ----------------------count 1 | 0 2 |@@@@@@@@@@@@@@@@@ 3 4 | 0 8 |@@@@@@ 1 16 |@@@@@@ 1 32 | ` 0 64 | 0 128 | 0 256 | 0 512 | 0 1024 | 0 2048 | 0 4096 | 0 8192 |@@@@@@@@@@@ 2 16384 | 0

aggr2.d

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 76

More about aggregations printa(@name) – print aggregation “name”

printa also takes a format string. normalize() - normalize aggregation over time. (ie. average).

data is not lost just a view created denormalize() - opposite of normalize

remove the normalized view clear(@name) – clear and allow DTrace to reclaim aggregation mem. trunc(@name, num) - truncate value and key after top num entries.

A negative num will truncate after bottom num entries. Typically we are only interested in the top /bottom functions.

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 77

Aggregation example#!/usr/sbin/dtrace -ssyscall::mmap:entry{ @a["number of mmaps"] = count(); @b["average size of mmaps"] = avg(arg1); @c["size distribution"] = quantize(arg1);}

profile:::tick-10sec{ printa(@a); printa(@b); printa(@c);

clear(@a); clear(@b); clear(@b);}

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 78

VariablesCalling all MT programmers!

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 79

Calculating time spentOne of the most common request is to find time spent in a given function.

Here is how this can be done – buggy code. See next slide for better version

#!/usr/sbin/dtrace -ssyscall::open*:entry,syscall::close*:entry{ ts=timestamp;}

syscall::open*:return,syscall::close*:return{ timespent = timestamp - ts; printf("ThreadID %d spent %d nsecs in %s", tid, timespent, probefunc); ts=0; /*allow DTrace to reclaim the storage */ timespent = 0;}

timespent.d

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 80

Thread Local Variableself->variable = expression; self – keyword to indicate that the variable is thread local A boon for observers of multi-threaded apps.. As name indicates this is specific to the thread. See code re-written#!/usr/sbin/dtrace -ssyscall::open*:entry,syscall::close*:entry{ self->ts=timestamp;}

syscall::open*:return,syscall::close*:return{ timespent = timestamp - self->ts; printf("ThreadID %d spent %d nsecs in %s", tid, timespent, probefunc); self->ts=0; /*allow DTrace to reclaim the storage */ timespent = 0;}

self.d

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 81

Built-in Variable Here are a few built-in variables.arg0 ... arg9 – Arguments represented in int64_t formatargs[ ] - Arguments represented in correct type based on

function.cpu – current cpu id.cwd – current working directoryerrno – error code from last system callgid, uid – real group id, user idpid, ppid, tid – process id, parent proc id & thread id probeprov, probemod, probefunc, probename - probe info.

timestamp, walltimestamp, vtimestamp – time stamp nano sec from an arbitary point and nano sec from epoc.

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 82

External Variable DTrace provides access to kernel & external variables. To access value of external variable use `#!/usr/sbin/dtrace -qsdtrace:::BEGIN{ printf("physmem is %d\n", `physmem); printf("maxusers is %d\n", `maxusers); printf("ufs:freebehind is %d\n", ufs`freebehind); exit(0);}

Note: ufs`freebehind indicates kernel variable freebehind in the ufs module.

These variables cannot be lvalue. They cannot be modified from within a D Script

ext.d

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 83

DTrace providersWhat does Solaris provide for you!

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 84

Providers Here is the list of providers

dtrace Provider – provider probes related to DTrace itself lockstat Provider – lock contention probes profile Provider – probe for firing at fixed intervals fbt Provider – function boundary tracing provider syscall Provider – probes at entry/return of every syscall sdt Provider – “statically defined probes” user definable probe sysinfo Provider – probe kernel stats for mpstat and sysinfo tools vminfo Provider – probe for vm kernel stats proc Provider – process/LWP creation and termination probes sched Provider – probes for CPU scheduling

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 85

Providers - cont. We will now see some more details on a few Solaris Providers

io Provider – provider probes related to disk IO mib Provider – insight into network layer. fpuinfo Provider – probe into kernel software FP processing pid Provider – probe into any function or instruction in user code. plockstat Provider – probes user level sync and lock code fasttrap Provider – non-exposed probe. Fires when DTrace

probes are called.

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 86

DTrace VisualizationA sweet “chime”

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 87

Java API for DTrace As you may have seen the output from DTace is always text. If you are into GUI and graphs there is Java DTrace API and Chime. Chime – is a graphical tool to visualize DTrace output.

The tool currently works only in Nevada Bld 35+ Will be available in Update 4. You can visualize output from any D-script.

Java DTrace API is java binding for DTrace Available in Nevada and Solaris 10 Update 4

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 88

Chime Get it fromhttp://opensolaris.org/os/project/dtrace-chime/install/ Chime visualization is controlled by “display” Displays are xml files that contains the D-scripts and the configuration

for the display. A wizard is also provided for creating new “Displays” This is a great tool for demo. Speaking of demo's here is one.

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 89

jdtrace – Java version of dtrace command Get it fromhttp://opensolaris.org/os/project/dtrace-chime/java_dtrace_api/jdtrace/ This is a great example of the Java DTrace API. Source provided. Needs Chime installed as well as Nevada 50 and later. Usage is similar to dtrace just add a j. Example# jdtrace -n syscall:::entry'{@[probefunc]=count()}'

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 90

DTrace - Real life. We learnt about DTrace and how to develop D-scripts Knowing to instrument is not the same as knowing where to

instrument. Next we will see how to use DTrace in real life. First we will see about the DTrace toolkit.

Over a hundred useful D-scripts Become an expert in minutes.

Performance scenarios A few real life scenarios and how to use Dtrace to address it.

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 91

DTrace ToolkitHow to become and instant hero!

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 92

DTrace Toolkit The DTraceToolkit is a collection of useful

Documented scripts developed by the OpenSolaris DTrace community

Available under www.opensolaris.org Ready to use D scripts The toolkit contains:

the scripts the man pages the example documentation the notes files

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 93

DTrace Toolkit Get it fromhttp://www.opensolaris.org/os/community/dtrace/dtracetoolkit Download

gunzip & tar xvf ./install A nice guide comes with the script See the Docs/Contents for more details. Set PATH to include /opt/DTT

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 94

DTrace Toolkit Bin/ Symlinks to the scripts

Apps/ Application specific scripts

Cpu/ Scripts for CPU analysis

Disk/ Scripts for disk I/O analysis

Docs/ Documentation

Contents Command list for the Toolkit

Examples/ Examples of command usage

Faq Frequently asked questions

Links Further DTrace links

Notes/ Notes on Toolkit commands

Readme Readme for using the docs

Extra/ Misc scripts

Guide This file!

Kernel/ Scripts for kernel analysis

License The CDDL license

Locks/ Scripts for lock analysis

Man/ Man pages

man1m/ Man pages for the Toolkit commands

Mem/ Scripts for memory analysis

Net/ Scripts for network analysis

Proc/ Scripts for process analysis

System/ Scripts for system analysis

User/ Scripts for user based activity analysis

Zones/ Scripts for analysis by zone

Version DTraceToolkit version

install Install script, use for installs only

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 95

DTrace Toolkit Categories

Apps - scripts for certain applications: Apache, NFS Cpu - scripts for measuring CPU activity Disk - scripts to analyse I/O activity Extra - other categories Kernel - scripts to monitor kernel activity Locks - scripts to analyse locks Mem - scripts to analyse memory and virtual memory Net - scripts to analyse activity of the network iinterfaces, and the

TCP/IP stack Proc - scripts to analyse activity of a process System - scripts to measure system wide activity User - scripts to monitor activity by UID Zones - scripts to monitor activity by zone

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 96

DTrace Toolkit

Apps Used to measure and report certain metrics from applications like:

Apache Web server, NFS client, UNIX shell httpdstat.d: computes real-time Apache web statistics: the number of

connections, GET, POST, HEAD and TRACE requests nfswizard.d: used to measure the NFS client activity regarding

response time and file accesses shellsnoop: captures keystrokes, used to debug and catch command

output. Use with caution ! weblatency.d: counts connection speed delays, DNS lookups, proxy

delays, and web server response time. Uses by default Mozilla browser

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 97

DTrace Toolkit CPU

Reports and list the CPU activity like: cross calls, interrupt activity by device, time spent servicing interrupts, CPU saturation

cputypes.d: lists the information about CPUs: the number of physical install CPUs, clock

loads.d: prints the load average, similar to uptime intbycpu.d: prints the number of interrupts by CPU intoncpu.d: lists the interrupt activity by device;

example: the time consumed by the ethernet driver, or the audio device

inttimes.d: reports the time spent servicing the interrupt

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 98

DTrace Toolkit CPU

xcallsbypid.d: list the inter-processor cross-calls by process id. The inter-process cross calls is an indicator how much work a CPU sends to another CPU

dispqlen.d : dispatcher queue length by CPU, measures the CPU saturation

cpuwalk.d : identify if a process is running on multiple CPUs concurrently or not

runocc.d : prints the dispatcher run queue, a good way to measure CPU saturation

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 99

DTrace Toolkit Disk

Analyses I/O activity using the io provider from DTrace: disk I/O patterns, disk I/O activity by process, the seek size of an I/O operation

iotop: a top like utility which lists disk I/O events by processes

iosnoop: a disk I/O trace event application. The utility will report UID, PID, filename regarding for a I/O operation

bitesize.d: analyze disk I/O size by process seeksize.d: analyzes the disk I/O seek size by

identifying what sort I/O operation the process is making: sequential or random

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 100

DTrace Toolkit Disk

iofile.d: prints the total I/O wait times. Used to debug applications which are waiting for a disk file or resource

iopattern: computes the percentage of events that were of a random or sequential nature. Used easily to identify the type of an I/O operation and the average, totals numbers

iopending: prints a plot for the number of pending disk I/O events. This utility tries to identify the "serialness" or "parallelness" of the disk behavior

diskhits: prints the load average, similar to uptime iofileb.d: prints a summary of requested disk activity by

pathname, providing totals of the I/O events in byte

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 101

DTrace Toolkit FS

Analyses the activity on the file system level: write cache miss, read file I/O statistics, system calls read/write

vopstat: traces the vnode activity rfsio.d: provides statistics on the number of reads:

the bytes read from file systems (logical reads) and the number of bytes read from physical disk

fspaging.d: used to examine the behavior of each I/O layer, from the syscall interface to what the disk is doing

rfileio.d: similar with rfsio.d but reports by file

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 102

DTrace Toolkit Kernel

Analyses kernel activity: DNLC statistics, CPU time consumed by kernel, the threads scheduling class and priority

dnlcstat: inspector of the Directory Name Lookup Cache (DNLC)

cputimes: print CPU time consumed by the kernel, processes or idle

cpudist: print CPU time distributions by kernel, processes or idle cswstat.d: prints the context switch count and average

modcalls.d: an aggregation for kernel function calls by module

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 103

DTrace Toolkit Kernel

dnlcps.d: prints DNLC statistics by process dnlcsnoop.d: snoops DNLC activity kstat_types.d: traces kstat reads pridist.d: outputs the process priority distribution.

Plots which process is on the CPUs, and under what priority it is

priclass.d: outputs the priority distribution by scheduling class. Plots a distribution

whatexec.d: determines the types of files which are executed by inspected the first four bytes of the executed file

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 104

DTrace Toolkit Lock

Analyses lock activity using lockstat provider lockbydist.d: lock distribution by process name lockbyproc.d: lock time by process name

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 105

DTrace Toolkit Memory

This category analyses memory and virtual memory things: virtual memory statistics, page management, minor faults

vmstat.d: a vmstat like utility written in D vmstat-p.d: a vmstat like utility written in D which

does display what “vmstat -p” does: reporting the paging information

xvmstat: a much improved version of vmstat which does count the following numbers: free RAM, virtual memory free, major faults, minor faults, scan rate

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 106

DTrace Toolkit Memory

swapinfo.d: prints virtual memory info, listing all memory consumers related with virtual memory including the swap physical devices

pgpginbypid.d: prints information about pages paged in by process id

minfbypid.d: detects the biggest memory consumer using minor faults, an indication of memory consumption

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 107

DTrace Toolkit Network

These scripts analyse the activity of the network interfaces and the TCP/IP stack. Some scripts are using the mib provider. Used to monitor incoming

icmpstat.d: reports ICMP statistics per second, based on mib tcpstat.d: prints TCP statistics every second, retrieved from

the mib provider: TCP bytes received and sent, TCP bytes retransmitted

udpstat.d: prints UDP statistics every second, retrieved from the mib provider

tcpsnoop.d: analyses TCP network packets and prints the responsible PID and UID. Useful to detect which processes are causing TCP traffic.

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 108

DTrace Toolkit Network

connections: prints the inbound TCP connections. This displays the PID and command name of the processes accepting connections

tcptop: display top TCP network packets by process. It can help identify which processes are causing TCP traffic

tcpwdist.d: measures the size of writes from applications to the TCP level. It can help identify which process is creating network traffic

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 109

DTrace Toolkit Process

Analyses process activity: system calls/process, bytes written or read by process, files opened by process,

sampleproc: inspect how much CPU the application is using threaded.d: see how well a multithreaded application uses its

threads writebytes.d: how many bytes are written by process readbytes.d: how many bytes are read by process kill.d: a kill inspector. What how signals are send to what

applications newproc.d: snoop new processes as they are executed.

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 110

DTrace Toolkit Process

syscallbyproc.d & syscallbypid.d: system calls by process or by PID

filebyproc.d: files opened by process fddist: a file descriptor reporter, used to print distributions for

read and write events by file descriptor, by process. Used to determine which file descriptor a process is doing the most I/O with

pathopens.d: prints a count of the number of times files have been successfully opened

rwbypid.d: reports the no. of read/writes calls by PID rwbytype.d: identifies the vnode type of read/write activity -

whether that is for regular files, sockets, character special devices

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 111

DTrace Toolkit Process

sigdist.d: prints the number of signals received by process and the signal number

topsysproc: a report utility listing top number of system calls by process

pfilestat: prints I/O statistics for each file descriptor within a process. Very useful for debug certain processes

stacksize.d: measures the stack size for running threads crash.d: reports about crashed applications. Useful to identify

the last seconds of a crashed application shortlived.d: snoops the short life activity of some processes

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 112

DTrace Toolkit System

Used to measure system wide activity uname-a.d: simulates 'uname -a' in D syscallbysysc.d: reports a total on the number od system

calls on the system sar-c.d: reports system calls usage similar to 'sar -c' topsyscall: prints a report of the top system calls on the

system

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 113

DTrace Performance ScenariosDTrace for those with a day job!

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 114

DTrace for every day use. We now move on how to apply DTrace for your day job. We look at some broad guide lines and then talk about some more

detailed scenarios. The goal of this section is to provide you with some ideas on how

to use DTrace. I have heavily borrowed from Benoit Chaffanjon's presentation for

this section – Thanks.

An Ounce of Data is worth more than many pounds of opinions.

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 115

Supplement not Replace One of the first thing to understand is that DTrace supplements

the Solaris tools and does not indent to replace it. Continue to use tools like

truss gives you very quick access to syscalls for a given process with some level of aggregation. But watch out for overhead.

vmstat mpstat iostat almost all real life scenarios will start with using these tools. They are the pillars of performance tuning. Use them to get overview and then use dtrace to dig down deep.

/proc tools – extremely useful to get quick overview of processes.

trapstat cpustat sputrack intrstat – Harware statistics.

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 116

Scenarios We will look at the following scenarios

1. High user time 2. High system time3. Multi-threaded applications4. High cross calls5. Network traffic6. Disk usage

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 117

1. High User Time How do you find that you have high user time

Use mpstat vmstat or iostat If the “User” column is very high then you can use this scenario.

Look at prstat to see if there is one app or a set of apps that are on the top.

If it is then you can use the following to see what that app is doing# dtrace -n profile-1001'/pid==1234/{@[ustack(1)]=count()}'

# dtrace -n profile-1001/execname==”app”/'{@[ustack(1)]=count()}' If not then try to see if there is a pattern

# dtrace -n profile-1001/arg1/'{@[ustack(1)]=count()}'arg1 – pc if the CPU is running user land code.

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 118

1. High User Time If the output looks like libm.so.2`exp+0x4 94libm.so.2`exp+0x54 99libm.so.2`exp+0x64 111libm.so.2`exp+0x98 116multi`intio_calc_n_month_rate+0x8f 117multi`intio_calc_n_month_rate+0x186 138libm.so.2`exp+0x10d 163libm.so.2`exp+0x90 184libm.so.2`exp+0x61 617libm.so.2`log+0x1a 854

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 119

1. High User Time Looks like you are in a lot of libm apps (exp, log)

Make sure you are using the best of these functions Look at possibly inlining. Also you may want to look at the application logic to see if this

can be mitigated. You can also use the following script to see details of each call.

Beware it has significant probe effect.#!/usr/sbin/dtrace -FSpid$1:::entry, pid$1:::return{trace(timestamp);}Or use the dapptrace DTraceToolkit

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 120

1. High User Time Other things to watch for

Calls to .mul(), .dev() etc on SPARCApp may have been compiled for v7 – recompile

Excessive getenv(), getrusage() getrlimit()Look at application logic to see

Excessive time(), gettimeofday()Replace with gethrtime()

Watch for excessive memmoveUse memcpy() if regions do not overlap

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 121

1. High User Time Looks for where mem* apps are coming fromdtrace -n pid1234::mem*:entry'{@[probemod,probefunc]=count()}'

This will print the function and lib name. Look for significant FPU usage.

kstat -n fpu_traps Consider AMD If high FPU usage on T2000s then beware

Use cooltst to see if the workload fits CMT. If you do not see one or one class of applications showing up in

the top then look at execsnoop from the toolkit to see if there are a bunch of jobs being started.

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 122

2. High System Time / Calls High system Calls

Look at the vmstat under the Sys Faults Use the following script to get a quick idea who is causing it.# dtrace -n syscall:::entry'{@[execname]=count()}' If you want to look at more details use# dtrace -n syscall:::entry'{@[execname,probefunc]=count()}' Use the argN for more details of particular system call. Example to find what file is being read()/write()/send()/recv() etc# dtrace -n syscall:::read:entry'{ printf("%s(%d) read file %s\n",

execname, pid, fds[arg0].fi_pathname) }' Look at topsysproc from the toolkit.

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 123

2. High System Time / Calls How to recognize high system time Look at vmstat under sys time How to use DTrace Following scripts will tell you what execname(pid) is using kernel # dtrace -n profile-1001'/arg0/{@[execname,pid]=count()}' If you want to dig deeper and look at where in the kernel you are# dtrace -n profile-1001'/arg0/{@[stack(1)]=count()}' If you suspect locking use lockstat to drill down

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 124

3. Multi-threaded apps Tools like truss are not enough to analyze threaded apps. Start with prstat -mL 1

Look at the Lck section to see if there is high amount of locking

If so use ploctstat (a dtrace consumer) to better understand. Pay close attention to locks taken by malloc.

libc malloc does not scale use libmtmalloc (LD_PRE_LOAD) If there is a huge use of mutex_locks for small segments of code

just to increment a value replace with atomic ops see atomic_ops(3c)

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 125

4. High Cross Calls How to recognize high cross calls

Use mpstat and see xcalls section You can use xcals probe to find who is making these calls. Look at xcallsbypid.d in the toolkit Look at the ustack() when making xcalls.

Some usual culprits are segmap – consider Direct IO Also look for unneeded munmap/mmaps

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 126

5. Network traffic The network status utility netstat displays a status of all network

connections on a system. With the current tools there is no easy way to find out and co-relate a network connection with a process or the owner of it

Extra tools like lsof can list what connections were made and by who What about incoming connections ?

Solve the problem by using: tcptop, tcpsnoop and connections utilities from DTT

tcpsnoop – similar to snoop but just for tcp and light weight tcptop – finally a top for tcp traffic connections – watch the connections being made in the

system

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 127

6. Disk I/O Disk utilisation can be monitored using iostat but to co-relate the

utilisation with a process is a hard mission There are tools to check CPU usage by process but there are no

tools to check disk I/O by process The old good friend: iostat -xnmp I/O type: reading iostat data a

SysAdmin can not describe if the I/O is sequential or random It is important to know what type of I/O there is: sequential or

random How can you list what processes are generating I/O, or list disk

events or how much a process is using the disk (size of the disk event or the service time of the disk events) ?

Easily use the following DTT scripts: iotop, iosnoop from DTT root directory. Look at bitsize.d, seeksize.d iopattern

Try dtrace -n io:::start'{printf(“%s(%d) \n”, execname, pid, args[0]->b_count)}'

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 128

DTrace for C AppsFor thos who debate K&R or ANCII

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 129

The pid Provider The pid Provider is extremely flexible and allowing you to

instrument any instruction in user land including entry and exit. pid provider creates probes on the fly when they are needed. This

is why they do not appear in the dtrace -l listing We will see how to use the pid provider to trace Function BoundariesAny arbitrary instruction in a given function

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 130

pid – Function Boundary probes The probe is constructed using the following formatpid<processid>:<library or executable>:<function>:<entry or return> Examples:pid1234:date:main:entrypid1122:libc:open:return Following code counts all libc calls made by a program#!/usr/sbin/dtrace -s

pid$target:libc::entry

{

@[probefunc]=count()

}pid1.d

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 131

pid – Function Offset probes The probe is constructed using the following formatpid<processid>:<library or executable>:<function>:<offset> Examples:pid1234:date:main:16pid1122:libc:open:4 Following code prints all instructions executed in the programs main#!/usr/sbin/dtrace -s

pid$target:a.out:main:

{

}

offs.d

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 132

DTrace User Process DTrace provides a lot of features to probe into the user

process We will look at routines that are specific to user code

tracing. Some examples of using DTrace in user code will be

discussed We will talk about “modifying” user process state

A real neat example is discussed This could be used in fault injection

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 133

Action & Subroutines There are a few actions and subroutines that are useful for user land

dtrace. ustack(<int nframes>, <int strsize>) - records user process stack.

nframes – specifies the number of frames to recordstrsize – if this is specified and non 0 then the address to nametranslation is done when the stack is recorded into a buffer of strsize. This will avoid problem with address to nametranslation in user land when the process may have exited

For java code analysis you'd need Java 1.5 to use this ustack() functionality (see example)

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 134

copyin & copyinstr DTrace executes in the kernel context As user process run in the user address space you'd need some

special handling to get the data from the user address space to the kernel address space.

The copyin & copystr subroutines help you do this data copying.copyin(addr,len) – Copy 'len' bytes of data from addr in user land to

kernel space and return address.copyinstr(addr) – Copy string from addr in userland to kernel and return a

string.

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 135

copyin & copyinstr example.!/usr/sbin/dtrace -s

syscall::write:entry/pid == $target/{ printf("Write %s\n",copyinstr(arg1)); /*elegant way*/}

Signature of write system callssize_t write(int fd, const void *buf, size_t nbytes);

$ ./cpy.d -c datedtrace: script './cpy.d' matched 1 probeFri Jan 28 13:40:51 PST 2005dtrace: pid 4342 has exitedCPU ID FUNCTION:NAME 0 13 write:entry Write Fri Jan 28 13:40:51 PST 2005

cpy.d

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 136

DTrace - Destructive actionsHow to use DTrace for more than

just observation

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 137

Destructive actions We saw that DTrace is safe to use on a live system because there are

checks to make sure it does not modify what it observes. There are some cases where you want to change the state of the

system. Example

stop a process to better analyze it. kill a runaway process run a process using system

These actions are disabled by default. Use '-w' option to enable it. We will see some of these destructive actions.

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 138

Destructive actions stop() - stop the process that fired the probe. Use prun to make the

process continue. Use gcore to capture a core of the process. raise(int signal) – Send signal to the process that fired the probe. copyout(void *buf, uintptr_t addr, size_t nbytes) – copy nbytes from

address pointed by buf to addr in the current proc's user address space.

copyoutstr(string str, uintptr_t addr, size_t maxlen) – copy string (null terminated) from str to addr in the current proc's user address space. Max length is maxlen.

system(string program) – Similar to system call in C. Run the program. system also allows you to use printf formats in the string.

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 139

Porting Solaris to PPC – DTrace style#!/usr/sbin/dtrace -Cs#include<sys/systeminfo.h>

#pragma D option destructive

syscall::uname:entry{ self->addr = arg0;}

syscall::uname:return{ copyoutstr("SunOS", self->addr, 257); copyoutstr("PowerPC", self->addr+257, 257); copyoutstr("5.10", self->addr+(257*2), 257); copyoutstr("Generic", self->addr+(257*3), 257); copyoutstr("PPC", self->addr+(257*4), 257);}

port.d

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 140

Porting Solaris to PPC – Dtrace stylesyscall::systeminfo:entry/arg0==SI_ARCHITECTURE/{ self->arch = arg1;}

syscall::systeminfo:return/self->arch/{ copyoutstr("PowerPC", self->arch,257); self->arch=0;}

syscall::systeminfo:entry/arg0==SI_PLATFORM/{ self->mach = arg1;}

syscall::systeminfo:return/self->mach/{ copyoutstr("APPL,PowerBook-G4", self->mach,257); self->mach=0;}

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 141

Containers – DTrace style#!/usr/sbin/dtrace -Cs#include<sys/systeminfo.h>

#pragma D option destructive

syscall::uname:entry/ppid == $1/{ self->addr = arg0;}

syscall::uname:return/ppid == $1/{ copyoutstr("SunOS", self->addr, 257); copyoutstr("PowerPC", self->addr+257, 257); copyoutstr("5.10", self->addr+(257*2), 257); copyoutstr("Generic", self->addr+(257*3), 257); copyoutstr("PPC", self->addr+(257*4), 257);}

contain.d

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 142

Containers – Dtrace stylesyscall::systeminfo:entry/arg0==SI_ARCHITECTURE/{ self->arch = arg1;}

syscall::systeminfo:return/self->arch && ppid == $1/{ copyoutstr("PowerPC", self->arch,257); self->arch=0;}

syscall::systeminfo:entry/arg0==SI_PLATFORM && ppid == $1/{ self->mach = arg1;}

syscall::systeminfo:return/self->mach && ppid == $1/{ copyoutstr("APPL,PowerBook-G4", self->mach,257); self->mach=0;}

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 143

Who killed the process?#!/usr/sbin/dtrace -qs

proc:::signal-send/args[1]->pr_fname == $$1/{ printf("%s(pid:%d) is sending signal %d to %s\n", execname, pid, args[2],args[1]->pr_fname);}

$ ./sig1.d bcsched(pid:0) is sending signal 24 to bcsched(pid:0) is sending signal 24 to bcbash(pid:3987) is sending signal 15 to bcbash(pid:3987) is sending signal 15 to bcbash(pid:3987) is sending signal 9 to bc

The above program prints out process that is sending the signal to the program “bc”. Note: $$1 is argument 1 as stringThe signal-send probe has arg1 that has info on signal destinationThe signal-send probe has args2 that has the signal number

sig1.d

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 144

Stop that killer.#!/usr/sbin/dtrace -wqs

proc:::signal-send/args[1]->pr_fname == $$1/{ printf("%s(pid:%d) is sending signal %d to %s\n", execname, pid, args[2],args[1]->pr_fname); stop();}

$ ./sig2.d bcbash(pid:3987) is sending signal 9 to bc

This one is modified to include destructive actions (-w)We do the stop() which stops the sending process. You can then examine the sending process.Note: We are not stoping the signal delivery itself.

sig2.d

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 145

DTrace for C++From Brian Cantrill to Bjarne

Stroustrup!

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 146

C++ Name Mangling The C++ compiler mangles symbols Sun's mangling rules are different from the g++ rules DTrace cannot demangle the symbols as it does not make an

assumption on the compiler. So we need to demangle the symbols for dtrace. Fortunately due to Unix magic this is pretty simpledem `nm execname | cut -d'|' -f 8`(OK its not magic. Just do a nm (print symbol list) of an execname. Cut

only the 8th field and use the result as the input to the demagler. If this sounds complicated – Just do it.)

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 147

We will use a simple example of using DTrace with C++. A star of an example - staroffice8 Looking at live running staroffice app. Find the pid of staroffice. “pgrep -l staroffice” works well. Use onelinerdtrace -n pid`pgrep soffice.bin`:::entry'{ @[probefunc]=count() }' -o

soffice.out Stop script after a few minutes to collect info. Now run the output through c++filt DEMO

C++ & DTrace example

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 148

On my system void*operator new(unsigned) = __1c2n6FI_pv_ Dtrace one liner for dtrace -n pid`pgrep

soffice.bin`::__1c2n6FI_pv_:entry'{ @=quantize(arg0) }' value ------------- Distribution ------------- count

-1 | 0

0 | 7

1 | 54

2 | 0

4 |@@ 9726

8 |@@@@ 20913

16 |@@@@@@@@@@@@@@ 73216

32 |@@@@@@@ 37191

64 |@@@@@@@@ 42712

128 |@@ 10412

256 |@@ 11134

512 | 1636

1024 | 860

2048 |@ 5315

4096 | 6

C++ & DTrace example

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 149

DTrace and JavaWelcome to the Duke era!

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 150

DTrace and Java We already saw how to use ustack() on a java process. We will see how dtrace can shed more light on...

When VM starts and ends When thread starts and ends When class gets loaded and unloaded When object allocated and freed When GC starts and ends When a method is called and method returns

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 151

DTrace for Java 6.0Tracing Java on a Mustang!

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 152

DTrace and Mustang JDK 6.0 (Mustang) has some very interesting embedded DTrace

probes. Mustang provides probes in the following areas. VM lifecycle Thread lifecycle Garbage collection Classloading Method compilation Monitor probes Method entry and exit probes JNI probes

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 153

DTrace and Mustang We will now look into details on some of these areas. For each of these areas we will look at

Probe names Arguments provided Sample scripts

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 154

DTrace and Mustang - args For most of these probes the arguments have the following

format. First argument gives string data The second one gives the size

So to get to the data you'd use the following format str_ptr = (char*) copyin(arg0, arg1+1); str_ptr[arg1] = '\0'; name = (string) self->str_ptr; As the arguments are not null terminated we cannot use copyinstr

() The above code segment add the null termination to the string. In Solaris.next you can use copyinstr(arg0,arg1).

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 155

DTrace and Mustang – VM life cycle probes

Probe namesvm-init-begin – Probe fires when JVM initialization startsvm-init-end – Probe fires when JVM initialization ends and JVM is

ready to run user codevm-shutdown – Probe fires when JVM shuts down.

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 156

DTrace and Mustang – Thread life cycle

Probe namesthread-start – Probe fires when thread startthread-stop – Probe fires when thread completed Argumentsarg0 – String with thread namearg1 – Length of the thread name stringarg2 – Thread idarg3 – Solaris Thread id.arg4 – Boolean. Is the thread a daemon or not.

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 157

DTrace and Mustang – Thread life cycle

Sample code.hotspot$1:::thread-start{ self->ptr = (char *)copyin(arg0,arg1+1); self->ptr[arg1]='\0'; self->tname=stringof(self->ptr);

printf("Thread %s started with Java TID %d Solaris TID %d",self->tname,arg2,arg3);

}Provide pid of Java process as first argument

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 158

DTrace and Mustang – Garbage Collector probes

Probe namesgc-begin – Probe fires when gc startgc-end – Probe fires when gc completedmem-pool-gc-begin – GC for individual pool startsmem-pool-gc-end - GC for individual pool ends Argumentsarg0,arg1 – name and length of memory pool managerarg2,arg3 – name and length of memoryarg4 – initial memory pool size in bytesarg5 – memory in use in the pool.arg6 – number of committed pages arg7 – max size of memory pool

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 159

DTrace and Mustang – Garbage collector probes

hotspot$1:::gc-begin{ printf("GC Started at %Y\n",walltimestamp); self->ts=timestamp;}

hotspot$1:::gc-end/self->ts/{ printf("\t and ran for %d ms\n",(timestamp-self->ts)/1000);}

Provide pid of java process as first argument.

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 160

DTrace and Mustang – Classloading probes

Probe namesclass-loaded – Probe fires when a new class is loadedclass-unloaded – Probe fires when a class is unloaded Argumentsarg0,arg1 – name and length of class that is loadedarg2 – id of the class loaderarg3 – boolean. Is this class a shared class

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 161

DTrace and Mustang – classloader probes

hotspot$1:::class-loaded{ self->ptr = (char *)copyin(arg0,arg1+1); self->ptr[arg1]='\0'; self->cname=stringof(self->ptr);

printf("%s loaded\n",self->cname);}

Provide pid of java process as first argument.

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 162

DTrace and Mustang – method calls Probe namesmethod-entry – Probe fires when a new method is called.method-return – Probe fires when method returns Argumentsarg0 – java threadidarg1,arg2 – name and length of the class of the methodarg3,arg4 – name and length of the method name.arg5, arg6 – method signature string and length Note: For these probes to be available the JVM needs to be

started with -XX:+ExtendedDTraceProbes

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 163

DTrace and Mustang – method callshotspot$1:::method-entry

{ self->str_ptr = (char*) copyin(arg1, args[2]+1); self->str_ptr[args[2]] = '\0'; self->class_name = stringof(self->str_ptr);

self->str_ptr = (char*) copyin(arg3, args[4]+1); self->str_ptr[args[4]] = '\0'; self->method = stringof(self->str_ptr);

@functions[self->class_name,self->method]=count();}

Provide pid of java process as first argument.JVM needs to be started with -XX:+ExtendedDTraceProbes

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 164

DTrace and Mustang – object allocation

Probe namesobject-alloc – Probe fires when a new method is called.method-return – Probe fires when method returns Argumentsarg0 – java thread idarg1,arg2 – name and length of the class of the object allocatedarg3– size of object being allocated

Note: For these probes to be available the JVM needs to be started with -XX:+ExtendedDTraceProbes

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 165

DTrace and Mustang – object allocation

hotspot$1:::object-alloc{ self->ptr = (char *)copyin(arg1,arg2+1); self->ptr[arg2]='\0'; self->cname = stringof(self->ptr);

printf("Object of class %s allocated: Size %d\n",self->cname, arg3);

}Provide pid of java process as first argument.JVM needs to be started with -XX:+ExtendedDTraceProbes

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 166

DTrace and Mustang - The following probes are built into Mustang

When VM starts and ends When thread starts and ends When class gets loaded and unloaded When object allocated and freed When GC starts and ends When a method is called and method returns JNI calls

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 167

DTrace for Java 1.4.2 & 1.5Well moving at Mustang speed is not for all.

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 168

dvm provider Next version of java (6.0 – mustang) will support dtrace. java.net project to add dtrace support in 1.4.2 and 1.5https://solaris10-dtrace-vm-agents.dev.java.net/ Download shared libs

libdvmti.so – java 1.5 libdvmpi.so – java 1.4.2

Add location of libs to LD_LIBRARY_PATH variable Set JAVA_TOOL_OPTIONS to -Xrundvmti:all Name of provider - “dvm”

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 169

dvm provider Some performance considerations Dvm has considerable performance impact even when probes are

not turned on. Setting JAVA_TOOL_OPTIONS to -Xrundvmti:all

Heavy performance impact Use the dynamic option

JAVA_TOOL_OPTIONS=-Xrundvmti:all,dynamic=pipe_name Write one char to pipe to turn probes on and off. Considerable performance improvements (5x)

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 170

dvm provider – GC times To see time taken by GC.#!/usr/sbin/dtrace -sdvm$target:::gc-start{ self->ts = vtimestamp;}dvm$target:::gc-finish{ printf("GC ran for %d nsec\n", vtimestamp - self->ts);}

# ./java_gc.d -p `pgrep -n java`

java_gc.d

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 171

dvm provider - alloc/free To see objects that are allocated and freed.#!/usr/sbin/dtrace -qsdvm$target:::object-alloc{ printf("%s allocated %d size object\n",copyinstr(arg0), arg1);}

dvm$target:::object-free{ printf("%s freed %d size object\n",copyinstr(arg0), arg1);}

# ./java_alloc.d -p `pgrep -n java`

java_alloc.d

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 172

dvm provider - methods To get count of java methods called.#!/usr/sbin/dtrace -s

dvm$target:::method-entry{ @[copyinstr(arg0),copyinstr(arg1)] = count();}

# ./java_method_count.d -p `pgrep -n java`

java_method_count.d

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 173

dvm provider - time-spent To get time-spent on java methods.#!/usr/sbin/dtrace -sdvm$target:::method-entry{ self->ts[copyinstr(arg0),copyinstr(arg1)] = vtimestamp;}

dvm$target:::method-return{ @ts[copyinstr(arg0),copyinstr(arg1)] = sum(vtimestamp - self->ts[copyinstr(arg0),copyinstr(arg1)]);}

# ./java_method.d -p `pgrep -n java`

java_method.d

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 174

dvm provider - probes Here is a list of dvm probes and their signatures

vm-init() vm-death(); thread-start(char *thread_name); thread-end(); class-load(char *class_name); class-unload(char *class_name); gc-start(); gc-finish(); gc-stats(long used_objects, long used_object_space); object-alloc(char *class_name, long size); object-free(char *class_name); method-entry(char *class_name, char *method_name, char *method_signature); method__return(char *class_name, char *method_name, char *method_signature);

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 175

DTrace for scripting languagesDynamic Tracing for Dynamic development

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 176

DTrace and Scripting Language DTrace has been integrated into many scripting languages. We will see

PHP JavaScript Python Ruby

You can get all the tools from the coolstackhttp://cooltools.sunsource.net/coolstack/index.html

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 177

DTrace for PHPD tracing for P Hyper Processor

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 178

DTrace and PHP DTrace provider for PHP is a PECL/PEAR module To get the provider # pear install dtraceor# pecl install dtracethen add“extension=dtrace.so” to the php.ini filethenrestart PHP You can get these all pre-built from coolstack as wellhttp://cooltools.sunsource.net/coolstack/index.html

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 179

DTrace and PHP Couple links for more information Wez Furlong who created the provider has details inhttp://netevil.org/node.php?

uuid=42f82a8b-09b7-5013-1667-2f82a8b24ead Bryan Cantrill has a nice demo script in his blog.http://blogs.sun.com/bmc/entry/dtrace_and_php_demonstrated

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 180

DTrace and PHP There are two probes in the provider.function-returnfunction-entry You can use the 5 args in the action.

arg0 = the function name arg1 = the filename arg2 = the line number arg3 = classname (or an empty string) arg4 = object/class operator (::, ->, or an empty string)

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 181

DTrace and PHP Here is a PHP example.<?php

$numprimes=10000; $pArray[0]=3; $test=5; $num=0;

function doesDevide($x,$y) { return($x % $y); }

function isprime($x)

{

global $pArray; global $num; $index=0; $check=1;

while($check==1 && $index <= $num &&

$x >= ($pArray[$index] * $pArray[$index]) )

{

if( doesDevide($x , $pArray[$index]) == 0) { $check=0; }

else $index++;

}

return($check);

}

prime.php

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 182

DTrace and PHP Here is a PHP example(cont)

while($num<$numprimes)

{

if(isPrime($test)==1){

$num++; $pArray[$num]=$test;

if($num%1000==0){

printf("Progress done ...%d\n",$num);

}

}

$test+=2;

}

?>

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 183

DTrace and PHP Here is a simple D-Script#!/usr/sbin/dtrace -Zqs

php*:::function-entry{ @[copyinstr(arg0)]=count();} Note: -Z will allow probes that have zero match. Run this script in one window while you run the php script in

another window.

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 184

DTrace and PHP Example run ./php.d ^C printf 10 isprime 52378 doesDevide 684216

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 185

DTrace for JavascriptNot just for Java – but for Javascript as well

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 186

DTrace and Javascript DTrace probes have been added to Mozilla to help observe Javascript

application. You can download firefox with probes build in from

http://opensolaris.org/os/project/mozilla-dtrace DTrace toolkit has a set of script that you can use for javascript We will now look at the list of probes and a few examples

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 187

DTrace and Javascript Here are the probes in the javascript provider

function-entry & function return – entry and return of javascript funcs

function-info & function-args – function info and arguments

object-create – object creation

object-create-start & object-create-done – finer info on obj creation

layout-start & layout-end – Start and end of layout

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 188

DTrace and Javascript Here is an example that prints java script function flow.#!/usr/sbin/dtrace -ZFsjavascript*:::js_function-entry{ trace(copyinstr(arg2));}

javascript*:::js_function-return{ trace(copyinstr(arg2));}

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 189

DTrace for PythonHow to snake your way through python code

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 190

DTrace and Python DTrace probes have been added to python With these DTrace probes you can observe python script One of the special features is that ustack() works well on these

probes These probes are built into OpenSolaris build 65 and later. See

http://blogs.sun.com/levon/entry/python_and_dtrace_in_build DTrace toolkit has a set of script that you can use for Python We will now look at the list of probes and an example

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 191

DTrace and Python -probes Here are the probes that are provided in the python provider

function-entry – fires when you call a function function-return – fires when you return from function

Both these provide the following argsarg1 – filenamearg2 – subroutine namearg3 – line number

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 192

DTrace and Python - example Here is a simple script to view python function calls

This one will print a summary of all the python function calls

#!/usr/sbin/dtrace -Zspython*:::function-entry{@[copyinstr(arg1)]=count();}

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 193

DTrace for RubyA gem of a find!

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 194

DTrace and Ruby DTrace probes have been added to Ruby by Joyeur With these DTrace probes you can observe python script Some good info on Ruby and DTrace can be found on the Joyeur sitehttp://www.joyeur.com/2007/05/07/dtrace-for-ruby-is-available You can get the probe from the above site and some good examples DTrace toolkit has a set of script that you can use for ruby We will now look at the list of probes and examples

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 195

DTrace and Python -probes Here are the probes that are provided in the ruby provider

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 196

DTrace and Python -probe arguments Ruby probes provide some arguments as well

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 197

DTrace and Ruby - example Here is a simple script to view Ruby function calls

This one will print a summary of all the ruby function calls

#!/usr/sbin/dtrace -Zsruby*:::function-entry{@[copyinstr(arg1)]=count();}

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 198

DTrace for DatabasesDTrace -n for select *

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 199

DTrace and Databases DTrace has a lot of great features specially for databases Look at the IO provider.

This will give you some ideas on which disk is being used There are also some more specific help DTrace can provide for some

databases. We will see three examples

PostgreSQL – embedded probes MySQL – couple examples of DTrace usage. Oracle – printing SQL statements

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 200

DTrace & PostgresObserve post deploy of PostgreSQL

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 201

DTrace and PostgreSQL Postgres 8.2 and later has following embedded D probes.

probe transaction__start(int); probe transaction__commit(int); probe transaction__abort(int); probe lwlock__acquire(int, int); probe lwlock__release(int); probe lwlock__startwait(int, int); probe lwlock__endwait(int, int); probe lwlock__condacquire(int, int); probe lwlock__condacquire__fail(int, int); probe lock__startwait(int, int); probe lock__endwait(int, int);

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 202

DTrace and PostgreSQL To get the probes

Download the source For 32-bit version

./configure –enable-dtrace For 64 bit:

$ configure CC='gcc -m64' –enable-dtrace \ DTRACEFLAGS='-64' $ configure CC='/opt/SUNWspro/bin/cc -xtarget=native64'\ --enable-

dtrace DTRACEFLAGS='-64' Run make or gmake.

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 203

DTrace and PostgreSQL We will use pgbench to look at the PostgresSQL probes. Here are the steps for setup

Download an build postgres with D probes see ealier slide Create user postgres

# useradd -c PostgreSQL -d /export/home/postgres -m -g other -s /bin/bash postgres

Switch user to postgres# su – postgres

Create Postgres database$ initdb -D /export/home/postgres/pgdata

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 204

DTrace and PostgreSQL Start the database

$ createdb bench Populate the data in db

$ pgbench -i -s 5 bench Run the benchmark

$ pgbench -c 2 -t 400000 bench

Find the pids of the postgres process.$ pgrep -l postgres

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 205

DTrace and PostgreSQL Here are a few example D-scripts.

postgres_avg_query_time.d #!/usr/sbin/dtrace -Zqspostgresql*:::transaction-start{ self->ts=timestamp; @cnt[pid]=count();}

postgresql*:::transaction-commit{ @avg[pid]=avg(timestamp - self->ts);}

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 206

DTrace and PostgreSQLtick-5sec

{

normalize(@avg, 1000000);

printf("%15s %30s %30s\n","PID","Total queries","Avegrage time (ms)");

printf("\t======================================================================\n");

printa("%15d %@30d %@30d\n",@cnt,@avg);

printf("\t======================================================================\n\n");

clear(@cnt);

clear(@avg);

}

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 207

DTrace and PostgreSQL# ./postgres_avg_query_time.d

PID Total queries Avegrage time (ms)

==================================================================

23814 46 57

23817 58 34

23816 59 32

23815 59 33

23818 75 26

==================================================================

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 208

DTrace and PostgreSQL Here is a simple script to print all the SQL statements executed.postgres_queries.d#!/usr/sbin/dtrace -ZwqsBEGIN{freopen(“sql.output”);}pid$1::pg_parse_query:entry{ printf("%s\n",copyinstr(arg0));} This script will send its output to a file. sql.output

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 209

DTrace and PostgreSQL Sample output.BEGIN;

UPDATE accounts SET abalance = abalance + 344 WHERE aid = 212898;

SELECT abalance FROM accounts WHERE aid = 212898;

UPDATE tellers SET tbalance = tbalance + 344 WHERE tid = 22;

UPDATE branches SET bbalance = bbalance + 344 WHERE bid = 3;

INSERT INTO history (tid, bid, aid, delta, mtime) VALUES (22, 3, 212898, 344, CURRENT_TIMESTAMP);

END;

BEGIN;

UPDATE accounts SET abalance = abalance + 15549 WHERE aid = 474266;

SELECT abalance FROM accounts WHERE aid = 474266;

UPDATE tellers SET tbalance = tbalance + 15549 WHERE tid = 19;

UPDATE branches SET bbalance = bbalance + 15549 WHERE bid = 5;

INSERT INTO history (tid, bid, aid, delta, mtime) VALUES (19, 5, 474266, 15549, CURRENT_TIMESTAMP);

END;

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 210

DTrace and PostgreSQL More info on PostgreSQL and DTrace Look at Robert Lor's Bloghttp://blogs.sun.com/robertlor/entry/user_level_dtrace_probes_in For more examples seehttp://pgfoundry.org/projects/dtrace/

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 211

DTrace & MySQLOh My My see what SQL I'm running

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 212

DTrace and MySQL Some efforts in place to make embedded DTrace probes into

MySQL. Until then here is a simple script to capture all the SQL statements

executed in a live running MySQL process No extra recompiles needed.

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 213

DTrace and MySQL Some efforts in place to make embedded DTrace probes into

MySQL. Until then here is a simple script to capture all the SQL statements

executed in a live running MySQL process No extra recompiles needed. First find the demangled name for the function dispatch_command

() dem `nm mysqld | cut -f 8 -d "|" ` | grep dispatch_command__1cQdispatch_command6FnTenum_server_command_pnDTHD_pcI_b_ == bool dispatch_command

(enum_server_command,THD*,char*,unsigned)

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 214

DTrace and MySQL Now for the D script#!/usr/sbin/dtrace -qws

/*

* __1cQdispatch_command6FnTenum_server_command_pnDTHD_pcI_b_ == bool dispatch_c

ommand(enum_server_command,THD*,char*,unsigned)

*

*/

BEGIN

{

freopen("sql_commands_out");

}

pid$target::__1cQdispatch_command6FnTenum_server_command_pnDTHD_pcI_b_:entry

{

printf("%d:: %s\n",tid,copyinstr(arg2));

}

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 215

DTrace and MySQL Output looks like6590:: BEGIN

6590:: SELECT c from sbtest where id=503525

6590:: SELECT c from sbtest where id=496471

6590:: SELECT c from sbtest where id=500073

6590:: SELECT c from sbtest where id=504921

6590:: SELECT SUM(K) from sbtest where id between 497386 and 497485

6590:: SELECT c from sbtest where id between 537144 and 537243 order by c

6590:: SELECT c from sbtest where id=399019

6590:: SELECT c from sbtest where id=497899

6590:: SELECT c from sbtest where id=496774

6590:: SELECT c from sbtest where id=500069

6590:: SELECT c from sbtest where id between 499439 and 499538

6590:: SELECT DISTINCT c from sbtest where id between 502890 and 502990 order by c

6590:: UPDATE sbtest set k=k+1 where id=500085

6590:: UPDATE sbtest set c='183967968-592575299-975263686-423718108-495026220-90

1629681-234741050-54888582-190117389-133959759' where id=495351

6590:: SELECT c from sbtest where id=517615

6590:: SELECT c from sbtest where id=503673

6590:: DELETE from sbtest where id=504804

6590:: INSERT INTO sbtest values(504804,0,' ','aaaaaaaaaaffffffffffrrrrrrrrrreee

eeeeeeeyyyyyyyyyy')

6590:: COMMIT

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 216

DTrace & OracleA SQL of Oracle.

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 217

DTrace and Oracle We can use the following simple D-script to show all SQL

statements executed by Oracle. This is a internally developed script. To run his script# dtrace -32 -q -C -I. -s oracle32_queriesd pid-of-oracle-client Disclaimers

This is assuming you are using 32 bit version of Oracle The header file was constructed using a google for structure This has been tested in Oracle 9i we can develop similar

scripts for later versions.

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 218

DTrace and Oracle#include "oracle.h"pid$1::sqlcxt:entry {

this->s = (struct sqlexd *) copyin(arg2,sizeof(struct sqlexd)); self->query = copyinstr((uintptr_t)this->s->stmt); printf("%s: %s\n",execname, self->query);}

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 219

DTrace and Oraclestatic struct sqlexd { unsigned int sqlvsn; unsigned int arrsiz;

unsigned int iters; unsigned int offset; unsigned short selerr; unsigned short sqlety;

unsigned int occurs; short *cud; unsigned char *sqlest; char *stmt;

void *sqladtp; void *sqltdsp; void **sqphsv; unsigned int *sqphsl; int *sqphss;

void **sqpind; int *sqpins; unsigned int *sqparm; unsigned int **sqparc;

unsigned short *sqpadto; unsigned short *sqptdso; void *sqhstv[4]; unsigned int sqhstl[4];

int sqhsts[4]; void *sqindv[4]; int sqinds[4]; unsigned int sqharm[4];

unsigned int *sqharc[4]; unsigned short sqadto[4]; unsigned short sqtdso[4];};

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 220

DTrace and Oracle Also see script oracle32.d for an example of capturing time taken

for each query You can use other standard pid provider instrumentation to look at

the oracle process No need to recompile or restart oracle to use these scripts

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 221

Make your own DTrace providerDIY guide to providers

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 222

Defining Provider & Probes Creating your own probe is very very simple. Step 1: Figure out what probes you want to add to your app. This is

probably the hardest part. Remember probes will be used by users who do not understand your

implementation details probes can be listed so you need to think of how long you want to

support these probes. probe and provider names should be intuitive location of probe should be intuitive

You are more than 80% there.

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 223

Defining Provider & Probes Step 2: Provider & probe definition

create a .d file with the following entriesprovider foobar {probe foo(int,int);probe bar();};

You just created a provider foobar and two probes foo & bar. That's it. (almost!)

The arguments are the types of the two arguments your probe exposes.

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 224

Defining Provider & Probes Step 3: Insert probes into your code.

in your source code at the location you want the probes to fire.foo { ... if(inp<10){ val1 = inp^3; }else val1 = inp^2; }...}

Add the probe macro#include <sys/sdt.h>foo { ... if(inp<10){DTRACE_PROBE2(foobar, foo, inp, 3);val1=inp^3;}else...}

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 225

Defining Provider & Probes Step 4: Build your code.

Compilecc -c probeale.c dtrace -G -32 -s foobar.d probeable.o cc -o probeable foobar.o probeable.o

The dtrace command compiles the .d file. It takes input from the probeable.o(place in your code where you have added the code)

-G option generates a .o file -32 / -64 for 32 and 64 bit apps. The last line compiles all the .o's into your app. Ok you are done! Really!

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 226

Using the probes Now that you have created your own probes you can use them like

any other probe. Some things to remember

Access your probe using <provider_name><pid> format. So if your process id is 3346 then provider name is foobar3346

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 227

Details on DTrace providersMore examples for providers.

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 228

Provider details

Here is some detailed info on providers

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 229

dtrace Provider The dtrace provider provides three probes (BEGIN, END, ERROR)BEGIN BEGIN is the first probe to fire.All BEGIN clauses will fire before any other probe fires.Typically used to initialize.END Will fire after all other probes are completedCan be used to output resultsERRORWill fire under an error conditionFor error handling

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 230

dtrace provider. Example#!/usr/sbin/dtrace -sBEGIN{ i = 0; exit(0);}

ERROR{ printf("Error has occurred!");}

END{ printf("Exiting and dereferencing a null pointer\n"); *(char *)i; }

dtrace.d

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 231

profile Provider Profile providers has probes that will fire at regular intervals. These probes are not associated with any kernel or user code

execution profile provider has two probes. profile probe and tick probe. format for profile probe: profile-n

The probe will fire n times a second on every CPU. An optional ns or nsec (nano sec), us or usec (microsec), msec or

ms (milli sec), sec or s (seconds), min or m (minutes), hour or h (hours), day or d (days) can be added to change the meaning of 'n'.

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 232

profile probe - examples The following example prints out frequency at which proc execute

on a processor.#!/usr/sbin/dtrace -qsprofile-100{ @procs[pid, execname] = count();} This one tracks how the priority of process changes over

time.#!/usr/sbin/dtrace -qsprofile-1001/pid == $1/{ @proc[execname]=lquantize(curlwpsinfo->pr_pri,0,100,10);}try this with a shell that is running...

$ while true ; do i=0; done

prof.d

prio.d

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 233

tick-n probe Very similar to profile-n probe Only difference is that the probe only fires on one CPU. The meaning of “n” is similar to the profile-n probe.

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 234

lockstat Provider lockstat has two kinds of probes. contention-event probes and hold-

event probes. contention-event – Used to track contention events. As these are

rare it does not impose too much of an overhead and so can be safely enabled

hold-event – These are to track acquiring and releasing locks. Enabling these probes can incur an overhead as these events are more common.

lockstat allows you to probe adaptive, spin, thread and reader and writer locks.

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 235

lockstat probes

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 236

lockstat - ExampleHere is an example. It counts all the lock events of the given executable.

#!/usr/sbin/dtrace -qslockstat:::/execname==$$1/{ @locks[probename]=count();}

lockstat.d

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 237

plockstat provider One final provider that may be of interest is plockstat plockstat is the user land equivalent of lockstat in kernel. Three types of lock events can be traced.Contention events – probes for user level lock contention Hold events – probes for lock acquiring, releasing etc.Error events – error coditions. There are two families of probesMutex ProbesReader Writer lock Probes

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 238

plockstat Providers

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 239

fbt Provider The fbt – Function Boundary Tracing provider has probe into most

functions in the kernel. Using fbt probe you can track entry and return from almost every

function in the kernel. There are over 20,000 fbt probe in even the smallest Solaris systems You'd need Solaris internal knowledge to be able to use this

effectively Once opensolaris.org has entire Solaris code you will be able to use

these probes more effectively. Very useful if you develop your own kernel module. We will see a few examples.

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 240

fbt probe example.

#!/usr/sbin/dtrace -Fs/*-F provides nice indented printing */

syscall::ioctl:entry/execname == "bash"/{ self->traceme = 1; printf("fd: %d", arg0);}

fbt:::/self->traceme/{}

syscall::ioctl:return/self->traceme/{ self->traceme = 0; exit(0);}

The following example prints all the kernel functions called by ioctl syscall from a “bash” shell.

fbt1.d

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 241

proc Provider The proc Provider has probes for process/lwp lifecyclecreate – fires when a proc is created using fork and its variantsexec – fires when exec and its variants are calledexec-failure & exec-success – when exec fails or succeedslwp-create, lwp-start, lwp-exit – lwp life cycle probessignal-send, signal-handle, signal-clear – probes for various signal

statesstart – fires when a process starts before the first instruction is executed.

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 242

Examples

#!/usr/sbin/dtrace -qsproc:::exec { self->parent = execname; }

proc:::exec-success /self->parent != NULL/ { @[self->parent, execname] = count(); self->parent = NULL; }

proc:::exec-failure /self->parent != NULL/ { self->parent = NULL; }

END { printf("%-20s %-20s %s\n", "WHO", "WHAT", "COUNT"); printa("%-20s %-20s %@d\n", @); }

The following script prints all the processes that are created. It also prints who created these process as well.

proc1.d

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 243

More Examples

#!/usr/sbin/dtrace -qsproc:::signal-send{ @[execname, stringof(args[1]->pr_fname),args[2]] = count();}

END{ printf("%20s %20s %12s %s\n", "SENDER", "RECIPIENT", "SIG", "COUNT"); printa("%20s %20s %12d %@d\n", @); } -bash-3.00$ ./proc2.d^C SENDER RECIPIENT SIG COUNT sched dtrace 2 1 sched ls 2 1 sched bash 18 4 sched bash 2 5 bash bash 2 5 bash bash 20 12

The following script prints all the signals that are sent in the system. It also prints who sent the signal to whom.

proc2.d

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 244

sched Provider The sched provider allows users to gain insight into how a process is

scheduled. It helps answer questions like why and when did the thread of interest change priority.

The following are a few probes that are part of the sched provider.change-pri – When priority changesdqueue/enqueue – when proc taken off or put on the run queueoff-cpu / on-cpu – when thread taken off or put on a cpu.preempt – when thread preemptedsleep / wakeup – when thread sleep on a synchronization object and

when it wakes up.

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 245

sched examples.

#!/usr/sbin/dtrace -qssched:::on-cpu{ self->ts = timestamp;}

sched:::off-cpu/self->ts/{ @[cpu] =quantize(timestamp - self->ts);}

This script prints the distribution of the time threads spends on a cpu.

sched.d

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 246

DTrace data structureA peek into more that can be done with

DTrace

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 247

Arraysname[key] = expression; name – name of array key – list of scalar expression values (tuples) expression – evaluates to the type of array#!/usr/sbin/dtrace -ssyscall::open*:entry,syscall::close*:entry{ ts[probefunc,pid,tid]=timestamp; /* save time stamp at entry */}

syscall::open*:return,syscall::close*:return{ timespent = timestamp - ts[probefunc,pid,tid]; printf("%s threadID %d spent %d nsecs in %s\n", execname, tid, timespent, probefunc); /* print time-spent at return */ ts[probefunc,pid,tid]=0; timespent = 0;}

array.d

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 248

struct constructstruct type{element1;element2;}Examplestruct info{string f_name;int count;int timespent;} /* definition of struct info */

struct info my_callinfo; /* Declaring my_callinfo as variable of type info */

my_callinfo.f_name; /* access to member of struct */

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 249

Postmortem TracingCold cases!

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 250

Postmortem tracing A nifty feature of DTrace is to be able to dig dtrace related info from a

system crash dump. Feature could be very useful to support engineers Here is how it works.

Load core dump into mdb> ::dtrace_state – prints out details about all dtrace consumers when the

dump was generated. Take the address for dtrace consumer and

> <addr>::dtrace – prints all the info from dtrace buffer.

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 251

Postmortem tracing You can create a ring buffer of data using dtrace

Use the -b option for data size & -bufpolicy=ring for ring buffer policy.

You can leave this running and if system crashes you can analyze the buffer from the crash dump.

Options <addr>::dtrace -c 1

Print only info from cpu 1.

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 252

Speculative tracingDTrace meets Las Vegas

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 253

Speculation We will now see how to catch a bad code path using speculation! Here is why we need speculation.

Some time we only see error message after the error has occured.For example: We see a function return an error but the problem was

caused by something that the function did earlier. We see the error and want to go back and find out what the function did

wrong. But alas the function has already happened One solution could be to save details every time the function

executes but this is wasting trace buffer with a lot of useless data when were are only concerned about the one time the function failed.

A better solution - speculation

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 254

Speculation - examplepid$target::fopen64:entry { self->spec = speculation(); speculate(self->spec); printf("Path is %s\n", copyinstr(arg0));}

pid$target:::entry/self->spec/ { speculate(self->spec); }

pid$target:::return/self->spec/ { speculate(self->spec); }

pid$target::fopen64:return /self->spec && arg1 != 0/{ discard(self->spec); self->spec = 0; }

pid$target::fopen64:return /self->spec && arg1 == 0/ { commit(self->spec); self->spec = 0; }

spec.d

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 255

DTrace configurationFine tune the tool!

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 256

Granting privilege to run dtrace A system admin can grant any user privileges to run dtrace using

the Solaris Least Privilege facility privileges(5). DTrace provides for three types of privileges. dtrace_proc - provides access to process level tracing no kernel

level tracing allowed. (pid provider is about all they can run)dtrace_user – provides access to process level and kernel level

probes but only for process to which the user has access. (ie) they can use syscall provider but only for syscalls made by process that they have access.

dtrace_kernel – provides all access except process access to user level procs that they do not have access.

Enable these priv by editing /etc/user_attr. format user-name::::defaultpriv=basic,privileges

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 257

Increasing max probes You can see how easy it is to create a lot of probes on the fly using

the pid provider. Just one note before we move on. By default the maximum probes that Solaris allows is 250,000. You

can increase this by editing /kernel/drv/fasttrap.conf increase fasttrap-max-probes variable run update_drv fasttrap or reboot system

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 258

Consumers A DTrace consumer is a process that interacts with

DTrace There is no limit on concurrent consumers dtrace(1M) is a DTrace consumer that acts as a

generic front-end to the DTrace facility Examples: sysinfo, lockstat and plockstat.

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 259

DTrace more resourcesYes there is more to DTrace than can be

captured in 200 slides

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 260

DTrace Resources Here are a few of the many DTrace resources available for you “Solaris Dynamic Tracing Guide” is an excellent resource. Many of the

examples in this presentation are from the Guide. http://docs.sun.com/db/doc/817-6223

OpenSolaris DTrace community is one of the best places to get an answer on anything DTrace.

http://opensolaris.org/os/community/dtrace/Forum: http://www.opensolaris.org/jive/forum.jspa?forumID=7 The Big admin DTrace web page has a lot of good infohttp://www.sun.com/bigadmin/content/dtrace/

2008 JavaOneSM Conference – Lab 9400 DTrace for JDK 7.0 | Angelo Rajadurai | 261

More DTrace Resources Read the Blogs from Bryan Cantrill, Adam Leventhal, Mike Shapirohttp://blogs.sun.com/roller/page/bmchttp://blogs.sun.com/roller/page/ahlhttp://blogs.sun.com/mwsThey often speak about DTrace related issues.

Email me if there is anything I can help you [email protected] Of course you can google DTrace.http://www.google.com/search?q=dtrace

Observing and Optimizing your Application with DTrace

Angelo Rajadurai

[email protected]