trace-cmd 和 kernelshark 介绍及使用方法
一、工具概述
1.1 trace-cmd
trace-cmd 是 Linux ftrace 系统的命令行前端工具 ,它封装了 /sys/kernel/debug/tracing 的复杂操作,提供了更简洁、易用的命令行接口。通过 trace-cmd,用户无需手动操作 sysfs 文件,即可完成跟踪配置、数据采集、报告生成等操作。
核心特点:
- 简化 ftrace 配置流程
- 支持多种输出格式(文本、二进制、HTML)
- 可录制和回放跟踪数据
- 支持事件过滤、函数过滤
- 与 kernelshark 无缝集成
1.2 kernelshark
kernelshark 是 trace-cmd 的图形化前端,基于 Qt 框架开发,专门用于可视化分析 trace-cmd 录制的跟踪数据。它提供了时间线视图、CPU 视图、任务视图等多种可视化方式,便于分析系统行为、性能瓶颈和调度问题。
核心特点:
- 图形化时间线界面
- 支持多维度数据可视化
- 事件过滤和搜索功能
- 支持缩放、平移等交互操作
- 与 trace-cmd 数据格式完全兼容
二、安装方法
2.1 Ubuntu/Debian
bash
# 安装 trace-cmd
sudo apt install trace-cmd
# 安装 kernelshark
sudo apt install kernelshark
2.2 RHEL/CentOS
bash
# 启用 EPEL 仓库
sudo yum install epel-release
# 安装
sudo yum install trace-cmd kernelshark
2.3 Arch Linux
bash
sudo pacman -S trace-cmd kernelshark
2.4 源码编译
bash
# 从官方仓库获取源码
git clone git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/trace-cmd.git
cd trace-cmd
make
sudo make install
# kernelshark 在 trace-cmd 源码的 kernelshark 目录
cd kernelshark
make
sudo make install
三、trace-cmd 核心命令
3.1 基本命令结构
bash
trace-cmd [子命令] [选项] [参数]
3.2 常用子命令速查表
| 子命令 | 功能 | 示例 |
|---|---|---|
record |
录制跟踪数据 | trace-cmd record -e sched_switch |
report |
解析跟踪数据 | trace-cmd report trace.dat |
start |
后台录制 | trace-cmd start -e sched_switch |
stop |
停止录制 | trace-cmd stop |
extract |
提取跟踪数据 | trace-cmd extract |
list |
列出可用事件 | trace-cmd list -e |
stat |
显示统计信息 | trace-cmd stat |
show |
显示缓冲区信息 | trace-cmd show |
reset |
重置跟踪器 | trace-cmd reset |
四、trace-cmd 实战示例
4.1 基本录制示例
录制所有事件(不推荐,数据量大):
bash
# 录制所有事件到 trace.dat
trace-cmd record -e all
# 执行操作后按 Ctrl+C 停止
录制特定事件类别:
bash
# 只录制调度事件
trace-cmd record -e sched
# 录制多个事件类别
trace-cmd record -e sched -e kmem -e irq
# 录制特定事件
trace-cmd record -e sched:sched_switch -e sched:sched_wakeup
录制时执行命令:
bash
# 录制 ls 命令的执行过程
trace-cmd record -e sched ls -la
# 录制后台进程
trace-cmd record -e sched sleep 5 &
4.2 高级过滤选项
按进程过滤:
bash
# 只录制特定进程
trace-cmd record -e sched -P 1234 # 按PID
trace-cmd record -e sched -p bash # 按进程名
按函数过滤:
bash
# 只跟踪特定函数
trace-cmd record -l vfs_read -l ext4_file_read_iter
事件过滤器:
bash
# 只录制特定条件的调度切换
trace-cmd record -e sched:sched_switch \
-f 'prev_comm == "bash" || next_comm == "bash"'
# 只录制大内存分配
trace-cmd record -e kmem:kmalloc \
-f 'bytes_alloc > 4096'
4.3 输出控制选项
指定输出文件:
bash
# 指定输出文件名
trace-cmd record -o mytrace.dat -e sched
# 指定输出格式(默认二进制)
trace-cmd record -e sched -O text # 文本格式
trace-cmd record -e sched -O html # HTML格式
缓冲区设置:
bash
# 设置缓冲区大小
trace-cmd record -e sched -b 4096 # 4MB缓冲区
# 设置CPU缓冲区数量
trace-cmd record -e sched -B 2 # 每个CPU 2个缓冲区
后台录制模式:
bash
# 启动后台录制
trace-cmd start -e sched -o background.dat
# 执行操作...
# 停止录制
trace-cmd stop
# 查看状态
trace-cmd show
4.4 数据解析与报告
解析二进制数据:
bash
# 基本解析
trace-cmd report trace.dat | head -20
# 解析并保存到文件
trace-cmd report trace.dat > report.txt
# 只显示特定事件
trace-cmd report trace.dat -e sched:sched_switch
# 使用过滤器
trace-cmd report trace.dat -f 'prev_comm == "bash"'
# 显示调用栈
trace-cmd report trace.dat --stack
# 显示时间戳
trace-cmd report trace.dat --ts
# 显示CPU信息
trace-cmd report trace.dat --cpu
统计信息:
bash
# 显示事件统计
trace-cmd report trace.dat --stat
# 显示函数统计
trace-cmd report trace.dat --func-stats
# 显示延迟统计
trace-cmd report trace.dat --latency
提取特定数据:
bash
# 提取跟踪数据到当前目录
trace-cmd extract trace.dat
# 提取特定事件
trace-cmd extract trace.dat -e sched:sched_switch
4.5 系统信息查询
列出可用事件:
bash
# 列出所有事件
trace-cmd list -e
# 列出特定类别事件
trace-cmd list -e sched
trace-cmd list -e kmem
# 列出系统调用事件
trace-cmd list -e syscalls
# 列出函数
trace-cmd list -f | head -20
显示系统状态:
bash
# 显示当前跟踪器状态
trace-cmd show
# 显示缓冲区信息
trace-cmd show -b
# 显示事件状态
trace-cmd show -e
五、kernelshark 使用指南
5.1 基本启动与加载
启动 kernelshark:
bash
# 直接启动
kernelshark
# 启动并加载数据文件
kernelshark trace.dat
# 启动并指定配置文件
kernelshark -c ~/.kernelsharkrc
图形界面主要区域:
- 时间线视图:水平时间轴,显示事件分布
- CPU 视图:按 CPU 核显示事件
- 任务视图:按进程/任务显示事件
- 事件列表:显示选中区域的事件详情
- 工具栏:缩放、过滤、搜索等操作
5.2 数据加载与保存
加载数据文件:
- 菜单:File → Open
- 快捷键:Ctrl+O
- 支持格式:trace.dat(二进制)、文本格式
保存当前视图:
- 菜单:File → Save
- 快捷键:Ctrl+S
- 可保存为图像(PNG/SVG)或数据文件
导出数据:
- 菜单:File → Export
- 可导出选中区域的事件列表
5.3 视图操作
缩放操作:
- 放大:鼠标滚轮向上 / 工具栏放大按钮 / 快捷键 +
- 缩小:鼠标滚轮向下 / 工具栏缩小按钮 / 快捷键 -
- 适应窗口:双击时间轴 / 工具栏适应按钮 / 快捷键 A
平移操作:
- 按住鼠标左键拖动时间轴
- 使用水平滚动条
多视图同步:
- CPU 视图、任务视图、时间线视图可同步滚动
- 在 View 菜单中可配置同步选项
5.4 事件过滤与搜索
快速过滤:
- 在搜索框输入关键词(如进程名、事件名)
- 按 Enter 应用过滤
高级过滤:
- 菜单:Filter → Advanced Filter
- 可设置多条件组合过滤
- 支持正则表达式
搜索功能:
- 菜单:Search → Find
- 快捷键:Ctrl+F
- 可搜索事件内容、进程名等
重置过滤:
- 菜单:Filter → Reset All Filters
- 工具栏重置按钮
5.5 数据分析功能
查看事件详情:
- 单击时间线上的事件,在下方详情面板显示
- 双击事件可查看完整字段信息
时间测量:
- 按住 Shift 键,在时间线上拖动选择区域
- 状态栏显示选中区域的时间跨度
- 可测量两个事件之间的时间差
统计视图:
- 菜单:View → Statistics
- 显示当前视图的事件统计信息
- 可按事件类型、进程等维度统计
标记功能:
- 在时间线上添加标记(快捷键 M)
- 用于标记关键事件点
- 可添加多个标记进行对比
5.6 常用快捷键
| 快捷键 | 功能 |
|---|---|
| Ctrl+O | 打开文件 |
| Ctrl+S | 保存 |
| Ctrl+F | 搜索 |
| + / - | 放大/缩小 |
| A | 适应窗口 |
| M | 添加标记 |
| Ctrl+Z | 撤销 |
| Ctrl+Y | 重做 |
| 空格 | 暂停/继续播放(录制模式) |
六、综合实战案例
案例1:分析进程调度延迟
步骤1:录制数据
bash
# 录制调度事件
trace-cmd record -e sched:sched_switch -e sched:sched_wakeup \
-o sched_trace.dat sleep 5
步骤2:使用 kernelshark 分析
bash
# 启动图形界面
kernelshark sched_trace.dat
分析操作:
- 在 kernelshark 中加载文件
- 在任务视图中找到目标进程
- 查看进程的调度时间线
- 使用标记功能测量唤醒延迟
- 查看事件详情中的时间戳
步骤3:命令行分析(可选)
bash
# 生成文本报告
trace-cmd report sched_trace.dat -e sched:sched_switch \
-f 'prev_comm == "bash"' > bash_sched.txt
案例2:分析内存分配问题
步骤1:录制内存事件
bash
# 录制大内存分配
trace-cmd record -e kmem:kmalloc -e kmem:kfree \
-f 'bytes_alloc > 4096' -o mem_trace.dat \
dd if=/dev/zero of=/tmp/test bs=1M count=10
步骤2:图形化分析
bash
kernelshark mem_trace.dat
分析要点:
- 查看 kmalloc 和 kfree 的配对情况
- 使用过滤器只显示未释放的分配
- 查看调用栈信息(如果录制时启用了)
步骤3:统计分析
bash
# 统计内存分配次数
trace-cmd report mem_trace.dat --stat
# 按大小统计
trace-cmd report mem_trace.dat -e kmem:kmalloc \
| awk '/bytes_alloc/ {print $NF}' | sort -n | uniq -c
案例3:分析网络性能问题
步骤1:录制网络事件
bash
# 录制网络接收和发送
trace-cmd record -e net:netif_receive_skb -e net:net_dev_xmit \
-o net_trace.dat \
iperf3 -c server -t 10
步骤2:kernelshark 分析
bash
kernelshark net_trace.dat
分析操作:
- 在 CPU 视图中查看网络中断分布
- 在时间线视图中查看包处理延迟
- 使用过滤器只显示特定协议或端口
- 查看 skb 释放事件,分析丢包情况
步骤3:命令行快速检查
bash
# 检查丢包事件
trace-cmd report net_trace.dat -e skb:kfree_skb | head -10
案例4:生产环境监控脚本
bash
#!/bin/bash
# 生产环境监控脚本
TRACE_FILE="/tmp/monitor_$(date +%s).dat"
DURATION=300 # 5分钟
# 录制调度和内存事件
trace-cmd record -e sched:sched_switch -e kmem:kmalloc \
-f 'bytes_alloc > 4096' -o $TRACE_FILE \
sleep $DURATION
# 生成报告
REPORT_FILE="/tmp/report_$(date +%s).txt"
trace-cmd report $TRACE_FILE --stat > $REPORT_FILE
# 检查是否有异常
if grep -q "latency" $REPORT_FILE; then
echo "发现延迟问题,请检查详细报告"
# 可发送邮件或告警
fi
# 保留数据文件(可选)
# mv $TRACE_FILE /var/log/traces/
七、高级技巧与最佳实践
7.1 性能优化建议
减少数据量:
- 使用精确的事件过滤
- 避免录制所有事件
- 设置合理的缓冲区大小
- 控制录制时间
降低开销:
- 生产环境使用事件而非跟踪器
- 避免启用调用栈记录(除非必要)
- 使用后台录制模式时注意资源占用
数据管理:
- 定期清理旧的跟踪文件
- 压缩存储历史数据
- 使用实例隔离多任务跟踪
7.2 常见问题排查
权限问题:
bash
# 需要 root 权限或 debugfs 权限
sudo trace-cmd record -e sched
# 或添加用户到 debug 组
sudo usermod -aG debug $USER
缓冲区满:
bash
# 增加缓冲区大小
trace-cmd record -e sched -b 8192
# 或减少录制时间
事件不可用:
bash
# 检查事件是否支持
trace-cmd list -e | grep sched_switch
# 检查内核配置
cat /boot/config-$(uname -r) | grep TRACING
kernelshark 启动失败:
bash
# 检查依赖
ldd $(which kernelshark)
# 检查 Qt 版本
kernelshark --version
7.3 与其他工具集成
与 perf 结合:
bash
# 使用 perf 录制,用 kernelshark 分析
perf record -e sched:sched_switch -a sleep 5
perf script > perf.data
# 需要转换格式或使用其他工具
# 或直接使用 trace-cmd 录制
与 bpftrace 结合:
bash
# bpftrace 可输出到 trace-cmd 兼容格式
bpftrace -e 'tracepoint:sched:sched_switch { printf("%s\n", args->prev_comm); }'
与 systemtap 结合:
bash
# systemtap 可生成跟踪数据
stap -e 'probe kernel.function("vfs_read") { printf("vfs_read\n"); }'
八、总结对比
| 维度 | trace-cmd | kernelshark |
|---|---|---|
| 界面 | 命令行 | 图形化 |
| 使用场景 | 数据采集、快速分析 | 深度分析、可视化 |
| 学习曲线 | 中等 | 较平缓 |
| 功能特点 | 录制、解析、过滤 | 可视化、交互分析 |
| 性能开销 | 低(命令行) | 中等(图形界面) |
| 输出格式 | 文本、二进制 | 图形、图像 |
| 适合用户 | 开发者、运维 | 性能分析师、开发者 |
推荐工作流:
- 数据采集:使用 trace-cmd record 录制数据
- 初步分析:使用 trace-cmd report 快速检查
- 深度分析:使用 kernelshark 可视化分析
- 报告生成:结合两者生成最终报告
九、常用命令速查
trace-cmd 常用命令
bash
# 录制
trace-cmd record -e sched:sched_switch -o trace.dat
trace-cmd record -e kmem:kmalloc -f 'bytes_alloc > 4096'
trace-cmd record -e sched -P 1234
# 解析
trace-cmd report trace.dat
trace-cmd report trace.dat -e sched:sched_switch
trace-cmd report trace.dat --stat
# 管理
trace-cmd list -e
trace-cmd show
trace-cmd reset
# 后台模式
trace-cmd start -e sched
trace-cmd stop
kernelshark 常用操作
- 打开文件:Ctrl+O
- 缩放:鼠标滚轮 / + / -
- 过滤:搜索框输入关键词
- 标记:M 键
- 测量时间:Shift+拖动
- 查看详情:单击事件
十、资源与参考
官方文档:
- trace-cmd 手册页:
man trace-cmd - kernelshark 文档:https://lwn.net/Articles/425583/
- ftrace 文档:https://www.kernel.org/doc/Documentation/trace/ftrace.txt
在线资源:
- 官方仓库:https://git.kernel.org/pub/scm/linux/kernel/git/rostedt/trace-cmd.git
- 教程和示例:https://elinux.org/Ftrace
书籍推荐:
- 《Linux Performance》
- 《Systems Performance》
实践建议:
- 在测试环境先练习
- 生产环境谨慎使用(注意性能影响)
- 结合其他工具(perf、bpftrace)使用
- 建立分析流程和文档
总结:trace-cmd 和 kernelshark 是 Linux 系统性能分析的强大组合,trace-cmd 负责数据采集,kernelshark 负责可视化分析。掌握这两个工具,可以高效定位系统性能问题、分析调度行为、排查内存问题等。建议从简单场景开始练习,逐步掌握高级功能。