I would like to "profile" when threads in certain processes go to sleep.
The following seems to work, but... sched:::off-cpu /execname == "MyProg" && curlwpsinfo->pr_state == SSLEEP/ { self->sleepStart = timestamp; } sched:::on-cpu /self->sleepStart/ { this->slept = timestamp - self->sleepStart; /* I want specifics about LWP#s < 20 and combine all others */ this->thrd = tid < 20 ? tid : 0; @sleepCnt[this->thrd,ustack()] = count(); @sleepAvg[this->thrd,ustack()] = avg(this->slept); @sleepTot[this->thrd,ustack()] = sum(this->slept); @SleepCnt[pid] = count(); @TotSlp[pid] = sum(this->slept); self->sleepStart = 0; } dtrace:::END { trunc(@sleepTot, 10); trunc(@sleepCnt, 20); trunc(@sleepAvg, 10); normalize(@sleepTot,1000000); normalize(@sleepAvg,1000000); printa("lwp %d slept (tot=%@dms) %@d times (avg=%@dms) like this:%-6k\n", @sleepTot, @sleepCnt, @sleepAvg); } but I do not understand why it does not combine some entries like: lwp 5 slept (tot=0ms) 0 times (avg=30000ms) like this: libc.so.1`__lwp_park+0x10 libc.so.1`cond_wait_queue+0x4c libc.so.1`cond_wait_common+0x2d4 libc.so.1`_cond_timedwait+0x34 libc.so.1`cond_timedwait+0x14 libc.so.1`pthread_cond_timedwait+0xc libnspr4.so`pt_TimedWait+0xe0 libnspr4.so`PR_WaitCondVar+0x190 libnspr4.so`PR_Wait+0x1c libmqcrt.so.1`0xffffffff57657c48 libnspr4.so`_pt_root+0xa8 libc.so.1`_lwp_start lwp 5 slept (tot=0ms) 0 times (avg=30000ms) like this: libc.so.1`__lwp_park+0x10 libc.so.1`cond_wait_queue+0x4c libc.so.1`cond_wait_common+0x2d4 libc.so.1`_cond_timedwait+0x34 libc.so.1`cond_timedwait+0x14 libc.so.1`pthread_cond_timedwait+0xc libnspr4.so`pt_TimedWait+0xe0 libnspr4.so`PR_WaitCondVar+0x190 libnspr4.so`PR_Wait+0x1c libmqcrt.so.1`0xffffffff57657c48 libnspr4.so`_pt_root+0xa8 libc.so.1`_lwp_start lwp 5 slept (tot=0ms) 0 times (avg=30000ms) like this: libc.so.1`__lwp_park+0x10 libc.so.1`cond_wait_queue+0x4c libc.so.1`cond_wait_common+0x2d4 libc.so.1`_cond_timedwait+0x34 libc.so.1`cond_timedwait+0x14 libc.so.1`pthread_cond_timedwait+0xc libnspr4.so`pt_TimedWait+0xe0 libnspr4.so`PR_WaitCondVar+0x190 libnspr4.so`PR_Wait+0x1c libmqcrt.so.1`0xffffffff57657c48 libnspr4.so`_pt_root+0xa8 libc.so.1`_lwp_start Those are just one example of thread stacks that seem identical but were not combined into a single aggregation bucket. Some of the numbers are 0 due to the trun(xx,N) before the print - because I only want to see the (hopefully) few worst offenders. But since it does not combine them properly, the list is overwhelmed with like above which, unfortunately, are a case I don't actually care about. If it combined those, then I the other few printed should be what I do care about. Am I doing something wrong? Excluding the stacks like above, by setting a flag when it enters that function, is problematic because it requires using the pid provider and then I can only watch one process at a time. Kelly _______________________________________________ dtrace-discuss mailing list dtrace-discuss@opensolaris.org