[dtrace-discuss] What am I missing in the dtrace script?

Bryan Cantrill bmc at eng.sun.com
Tue Jul 10 15:41:33 PDT 2007


On Tue, Jul 10, 2007 at 03:27:46PM -0700, Brian D. Horn wrote:
> I've asked around, I tried searching on-line, but no go.
> 
> I would think what I am seeing is impossible or that there must
> be a bug in dtrace on MP systems (at least on 64-bit amd systems)
> as this was run on a Sun Fire x4500 (4-way Opteron - aka "Thumper")
> 
> Here is the script:
> 
> 
> #! /usr/sbin/dtrace -s
> 
> BEGIN
> {
>        total_queued = 0;
>        queuing_failed = 0;
>        queuing_succeeded = 0;
> }
> 
> ::vdev_queue_io_to_issue:return
> {
>        ++total_queued;
> }
> 
> ::vdev_queue_io_to_issue:return
> / args[1] == 0 /
> {
>        ++queuing_failed;
> }
> 
> ::vdev_queue_io_to_issue:return
> / args[1] != 0 /
> {
>        ++queuing_succeeded;
> }
> 
> END
> {
>        printf("\nTotal %d succeeded %d failed %d\n",
>                total_queued, queuing_succeeded, queuing_failed);
> }
> 
> And below is the output:
> 
> ^C
> CPU     ID                    FUNCTION:NAME
>  3      2                             :END
> Total 970818 succeeded 485824 failed 485584
> 
> Note that:
> 
> # bc
> 485824+485584
> 971408
> 
> So the sum of the two cases with qualifiers do not sum
> to the the total.  I've seen this before and running the script
> with all but one CPU off line seems to "fix" the problem.

When you're using global variables, they are modified without any locking
whatsoever -- so those increments are racing with one another on different
CPUs.  To achieve what you're trying to achieve, use aggregations, and
then printa() to process them:

::vdev_queue_io_to_issue:return
{
	@total_queued = count();
}

::vdev_queue_io_to_issue:return
/args[1] == 0/
{
	@queuing_failed = count();
}

::vdev_queue_io_to_issue:return
/args[1] != 0/
{
	@queuing_succeeded = count();
}

END
{
	printa("\nTotal %@d succeeded %@d failed %@d\n",
	    @total_queued, @queuing_succeeded, @queuing_failed);
}

	- Bryan

--------------------------------------------------------------------------
Bryan Cantrill, Solaris Kernel Development.       http://blogs.sun.com/bmc


More information about the dtrace-discuss mailing list