************************************************************************** * The following are notes regarding the overheads of running DTrace. * * $Id: ALLoverhead.txt 58 2007-10-01 13:36:29Z brendan $ * * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. ************************************************************************** The following are notes regarding the overheads of running DTrace. * What are the overheads of running DTrace? Often negligible. It depends what the DTrace script does, in particular, the frequency of events that it is tracing. The following tips should explain what the overheads probably are, - if your script traces less than 1000 events per second, then the overhead is probably negligible. ie, less than 0.1% CPU. - if your script traces more than 100,000 events per second, then the overhead will start to be significant. If you are tracing kernel events, then perhaps this could be 10% per CPU. If you are tracing user land application events, then the overhead can be greater than 30% per CPU. - if your script produes pages of output, then the CPU cost of drawing this output to the screen and rendering the fonts is usually far greater than DTrace itself. Redirect the output of DTrace to a file in /tmp ("-o" or ">"). - a ballpark figure for the overhead of a DTrace probe would be 500 ns. This can be much less (kernel only), or much more (many user to kerel copyin()s); I've provided it to give you a very rough idea. Of course, as CPUs become faster, this overhead will become smaller. If overheads are a concern - then perform tests to measure their magnitude for both your workload and the scripts applied, such as benchmarks with and without DTrace running. Also read the scripts you are using, and consider how frequent the probes will fire, and if you can customise the script to reduce the frequency of probes. For example, scripts that trace, pid$target:::entry, pid$target:::return would usually cause significant performance overhead, since they fire two probes for every function called (and can easily reach 100,000 per second). You could reduce this by modifying the script to only trace the libraries you are interested in. For example, if you were only interested in libsocket and libnsl, then change the above lines wherever they appeared to, pid$target:libsocket::entry, pid$target:libsocket::return, pid$target:libnsl::entry, pid$target:libnsl::return and you may notice the overheads are significantly reduced (especially anytime you drop libc and libdl). To go further, only list functions of interest, pid$target:libsocket:connect:entry, pid$target:libsocket:connect:return, pid$target:libsocket:listen:entry, pid$target:libsocket:listen:return, [...] There are additional notes in Docs/Faq about the DTraceToolkit's scripts and performance overhead. * When are the overheads a problem? When they are significant (due to frequent events), and you are tracing in a production environment that is sensitive to additional CPU load. Overheads should be considered if you are measuring times (delta, elapsed, on-CPU, etc) for performance analysis. In practise, overheads aren't that much of a problem -- the script will either identify your issues correctly (great), or not (keep looking). Any it is usually easy to quickly confirm what DTrace does find by using other tools, or by hacking quick code changes. You might be using DTrace output that you know has a significant margin of error - but that becomes moot after you prove that the performance fix works through benchmarking a quick fix. At the end of the day, if DTrace helps find real measurable performance wins (and it should), then it has been successful. * When are overheads not a problem? When the script is not tracing extreamly frequent events. Also, when you are in development and tracing events for troubleshooting purposes (args to functions, for example), DTrace overheads are usually not an issue at all.