custom-allocators
Custom allocator skill for memory allocation strategies. Use when implementing…
Linux perf profiler skill for CPU performance analysis. Use when collecting sampling profiles with perf record, generating perf report, measuring hardware counters (cache misses, branch mispredicts, IPC), identifying hot functions, or feeding perf data into flamegraph tools.
$ npx -y skills add mohitmishra786/low-level-dev-skills --skill linux-perf --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/linux-perfContext preview
The summary Claude sees to decide when to auto-load this skill.
Linux perf profiler skill for CPU performance analysis. Use when collecting sampling profiles with perf record, generating perf report, measuring hardware counters (cache misses, branch mispredicts, IPC), identifying hot functions, or feeding perf data into flamegraph tools.
name: linux-perf description: Linux perf profiler skill for CPU performance analysis. Use when collecting sampling profiles with perf record, generating perf report, measuring hardware counters (cache misses, branch mispredicts, IPC), identifying hot functions, or feeding perf data into flamegraph tools. Activates on queries about perf, Linux performance counters, PMU events, off-CPU profiling, perf stat, perf annotate, or sampling-based profiling on Linux.
Guide agents through `perf` for CPU profiling: sampling, hardware counter measurement, hotspot identification, and integration with flamegraph generation.
# Install sudo apt install linux-perf # Debian/Ubuntu (version-matched) sudo dnf install perf # Fedora/RHEL # Check permissions # By default perf requires root or paranoid level ≤ 1 cat /proc/sys/kernel/perf_event_paranoid # 2 = only CPU stats (not kernel), 1 = user+kernel, 0 = all, -1 = no restrictions # Temporarily lower (session only) sudo sysctl -w kernel.perf_event_paranoid=1 # Persistent echo 'kernel.perf_event_paranoid=1' | sudo tee /etc/sysctl.d/99-perf.conf sudo sysctl -p /etc/sysctl.d/99-perf.conf
Compile the target with debug symbols for useful frame data:
gcc -g -O2 -fno-omit-frame-pointer -o prog main.c # -fno-omit-frame-pointer: essential for frame-pointer-based unwinding # Alternative: compile with DWARF CFI and use --call-graph=dwarf
# Basic hardware counters perf stat ./prog # With specific events perf stat -e cache-misses,cache-references,instructions,cycles,branch-misses ./prog # Wall-clock comparison: N runs perf stat -r 5 ./prog # Attach to existing process perf stat -p 12345 sleep 10
Interpret `perf stat` output:
# Default: sample at 1000 Hz (cycles event) perf record -g ./prog # Specify frequency perf record -F 999 -g ./prog # Specific event perf record -e cache-misses -g ./prog # Attach to running process perf record -F 999 -g -p 12345 sleep 30 # Off-CPU profiling (time spent waiting) perf record -e sched:sched_switch -ag sleep 10 # DWARF call graphs (better for binaries without frame pointers) perf record -F 999 --call-graph=dwarf ./prog # Save to named file perf record -o myapp.perf.data -g ./prog
perf report # reads perf.data perf report -i myapp.perf.data perf report --no-children # self time only (not cumulative) perf report --sort comm,dso,sym # sort by fields perf report --stdio # non-interactive text output
Navigation in TUI:
# Show assembly with hit percentages perf annotate sym_name # From report: press 'a' on a symbol # Or directly: perf annotate -i perf.data --symbol=hot_function --stdio
High hit count on a `mov` or `vmovdqa` suggests a cache miss at that load.
# Live top, like 'top' but for functions sudo perf top -g # Filter by process sudo perf top -p 12345
# Generate perf script output perf script > out.perf # Use Brendan Gregg's FlameGraph tools git clone https://github.com/brendangregg/FlameGraph ./FlameGraph/stackcollapse-perf.pl out.perf > out.folded ./FlameGraph/flamegraph.pl out.folded > flamegraph.svg # Open flamegraph.svg in browser
See `skills/profilers/flamegraphs` for reading flamegraphs and interpreting results.
| Problem | Cause | Fix | |---------|-------|-----| | `Permission denied` | `perf_event_paranoid` too high | Lower paranoid level or run with `sudo` | | `[unknown]` frames | Missing frame pointers or debug info | Recompile with `-fno-omit-frame-pointer` or use `--call-graph=dwarf` | | `[kernel]` everywhere | Kernel symbols not visible | Use `sudo perf record`; install `linux-image-$(uname -r)-dbgsym` | | `No kallsyms` | Kernel symbols unavailable | `echo 0 | sudo tee /proc/sys/kernel/kptr_restrict` | | Empty report for short program | Program exits too fast | Use `-F 9999` or instrument longer workload | | DWARF unwinding slow | Large DWARF stack | Limit with `--call-graph dwarf,512` |
# List all available events perf list # Common hardware events cycles instructions cache-references cache-misses branch-instructions branch-misses stalled-cycles-frontend stalled-cycles-backend # Software events context-switches cpu-migrations page-faults # Tracepoints (requires root) sched:sched_switch syscalls:sys_enter_read
For a counter reference and interpretation guide, see [references/events.md](references/events.md).
A curated suite of AI agent skills for systems and low-level programming — C/C++, Rust, Zig, GPU, bare-metal firmware, Linux kernel/driver development, computer architecture, compiler internals, HPC, and more.
Repo: mohitmishra786/low-level-dev-skills
Custom allocator skill for memory allocation strategies. Use when implementing…
NUMA programming skill for multi-socket memory locality. Use when detecting NUMA topology,…
AF_XDP skill for high-performance XDP sockets. Use when creating AF_XDP sockets, configuring…
DPDK skill for userspace packet I/O. Use when initializing EAL, configuring PMD drivers,…
io_uring skill for Linux async I/O. Use when building high-performance servers with liburing,…
Bare-metal ADC and DAC skill. Use when configuring analog sampling, DMA-driven ADC,…