$npx -y skills add chaterm/terminal-skills --skill profiling性能分析
| 1 | # 性能分析 |
| 2 | |
| 3 | ## 概述 |
| 4 | CPU/内存分析、火焰图、追踪技能。 |
| 5 | |
| 6 | ## perf 工具 |
| 7 | |
| 8 | ### 基础命令 |
| 9 | ```bash |
| 10 | # 安装 |
| 11 | apt install linux-tools-common linux-tools-$(uname -r) |
| 12 | |
| 13 | # CPU 采样 |
| 14 | perf record -g -p PID |
| 15 | perf record -g -a -- sleep 30 |
| 16 | |
| 17 | # 查看报告 |
| 18 | perf report |
| 19 | perf report --stdio |
| 20 | |
| 21 | # 实时统计 |
| 22 | perf top |
| 23 | perf top -p PID |
| 24 | |
| 25 | # 统计事件 |
| 26 | perf stat command |
| 27 | perf stat -p PID sleep 10 |
| 28 | ``` |
| 29 | |
| 30 | ### 常用事件 |
| 31 | ```bash |
| 32 | # CPU 周期 |
| 33 | perf record -e cycles -p PID |
| 34 | |
| 35 | # 缓存未命中 |
| 36 | perf record -e cache-misses -p PID |
| 37 | |
| 38 | # 上下文切换 |
| 39 | perf record -e context-switches -p PID |
| 40 | |
| 41 | # 列出可用事件 |
| 42 | perf list |
| 43 | ``` |
| 44 | |
| 45 | ### 火焰图 |
| 46 | ```bash |
| 47 | # 采集数据 |
| 48 | perf record -F 99 -g -p PID -- sleep 30 |
| 49 | |
| 50 | # 生成火焰图 |
| 51 | perf script | stackcollapse-perf.pl | flamegraph.pl > flamegraph.svg |
| 52 | |
| 53 | # 或使用 FlameGraph 工具 |
| 54 | git clone https://github.com/brendangregg/FlameGraph |
| 55 | perf script | ./FlameGraph/stackcollapse-perf.pl | ./FlameGraph/flamegraph.pl > out.svg |
| 56 | ``` |
| 57 | |
| 58 | ## strace 追踪 |
| 59 | |
| 60 | ### 基础用法 |
| 61 | ```bash |
| 62 | # 追踪进程 |
| 63 | strace -p PID |
| 64 | |
| 65 | # 追踪命令 |
| 66 | strace command |
| 67 | |
| 68 | # 统计系统调用 |
| 69 | strace -c command |
| 70 | strace -c -p PID |
| 71 | |
| 72 | # 追踪特定调用 |
| 73 | strace -e open,read,write command |
| 74 | strace -e trace=network command |
| 75 | strace -e trace=file command |
| 76 | ``` |
| 77 | |
| 78 | ### 高级选项 |
| 79 | ```bash |
| 80 | # 显示时间戳 |
| 81 | strace -t command |
| 82 | strace -tt command # 微秒 |
| 83 | |
| 84 | # 显示耗时 |
| 85 | strace -T command |
| 86 | |
| 87 | # 跟踪子进程 |
| 88 | strace -f command |
| 89 | |
| 90 | # 输出到文件 |
| 91 | strace -o trace.log command |
| 92 | ``` |
| 93 | |
| 94 | ## ltrace 库调用 |
| 95 | |
| 96 | ```bash |
| 97 | # 追踪库调用 |
| 98 | ltrace command |
| 99 | ltrace -p PID |
| 100 | |
| 101 | # 统计 |
| 102 | ltrace -c command |
| 103 | |
| 104 | # 特定库 |
| 105 | ltrace -l libc.so.6 command |
| 106 | ``` |
| 107 | |
| 108 | ## 内存分析 |
| 109 | |
| 110 | ### valgrind |
| 111 | ```bash |
| 112 | # 内存泄漏检测 |
| 113 | valgrind --leak-check=full ./program |
| 114 | |
| 115 | # 内存错误 |
| 116 | valgrind --tool=memcheck ./program |
| 117 | |
| 118 | # 缓存分析 |
| 119 | valgrind --tool=cachegrind ./program |
| 120 | |
| 121 | # 调用图 |
| 122 | valgrind --tool=callgrind ./program |
| 123 | kcachegrind callgrind.out.* |
| 124 | ``` |
| 125 | |
| 126 | ### pmap |
| 127 | ```bash |
| 128 | # 查看进程内存映射 |
| 129 | pmap PID |
| 130 | pmap -x PID |
| 131 | |
| 132 | # 详细信息 |
| 133 | pmap -XX PID |
| 134 | ``` |
| 135 | |
| 136 | ### smem |
| 137 | ```bash |
| 138 | # 内存使用统计 |
| 139 | smem |
| 140 | smem -u # 按用户 |
| 141 | smem -p # 按进程 |
| 142 | smem -k # 人类可读 |
| 143 | ``` |
| 144 | |
| 145 | ## 系统分析 |
| 146 | |
| 147 | ### vmstat |
| 148 | ```bash |
| 149 | # 每秒刷新 |
| 150 | vmstat 1 |
| 151 | |
| 152 | # 输出说明 |
| 153 | # r: 运行队列 |
| 154 | # b: 阻塞进程 |
| 155 | # si/so: 交换 |
| 156 | # bi/bo: 块 IO |
| 157 | # us/sy/id/wa: CPU 使用 |
| 158 | ``` |
| 159 | |
| 160 | ### iostat |
| 161 | ```bash |
| 162 | # 磁盘统计 |
| 163 | iostat -x 1 |
| 164 | |
| 165 | # 输出说明 |
| 166 | # %util: 设备利用率 |
| 167 | # await: 平均等待时间 |
| 168 | # r/s, w/s: 读写 IOPS |
| 169 | ``` |
| 170 | |
| 171 | ### pidstat |
| 172 | ```bash |
| 173 | # CPU 使用 |
| 174 | pidstat -u 1 |
| 175 | |
| 176 | # 内存使用 |
| 177 | pidstat -r 1 |
| 178 | |
| 179 | # IO 使用 |
| 180 | pidstat -d 1 |
| 181 | |
| 182 | # 特定进程 |
| 183 | pidstat -p PID 1 |
| 184 | ``` |
| 185 | |
| 186 | ## 常见场景 |
| 187 | |
| 188 | ### 场景 1:CPU 热点分析 |
| 189 | ```bash |
| 190 | #!/bin/bash |
| 191 | PID=$1 |
| 192 | |
| 193 | # 采集 30 秒 |
| 194 | perf record -F 99 -g -p $PID -- sleep 30 |
| 195 | |
| 196 | # 生成报告 |
| 197 | perf report --stdio > cpu_report.txt |
| 198 | |
| 199 | # 生成火焰图 |
| 200 | perf script | stackcollapse-perf.pl | flamegraph.pl > cpu_flame.svg |
| 201 | ``` |
| 202 | |
| 203 | ### 场景 2:IO 延迟分析 |
| 204 | ```bash |
| 205 | #!/bin/bash |
| 206 | # 使用 biolatency (bcc-tools) |
| 207 | biolatency 10 1 |
| 208 | |
| 209 | # 或使用 iostat |
| 210 | iostat -x 1 10 |
| 211 | ``` |
| 212 | |
| 213 | ### 场景 3:系统调用分析 |
| 214 | ```bash |
| 215 | #!/bin/bash |
| 216 | PID=$1 |
| 217 | |
| 218 | # 统计系统调用 |
| 219 | strace -c -p $PID -o syscall_stat.txt & |
| 220 | sleep 60 |
| 221 | kill %1 |
| 222 | |
| 223 | cat syscall_stat.txt |
| 224 | ``` |
| 225 | |
| 226 | ## 工具对比 |
| 227 | |
| 228 | | 工具 | 用途 | 开销 | |
| 229 | |------|------|------| |
| 230 | | perf | CPU 分析 | 低 | |
| 231 | | strace | 系统调用 | 高 | |
| 232 | | valgrind | 内存分析 | 很高 | |
| 233 | | pidstat | 进程统计 | 低 | |
| 234 | |
| 235 | ## 故障排查 |
| 236 | |
| 237 | ```bash |
| 238 | # perf 权限问题 |
| 239 | echo 0 > /proc/sys/kernel/perf_event_paranoid |
| 240 | |
| 241 | # 符号缺失 |
| 242 | apt install linux-tools-$(uname -r)-dbgsym |
| 243 | |
| 244 | # strace 附加失败 |
| 245 | echo 0 > /proc/sys/kernel/yama/ptrace_scope |
| 246 | ``` |