--- description: 'cpu-demo 核心演示程序:读 /proc/self/stat 计算自身 CPU 使用率,提供用户态忙循环、内核态 syscall 风暴、空闲睡眠三种场景,是全站工具文档与 perf 案例的靶子程序。' keywords: ["实验", "演示", "perf", "proc", "self", "stat"] updated: 2026-08-29 --- # demos/cpu-demo/ —— 核心演示程序 > **代码获取**:本实验源码与 `REPRO.md` 复现手册已同步至公开仓库 [derekzhuo/geek-doc.cn](https://github.com/derekzhuo/geek-doc.cn?utm_source=geek-doc.cn&utm_medium=doc&utm_campaign=repo_clone),clone 即跑:`git clone --depth 1 https://github.com/derekzhuo/geek-doc.cn.git` > 本仓库的"靶子程序",所有工具文档和 perf 案例都围绕它展开。 ## 功能 读取 `/proc/self/stat` 和 `/proc/stat` 计算自身 CPU 使用率,提供三种场景: | 场景 | 行为 | 性能特征 | |------|------|---------| | 1 | 用户态忙循环 `while(true) sum += i` | `%usr` 飙升,IPC 高 | | 2 | 内核态 syscall 风暴 `getpid()` 循环 | `%sys` 飙升,上下文切换频繁 | | 3 | 空闲 `sleep()` | 几乎 0% CPU | ## 运行 ```bash make # 编译(默认 -O0 -g,保留 perf 符号) make run # 交互式运行,选场景 1/2/3 make release # -O2 编译对比(演示优化器消除忙循环) make clean # 清理 ``` ## 用工具观察 编译运行后,用以下工具同时观察: | 工具 | 命令 | 看什么 | |------|------|--------| | top | `top -H -p $(pgrep cpu_demo)` | 进程 CPU 占用率 | | perf | `perf record -p $(pgrep cpu_demo) -g -- sleep 10` | 函数级热点 | | perf stat | `perf stat -p $(pgrep cpu_demo) -- sleep 10` | IPC、cache-miss、分支预测 | | strace | `strace -c -p $(pgrep cpu_demo)` | 系统调用频次统计 | | pidstat | `pidstat -ut 1 -p $(pgrep cpu_demo)` | 用户态/内核态拆分 | ## 关键设计说明 - **CPU 使用率按单核计算**(不乘核心数),多核机器上显示偏低是设计行为,不是 bug。 - **`-O0 -g` 是故意的**:perf 火焰图需要符号和行号。`make release` 用 `-O2` 对比展示优化器的效果。 ## 相关文档 - 工具总索引:[../../tools/](/tools/) - perf 高级使用:[perf-advanced](/concepts/tools/perf-advanced.md) - perf 案例集:[../../concepts/tools/perf-case-studies/](/concepts/tools/perf-case-studies/) > **一句话**:`cd demos/cpu-demo && make && ./cpu_demo` 选场景,然后拿 top/perf/strace/pidstat 对着它练——本仓库所有工具文档的实操都基于这个靶子。 ## 总结 cpu-demo 是全仓库工具文档共用的靶子程序,提供用户态忙循环、syscall 风暴、空闲三种 CPU 场景,配合 top、perf、strace、pidstat 即可练习从进程到函数级的完整观测流程。