精读笔记(RHCA 英文教材)· RH442 Chapter 6 Analyzing Performance Using System Tracing Tools
精读笔记(RHCA 英文教材)· RH442 Chapter 6 Analyzing Performance Using System Tracing Tools
教材原文:RHCA 官方英文教材(PDF 第 194~249 页)(OCR 整书版已从本站移除,本页为章节精读) 关联中文笔记:
02-09-性能调优RH442(RHCA).md(系统追踪 strace/perf…);本章=四类追踪工具:perf(硬件/软件事件计数采样)→ strace(系统/库调用)→ SystemTap(内核探针)→ eBPF/BCC(内核虚拟机前端工具)。 结构:4 个 Section(perf+GE tracing-profile;strace+GE tracing-call;SystemTap+GE tracing-diagnose;eBPF 工具+GE tracing-debug)+ Lab(lab: tracing-review)。
Chapter Goal / Objectives(原文+译)
- GOAL: Diagnose system and application performance issues.(诊断系统与应用性能问题。)
- OBJECTIVES: ① 用 perf 剖析系统事件与性能计数器;② 追踪进程的系统/库调用;③ 用 SystemTap 采集特定诊断数据;④ 用 eBPF 工具调试应用。
6.1 Profiling with Performance Counters(perf)
- PCL(Performance Counters for Linux):内核子系统,提供采集/分析性能数据的框架;PERF 是其用户态工具套件。性能事件=某条件发生(CPU 完成一批指令、应用缺页…),由 CPU/内核性能计数器统计。
- 安装与符号:
yum install perf;跨机分析要装kernel-debuginfo-<版本>(与 uname -r 匹配),否则只有地址没有符号。 - 常用子命令:
perf list(本机可用事件)、perf stat(总体统计)、perf record(采样存 perf.data)、perf report(读 perf.data 出报告)、perf archive(打包供别机分析);perf help/perf --help <cmd>。 - 事件类型:Hardware event(cycles/instructions/cache-references/cache-misses/branch-misses…);Software event(cpu-clock/task-clock/page-faults/context-switches/cpu-migrations…)。
- perf stat:
perf stat dd if=/dev/zero of=/dev/null bs=2048 count=10000000(看 task-clock/context-switches/cpu-migrations/page-faults/cycles/instructions/insn per cycle/branches/branch-misses %)。 - 指定事件+全系统:
perf stat -e cycles,instructions,cache-references,cache-misses,bus-cycles -a sleep 10。 - perf record/report:默认 4000 样本/秒;
perf record -e cpu-clock,instructions,cache-misses,context-switches <cmd>→perf report --stdio(Overhead/Command/Shared Object/Symbol;[k]=内核、[.] =用户态);systemd 10 秒全系统:perf record -e context-switches -a sleep 10。 - GE tracing-profile:对比 cache-test/cache-test2 等程序(perf stat/record/report),分析 cache-misses 差异,装 debuginfo 后看符号级热函数。
6.2 Tracing System and Library Calls(strace)
- 系统调用 vs 库调用:程序调内核提供的函数=系统调用(时间花在内核);调库提供的函数=库调用(时间花在用户态;库可抽象系统调用以便跨 OS 移植)。
- strace 用法:
strace uname:跟新程序(逐行显示 execve/open/mmap…)。strace -p <PID>:追踪已运行进程。strace -c <cmd>:只出汇总(%time、usecs/call、calls、syscall)→ 找最慢(usecs/call 最高)与调用最多(calls 最高)的系统调用。strace -f:跟随 fork() 子进程(默认不跟);-e <syscall>只看指定类型(如-e open -c)。- 用途:进程因锁/IO 争用阻塞时,阻塞点所在系统调用会显示在终端——快速定位瓶颈。
- GE tracing-call:
strace -c updatedb找出最慢(write, 711 µs/call)与最常用(lstat, 12651 次)系统调用。
6.3 Gathering Diagnostic Data Using SystemTap
- SystemTap:动态分析运行内核的追踪/探针工具,用内核 kprobes 在指定点挂探针。脚本核心="给事件命名+写 handler":事件发生(进/出函数、定时器、会话启停)时内核跑 handler 再恢复。
- 安装:
yum install systemtap(含编译链依赖);再stap-prep自动装匹配内核的 kernel-debuginfo(需启用 baseos-debug 源)。手动装要保证 kernel/headers/devel/debuginfo 版本与uname -r一致。 - 运行:
stap -v /usr/share/systemtap/examples/process/syscalls_by_proc.stp(Pass 1~5:解析→分析→编译 C→生成 .ko→运行;Ctrl+C 出结果)。 - 编译分发:
stap -p 4 -m syscalls_by_proc <脚本>产出命名 .ko(只对同版本内核可用);放到/lib/modules/$(uname -r)/systemtap/后,stapusr 组成员可用staprun <模块名>运行(不能编译)。 - 用户组:
stapdev(可写并加载 root 级特权模块,可用 stap/staprun);stapusr(只能用 staprun 跑管理员分发的低特权模块,通常限于操作自己进程)。 - 目标机(只跑模块):装
systemtap-runtime,把 .ko 放到正确内核目录后 staprun 即可。 - 学习资源:示例脚本
/usr/share/systemtap/examples/(含 HTML 索引:para-callgraph、varwatch、whythefail、netfilter 汇总、cycle_thief 等);Beginners Guide 与 Tapset Reference 在 systemtap-client 文档目录。 - GE tracing-diagnose:stap 脚本/示例探测目标系统收集诊断数据(如每进程系统调用、函数调用图),定位性能根因。
6.4 Tracing System Events with eBPF Tools
- eBPF(Extended Berkeley Packet Filter):内核内受限沙箱虚拟机,跑自己字节码;从用户态启用、限制内存与设备访问;把程序挂到 kprobes/tracepoints/perf events 等内核点,做动态/静态追踪与剖析。原用于包捕获,现扩展到通用内核观测。
- BCC(BPF Compiler Collection):最流行的 BPF 追踪前端;提供预编译工具,免手写 eBPF。安装:
yum install bcc-tools(AppStream);工具在/usr/share/bcc/tools/,示例文档/usr/share/bcc/tools/doc/,man 页 100+(man bcc-<工具>)。 - 常用工具速记(本教材出现的):
execsnoop:追踪新进程(execve 调用,含父进程/返回/参数)。opensnoop:全系统 open() 追踪(PID/FD/ERR/PATH;找启动期读的配置/日志文件,ERR=2 ENOENT 即文件不存在)。xfsslower:XFS 慢于 10ms 阈值的读/写/打开/fsync(TIME/COMM/PID/T=读写打开 fsync/BYTES/OFF_KB/LAT(ms)/FILENAME;VFS 层延迟比块设备层更贴应用感知)。biosnoop:块设备层 I/O 一行一条(DISK/SECTOR/BYTES/LAT)。cachestat:页缓存每秒汇总(TOTAL/MISSES/HITS/DIR TIES/BUFFERS_MB/CACHED_MB)——负载刻画。gethostlatency:getaddrinfo()/gethostbyname() 主机名解析延迟(LATms/HOST)。- 其他:vfscount/vfsstat、dcstat、biolatency、fileslower、memleak 等。
- GE tracing-debug:用 bcc 工具(xfsslower/biosnoop/cachestat/gethostlatency 等)在 servera 上复现并诊断 XFS 慢 I/O/缓存命中问题。
Lab 概要(lab: tracing-review)
综合用 perf/strace/SystemTap/BCC 中多类工具对目标负载做诊断(如记录 perf 数据、strace 找热点调用、跑 xfsslower 找慢 I/O),输出结论 → lab grade tracing-review。
命令速查表
| 用途 | 命令 | | perf 事件/统计 | perf list;perf stat [-e <ev1,ev2> -a] <cmd\|sleep 10> | | 采样与报告 | perf record -e <ev> <cmd>;perf report --stdio;perf archive | | 追踪调用 | strace [-f\|-e open\|-p <pid>] <cmd>;strace -c <cmd>(汇总) | | SystemTap 安装/运行 | yum install systemtap;stap-prep;stap -v <脚本.stp> | | 分发/受限运行 | stap -p 4 -m <名> <脚本> → 放 /lib/modules/$(uname -r)/systemtap/ → staprun <名>(stapusr) | | BCC | yum install bcc-tools;/usr/share/bcc/tools/{execsnoop,opensnoop,xfsslower,biosnoop,cachestat,gethostlatency} | | 实验/评分 | lab start tracing-profile\|tracing-call\|tracing-diagnose\|tracing-debug\|tracing-review;lab grade tracing-review |
词汇表
| 英文 | 中文 | 速记 |
|---|---|---|
| PCL / PERF | 性能计数器子系统/工具 | 硬件+软件事件 |
| perf stat/record/report | 统计/采样/报告 | perf.data 复盘 |
| event / counter | 事件/计数器 | instructions、cache-misses、cs… |
| debuginfo | 调试符号包 | kernel-debuginfo 与内核版本匹配 |
| system call vs library call | 系统调用/库调用 | 内核里 vs 库(用户态) |
| strace -c / -p / -f | 追踪参数 | 汇总/跟现有进程/跟子进程 |
| kprobes | 内核探针 | SystemTap 挂点机制 |
| SystemTap / stap / staprun | 探针工具链 | 事件+handler;编译 .ko |
| stapdev / stapusr | 权限组 | dev 可编译 root 级;usr 只能跑分发模块 |
| eBPF | 内核 BPF 虚拟机 | 沙箱字节码挂 kprobes/tracepoints |
| BCC / bcc-tools | BPF 前端集合 | 现成工具在 /usr/share/bcc/tools |
| xfsslower / biosnoop / cachestat | 各类追踪工具 | FS 慢 I/O/块 I/O/页缓存 |
自测 10 题
- perf 默认采样频率?(4000 样本/秒)
- perf stat 里 insn per cycle 低说明什么?(每周期完成指令少,可能停顿/内存慢)
- 跨机分析 perf 数据需要什么?(同版本 kernel-debuginfo)
- strace -c 的用处?(汇总:找最慢 usecs/call 与最多 calls 的系统调用)
- strace 默认跟子进程吗?(不,-f 才跟)
- SystemTap 探针基于内核什么设施?(kprobes)
- stap-prep 干什么?(自动装匹配运行内核的 headers/debuginfo)
- stapusr 组能干什么?(只能 staprun 跑管理员编译分发好的 .ko)
- eBPF 是什么?(内核受限沙箱 VM,程序挂 kprobes/tracepoints/perf events)
- 找出 XFS 慢 I/O 用什么 BCC 工具?(xfsslower;块设备层用 biosnoop;页缓存看 cachestat)
