Next: Putting it all together
Up: Discovering compute time
Previous: Approach 1
Approach 2
The second approach recognizes that
many synchronization mechanisms
are interrupt driven and rely on library or system calls for
synchronization (e.g., a node may block while reading a socket).
Therefore, given a
list of calls that can potentially block, one can
interpose on and calculate the time spent in each call, and then subtract this from the
think time. Such an approach does not require a semantic understanding of
any of the synchronization calls. Of course, this approach only works for
synchronization mechanisms that issue library or system calls and will not work with
applications that use ``untraceable'' synchronization (e.g., shared memory).
Unlike the first approach, this one
does not require a node to be throttled in order to extract computation,
and the calculation is unaffected by I/O sampling.
Note, approaches 1 and 2 assume that multiple outstanding I/Os are achieved via
multiple threads, each issuing synchronous I/O. The causality engine treats
threads as separate ``nodes'' and traces each independently.
Michael Mesnier
2006-12-22