xref: /xnu-10002.61.3/doc/cpu_counters.md (revision 0f4c859e951fba394238ab619495c4e1d54d0f34)
1# CPU Counters
2
3CPU performance counters are hardware registers that count events of interest to efficient CPU execution.
4Counters that measure events closely correlated with each CPU's execution pipeline are managed by the Core Performance Monitoring Unit (CPMU).
5The CPMU contains both fixed instructions and cycles counters, as well as configurable counters that can be programmed to count any of several hundred possible events.
6In addition to the CPMU, the Last Level Cache (LLC) hosts the Uncore Performance Monitoring Unit (UPMU), which measures effects that aren't necessarily correlated to a single CPU.
7All counters in the UPMU are configurable.
8
9Counters are typically used in one of two ways.
10In "counting" mode, their counts are periodically queried and tallied up for a duration of interest.
11In "sampling" mode, the counters are programmed to generate a Performance Monitor Interrupt (PMI) periodically, during which the currently running code can be sampled, like a time profiler.
12
13## Subsystems
14
15There are several subsystems that provide access to CPU counter hardware:
16
17- kpc: The Kernel Performance Counter system is the oldest subsystem and still manages the configurable CPMU counters.
18It can use PMIs from these counters to trigger kperf samples and counter values can be recorded in kperf samples.
19
20- Monotonic: The Monotonic system provides access to the fixed CPMU counters with limited support for PMIs.
21Additionally, the UPMU is entirely provided by a Monotonic dev node interface.
22
23- cpc: The CPU Performance Counter subsystem provides a policy layer on top of kpc and Monotonic to prevent malicious use of the hardware.
24
25Eventually, cpc will subsume kpc's and Monotonic's roles in the system.
26
27## Integrations
28
29- The Recount subsystem makes extensive use of the fixed CPMU counters to attribute CPU resources back to threads and processes.
30
31- Microstackshot telemetry is sampled periodically using the CPMU's cycle PMI trigger.
32
33- Stackshot includes cycles and instructions for each thread container in its kcdata.
34
35- The kperf profiling system can trigger samples of thread states and call stacks using CPMU PMIs, allowing it to sample thread states and call stacks.
36And CPU counter values can be sampled by kperf on other triggers, like timers or kdebug events.
37
38## See Also
39
40- `doc/recount.md`
41