Client/Server CPU Statistics

This view lets you trace server time back to individual clients, by showing, for each thread, the time that it spent performing work for itself (self time) or that another thread spent performing work for it (imposed time).

In a message-passing system such as QNX Neutrino, sometimes a particular thread consumes a lot of CPU time but that time is primarily spent servicing client requests. In this case, the total CPU usage for that server thread doesn't tell the whole story because you need to know which clients are imposing the heaviest load so you can optimize them. To identify clients and servers, the System Profiler uses the message-passing events in the kernel event trace log. For an explanation of self time versus imposed time in relation to such events, see Isolating client and server CPU loads.

Every statistics view in the System Profiler perspective has these common behaviors:
  • No trace data are displayed until you click the Refresh statistics button (Icon: Button to refresh statistics); some views have a different name for this button but it does the same thing.
    Note: If you're viewing statistics from one kernel event log file but then open another log file, the results in the statistics-related views won't reflect the newly opened file until you refresh them manually.
  • They can display statistics that reflect either the entire trace period or the timeframe selected in an editor pane. The display mode is controlled by the Toggle global/selection statistics gathering button (Icon: Button to toggle global/selection statistics gathering) as well as the top option in the upper right dropdown (Icon: Dropdown button).
  • They can generate a CSV report of the data currently displayed. This feature is accessed through the bottom option in the upper right dropdown.
The Client/Server CPU Statistics view uses a table to display various times that threads spent in the Running state (this is slightly different from pure CPU usage). By default, four columns are shown:
  • Owner — process name, followed by thread name
  • Total Time — total of self and imposed times
  • Self Time — overall CPU time the thread spent executing code for itself
  • Imposed Time — overall CPU time that other threads spent executing code on behalf of the thread (in response to requests it issued by message sends); this accounts for all server threads
Client/Server CPU Statistics view

You can expand the table to show how much CPU time each client imposed on individual servers. To do so, click Show all times in the upper right dropdown. The table then displays columns containing server names and listing the times imposed by each client. This makes the table quite wide, so you'll likely have to scroll right to find the metrics of interest.
Client/Server CPU Statistics view

Note that imposed time is cumulative: if client A sends to server B, then until B replies to A, any CPU time that B consumes is seen as imposed time for A. If during that time B sends to server C, then server C's CPU time is also billed as imposed time for A. The rationale here is that B would not have engaged with C if A hadn't sent the initial message to B.

To sort the table by a metric, click its column header once for descending order or twice for ascending order. Sorting the threads by Imposed Time lets you quickly identify which clients are predominantly driving the system and which servers may be bottlenecks.

Note: To see separate self and imposed CPU times, the trace must include all state change and message events (e.g., Ready, Running, Send Message, Receive Message, Reply, and Error). If you don't see these metrics, ensure that those events are enabled under the Event Filters tab in the log configuration. State change events are found under the Process and Thread class while message events are found under Communication.