#!/usr/sbin/dtrace -Cs
#pragma D option quiet
/* I need process pid, his forks and life time */
proc:::create
{
printf("<fork ppid=%d cpid=%d execname=%s time=%d />\n",
pid,args[0]->pr_pid,execname,`lbolt*10/ `hz);
}
proc:::exec-success
{
printf("<process pid=%d execname=%s time=%d />\n",
pid,execname,`lbolt*10/ `hz);
}
proc:::exit
{
printf("<end pid=%d execname=%s time=%d />\n",
pid, execname,`lbolt*10/ `hz);
}
Then I enable anonymous tracing:
dtrace -AFs /boot/boot.d
reboot
After reboot I write a logfile and disable anonymous tracing:
dtrace -ae -o bootlog
dtrace -A
Logfile looks like this:
CPU FUNCTION
0 | exec_common:exec-success <process pid=1 execname=init time=63 />
0 | cfork:create <fork ppid=1 cpid=4 execname=init time=66 />
0 | exec_common:exec-success <process pid=4 execname=ksh93 time=67 />
0 | exec_common:exec-success <process pid=4 execname=autopush time=87 />
0 | proc_exit:exit <end pid=4 execname=autopush time=92 />
0 | cfork:create <fork ppid=1 cpid=5 execname=init time=92 />
0 | exec_common:exec-success <process pid=5 execname=ksh93 time=92 />
0 | exec_common:exec-success <process pid=5 execname=soconfig time=94 />
...
Now by help of a python it's possible to parse logfile. I've written a small script bootchart.py for parsing and chart construction. It would be great to trace and draw the cpu part but this is not implemented yet.
To create boot chart you need run bootchart.py with logfile as an argument:
bootchart.py bootlog
This is a boot chart example for OpenSolaris 2008.11:
Talk about understatement! This is slick; thank you for sharing it.
ReplyDeleteCould this be used to monitor a specific process - say to capture the performance of a particular process over a period of time? I'm new to dtrace...how could a specific PID be used to manually capture the stats of a running process (as apposed to all the processes)? Good stuff - thanks.
ReplyDeleteIt's easy to make on already loaded system. To create the boot chart is probably just need to find the desired command from the file and make the graph only for it
ReplyDeleteJust tried this on snv_134 and got the following:
ReplyDeleteline 7: failed to resolve `lbolt: Unknown symbol name
Looking through /dev/ksyms, I see a multitude of local <...>_lbolt objects, but no global lbolt object.
It seems this is due clock driven lbolt migration. Not tested, but I think now need use next function:
ReplyDeletefbt:genunix:ddi_get_lbolt:return
{
lbolt = args[1];
}