Awesome Open Source
Awesome Open Source

Processor Counter Monitor (PCM)

PCM Tools | Building PCM | Downloading Pre-Compiled PCM | FAQ | API Documentation | Environment Variables | Compilation Options

Processor Counter Monitor (PCM) is an application programming interface (API) and a set of tools based on the API to monitor performance and energy metrics of Intel® Core™, Xeon®, Atom™ and Xeon Phi™ processors. PCM works on Linux, Windows, Mac OS X, FreeBSD, DragonFlyBSD and ChromeOS operating systems.

Github repository statistics: Custom badge Custom badge Custom badge

Code quality: Language grade: C/C++ Language grade: Python

Current Build Status

  • Linux: GitHub Workflow Status
  • Windows: Build status
  • FreeBSD: GitHub Workflow Status
  • OS X: GitHub Workflow Status
  • Docker container: GitHub Workflow Status

PCM Tools

PCM provides a number of command-line utilities for real-time monitoring:

  • pcm : basic processor monitoring utility (instructions per cycle, core frequency (including Intel(r) Turbo Boost Technology), memory and Intel(r) Quick Path Interconnect bandwidth, local and remote memory bandwidth, cache misses, core and CPU package sleep C-state residency, core and CPU package thermal headroom, cache utilization, CPU and memory energy consumption) pcm output
  • pcm-sensor-server : pcm collector exposing metrics over http in JSON or Prometheus (exporter text based) format (how-to). Also available as a docker container. More info about Global PCM events is here.
  • pcm-memory : monitor memory bandwidth (per-channel and per-DRAM DIMM rank) pcm-memory output
  • pcm-latency : monitor L1 cache miss and DDR/PMM memory latency
  • pcm-pcie : monitor PCIe bandwidth per-socket
  • pcm-iio : monitor PCIe bandwidth per PCIe device pcm-iio output
  • pcm-numa : monitor local and remote memory accesses
  • pcm-power : monitor sleep and energy states of processor, Intel(r) Quick Path Interconnect, DRAM memory, reasons of CPU frequency throttling and other energy-related metrics
  • pcm-tsx: monitor performance metrics for Intel(r) Transactional Synchronization Extensions
  • pcm-core and pmu-query: query and monitor arbitrary processor core events
  • pcm-raw: program arbitrary core and uncore events by specifying raw register event ID encoding
  • pcm-bw-histogram: collect memory bandwidth utilization histogram

Graphical front ends:

  • pcm Grafana dashboard : front-end for Grafana (in scripts/grafana directory). Full Grafana Readme is here pcm grafana output
  • pcm-sensor : front-end for KDE KSysGuard
  • pcm-service : front-end for Windows perfmon

There are also utilities for reading/writing model specific registers (pcm-msr), PCI configuration registers (pcm-pcicfg) and memory mapped registers (pcm-mmio) supported on Linux, Windows, Mac OS X and FreeBSD.

And finally a daemon that stores core, memory and QPI counters in shared memory that can be be accessed by non-root users.

Building PCM Tools

Clone PCM repository with submodules:

git clone --recursive

or clone the repository first, and then update submodules with:

git submodule update --init --recursive

Install cmake then:

mkdir build
cd build
cmake ..
cmake --build .

You will get all the utilities (pcm, pcm-memory, etc) in build/bin directory. '--parallel' can be used for faster building:

cmake --build . --parallel

Debug is default on Windows. Specify config to build Release:

cmake --build . --config Release

On Windows and MacOs additional drivers are required. Please find instructions here: and MAC_HOWTO.txt.

FreeBSD/DragonFlyBSD-specific details can be found in FREEBSD_HOWTO.txt

Downloading Pre-Compiled PCM Tools

Frequently Asked Questions (FAQ)

PCM's frequently asked questions (FAQ) are located here.

PCM API documentation

PCM API documentation is embedded in the source code and can be generated into html format from source using Doxygen (

PCM environment variables

The list of PCM environment variables is located here

Custom compilation options

The list of custom compilation options is located here


Packaging with CPack is supported on Debian and Redhat/SUSE system families. To create DEB of RPM package need to call cpack after building in build folder:

cd build

This creates package:

  • "pcm-VERSION-Linux.deb" on Debian family systems;
  • "pcm-VERSION-Linux.rpm" on Redhat/SUSE-family systems. Packages contain pcm-* binaries and required for usage opCode-* files.
Alternatives To Pcm
Select To Compare

Alternative Project Comparisons
Related Awesome Lists
Top Programming Languages
Top Projects

Get A Weekly Email With Trending Projects For These Topics
No Spam. Unsubscribe easily at any time.
C Plus Plus (246,190
Monitoring (11,870
Cpu (8,603
Intel (4,887
Performance Analysis (540
Performance Metrics (429
Performance Monitoring (313
Performance Visualization (91
Pcm (71
Performance Dashboard (47
Monitor Performance (34
Processor Architecture (21
Xeon (8
Processor Counter Monitor (4