Kelly Caudill
2012-Nov-08 14:55 UTC
[dtrace-discuss] aggregation on ustack() not aggregating
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
Robert Harris
2012-Nov-08 15:16 UTC
[dtrace-discuss] aggregation on ustack() not aggregating
Hi Kelly, On 8 Nov 2012, at 14:55, Kelly Caudill wrote:> > 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?You''re not doing anything wrong. This is a known limitation that arises from the fact that the aggregation key generated by the ustack() action includes the PID. The PID itself isn''t displayed; it''s used to enable the user-land component to perform the address-to-name translation against the correct process. Robert
Harendra Rawat
2013-Feb-22 19:52 UTC
[dtrace-discuss] aggregation on ustack() not aggregating
I am also seeing same problem. Test run as follows.
syscall::umask:entry
{
??????? @execnameCntonly[execname, ustack()] = count();
}
bash-3.00# chmod 777 /tmp/abctsidx
bash-3.00# chmod 777 /tmp/abctsidx
bash-3.00# chmod 777 /tmp/abctsidx
bash-3.00# chmod 777 /tmp/abctsidx
bash-3.00# chmod 777 /tmp/abctsidx
? chmod
????????????? 0xfeefb7d5
????????????? 0x8051026
??????????????? 2
? chmod
????????????? 0xfeefb7d5
????????????? 0x8051026
??????????????? 2
? chmod
????????????? 0xfeefb7d5
????????????? 0x8051026
??????????????? 2
? chmod
????????????? 0xfeefb7d5
????????????? 0x8051026
??????????????? 2
? chmod
????????????? 0xfeefb7d5
????????????? 0x8051026
??????????????? 2
________________________________
From: Kelly Caudill <kelly.caudill at oracle.com>
To: dtrace-discuss at opensolaris.org
Sent: Thursday, November 8, 2012 6:55 AM
Subject: [dtrace-discuss] aggregation on ustack() not aggregating
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 at opensolaris.org
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://mail.opensolaris.org/pipermail/dtrace-discuss/attachments/20130222/fe603fe2/attachment.html>