| # CPU samples |
| |
| The [Harvester](README.md) gathers a collection of CPU samples from each CPU on |
| the device. This document describes how the data is labelled and what the values |
| represent. |
| |
| ## Dockyard path |
| |
| The path to each sample includes `cpu`, the processor index, and the sample |
| name. For example,`cpu:0:busy_time`. |
| |
| ## Samples |
| |
| Data collected by the Harvester along with timestamp and a Dockyard path is |
| called a sample. The following sections describe CPU samples collected. They are |
| grouped in four broad categories. |
| |
| ### Load |
| |
| The busy and idle times are complementary. The busy time is derived from the |
| idle time. |
| |
| #### cpu:count |
| |
| The number of main CPUs. For the `cpu:*:` sample paths the `*` will be a |
| number from 0 to `cpu:count` - 1. |
| |
| #### cpu:\*:busy_time |
| |
| The total accumulated time this processor has been busy. |
| |
| #### cpu:\*:idle_time |
| |
| The total accumulated time this processor was not doing work (not running any |
| threads). |
| |
| ### Kernel scheduler counters |
| |
| The scheduler schedules threads. It determines which thread a given CPU should |
| be running. |
| |
| #### cpu:\*:reschedules |
| |
| How many potential `context_switches` occurred. All `context_switches` are preceded |
| by a reschedule, but not all reschedules result in a `context_switch`. |
| |
| #### cpu:\*:context_switches |
| |
| How many thread switches have occurred. A high value may indicate threads are |
| thrashing (spending an inordinate amount of time switching places rather than |
| doing work). |
| |
| #### cpu:\*:meaningful_irq_preempts |
| |
| How many thread preemptions have occurred due to an interrupt (`irq`) while the |
| CPU is not idle. If the thread is idle the interrupt is not considered |
| meaningful and is not tracked here. |
| |
| #### cpu:\*:preempts |
| |
| How many thread preemptions have occurred. (Not currently used). |
| |
| #### cpu:\*:yields |
| |
| How many times a thread has yielded its use of a processor to allow another |
| thread to execute. |
| |
| ### CPU level interrupts and exceptions |
| |
| An interrupt causes the current flow of a thread to be "interrupted". The thread |
| is stopped, the state is preserved (so it can be resumed) and the processor |
| executes an interrupt handler (function). |
| |
| #### cpu:\*:external_hardware_interrupts |
| |
| External hardware interrupts indicate a signal or event happening outside of the |
| machine. Common examples are serial input, or a physical button like a volume up |
| or down button. Does not include timer or inter-processor interrupts. |
| |
| #### cpu:\*:timer_interrupts |
| |
| A timer interrupt occurs when a "clock" (or some kind of time keeping device) |
| creates an interrupt. |
| |
| #### cpu:\*:timer_callbacks |
| |
| How many times a function (callback) has been called due to a timer. Each time a |
| timer interrupt occurs, zero-to-many timer callbacks may be called. |
| |
| #### cpu:\*:syscalls |
| |
| How many system (kernel) API calls have been made. |
| |
| ### Inter-processor interrupts |
| |
| An inter-processor interrupt occurs when a processor signals another processor. |
| |
| #### cpu:\*:reschedule_ipis |
| |
| The count of times the scheduler (running on some CPU) has requested a schedule |
| change (waking up another CPU). |
| |
| #### cpu:\*:generic_ipis |
| |
| The count of inter-process interrupts that were not a schedule change (tracked |
| as `reschedule_ipis`), ipi interrupt (untracked), or ipi halt (untracked). |