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