1# CPU Counters
2
3The xnu subsystems that manage CPU performance counters.
4
5## Overview
6
7CPU performance counters are hardware registers that count events of interest to efficient CPU execution.
8Counters that measure events closely correlated with each CPU's execution pipeline are managed by the Core Performance Monitoring Unit (CPMU).
9The 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.
10In 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.
11All counters in the UPMU are configurable.
12
13Counters are typically used in one of two ways:
14
151. In "counting" mode, their counts are periodically queried and tallied up for a duration of interest.
162. In "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.
17
18## Subsystems
19
20There are several subsystems that provide access to CPU counter hardware:
21
22- kpc: The Kernel Performance Counter system is the oldest subsystem and still manages the configurable CPMU counters.
23It can use PMIs from these counters to trigger kperf samples and counter values can be recorded in kperf samples.
24
25- Monotonic: The Monotonic system provides access to the fixed CPMU counters with limited support for PMIs.
26Additionally, the UPMU is entirely provided by a Monotonic dev node interface.
27
28- cpc: The CPU Performance Counter subsystem provides a policy layer on top of kpc and Monotonic to prevent malicious use of the hardware.
29
30Eventually, cpc will subsume kpc's and Monotonic's roles in the system.
31
32## Integrations
33
34- The Recount subsystem makes extensive use of the fixed CPMU counters to attribute CPU resources back to threads and processes.
35
36- Microstackshot telemetry is sampled periodically using the CPMU's cycle PMI trigger.
37
38- Stackshot includes cycles and instructions for each thread container in its kcdata.
39
40- 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.
41And CPU counter values can be sampled by kperf on other triggers, like timers or kdebug events.
42
43## See Also
44
45- <doc:recount>
46