Current-Users archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: Documentation for dtrace?



Hi David,

On 10/09/2011, at 10:38 AM, David Young wrote:

> On Fri, Sep 09, 2011 at 12:03:38PM -0400, Thor Lancelot Simon wrote:
>> On Fri, Sep 09, 2011 at 08:51:23AM -0700, Paul Goyette wrote:
>>> 
>>> 1. Is there any info on performance impact for building the kernel with
>>>   "options KDTRACE_HOOKS" ?
>> 
>> In -- minimal -- testing, I was not able to observe a perfomance impact.
>> 
>>> 2. The wiki article says that DTRACE is only for i386 - does this mean
>>>   that it doesn't work on amd64?
>> 
>> That's correct.  This work was done at Coyote Point, and at that time, we
>> had no immediate need for amd64 support, and many other high priority
>> NetBSD tasks in the pipeline.  However, Darran and I did discuss, at the
>> time, what would be needed to complete the amd64 specific pieces of the
>> puzzle; unfortunately, I do not remember the answers and do not have
>> access to my project planning materials from CP.
>> 
>> However, I am nudging Darran by carbon, and perhaps he'll respond to the
>> list.
> 
> Maybe Darran or somebody can explain how the SDT probes work in
> NetBSD?  
> 
> I'd like to put an SDT probe into assembly language.  It looks to
> me like it works differently in NetBSD than in Solaris.  In Solaris,
> the kernel linker ensures that SDT probes are NOPs until activated,
> when they are changed to an illegal instruction (lock nop) that
> causes a #UD trap
> (http://www.cs.dartmouth.edu/~sergey/cs108/dtrace-internals-x86.pdf).
> NetBSD appears to provide SDT probes more simply but possibly with
> higher overhead:
> 
> #define SDT_PROBE(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4) \
>        if (__predict_false(SDT_NAME(prov, mod, func, name).enabled)) { \
>                (*sdt_probe_func)(SDT_NAME(prov, mod, func, name).id, \
>                    (uintptr_t)(arg0), (uintptr_t)(arg1), (uintptr_t)(arg2), \
>                    (uintptr_t)(arg3), (uintptr_t)(arg4)); \
>        }

the NetBSD Dtrace port is a port of the FreeBSD Dtrace port, and yes the port 
has taken a short-cut with the SDT provider hooks.  As you can see from the 
SDT_PROBE() macro, there's an if test added for each probe which does a look-up 
in a table to see if the SDT probe is enabled.  I don't see why we couldn't 
replace the SDT implementation with one that more closes mimics the Solaris 
approach.  It should be noted that the Solaris implementation is not zero 
overhead either because although the probe function call is replaced by NOPs by 
the linker, I believe that the function call stack setup and tear down code is 
still present.

The NetBSD FBT (Functional Boundary Trace) provider is the real deal with zero 
impact probes that are directly patched into the kernel at run-time when the 
probe is enabled.  When the probe is disabled there is no code present for the 
probe.

Some additional details on DTrace probe overheads in Solaris here: 
http://www.solarisinternals.com/wiki/index.php/DTrace_Topics_Overhead.

I don't think the amd64 work is too involved, the code is reasonably structured 
with the architecture specific stuff self contained.  It would require some low 
level amd64 expertise or a bit of research into the amd64 equivalents for the 
x86 specific code.

Darran.




Home | Main Index | Thread Index | Old Index