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