trace-cmd 和 kernelshark 介绍及使用方法

trace-cmd 和 kernelshark 介绍及使用方法

一、工具概述

1.1 trace-cmd

trace-cmd 是 Linux ftrace 系统的命令行前端工具 ,它封装了 /sys/kernel/debug/tracing 的复杂操作,提供了更简洁、易用的命令行接口。通过 trace-cmd,用户无需手动操作 sysfs 文件,即可完成跟踪配置、数据采集、报告生成等操作。

核心特点

  • 简化 ftrace 配置流程
  • 支持多种输出格式(文本、二进制、HTML)
  • 可录制和回放跟踪数据
  • 支持事件过滤、函数过滤
  • 与 kernelshark 无缝集成

1.2 kernelshark

kernelsharktrace-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

分析操作

  1. 在 kernelshark 中加载文件
  2. 在任务视图中找到目标进程
  3. 查看进程的调度时间线
  4. 使用标记功能测量唤醒延迟
  5. 查看事件详情中的时间戳

步骤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

分析操作

  1. 在 CPU 视图中查看网络中断分布
  2. 在时间线视图中查看包处理延迟
  3. 使用过滤器只显示特定协议或端口
  4. 查看 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
界面 命令行 图形化
使用场景 数据采集、快速分析 深度分析、可视化
学习曲线 中等 较平缓
功能特点 录制、解析、过滤 可视化、交互分析
性能开销 低(命令行) 中等(图形界面)
输出格式 文本、二进制 图形、图像
适合用户 开发者、运维 性能分析师、开发者

推荐工作流

  1. 数据采集:使用 trace-cmd record 录制数据
  2. 初步分析:使用 trace-cmd report 快速检查
  3. 深度分析:使用 kernelshark 可视化分析
  4. 报告生成:结合两者生成最终报告

九、常用命令速查

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+拖动
  • 查看详情:单击事件

十、资源与参考

官方文档

在线资源

书籍推荐

  • 《Linux Performance》
  • 《Systems Performance》

实践建议

  • 在测试环境先练习
  • 生产环境谨慎使用(注意性能影响)
  • 结合其他工具(perf、bpftrace)使用
  • 建立分析流程和文档

总结:trace-cmd 和 kernelshark 是 Linux 系统性能分析的强大组合,trace-cmd 负责数据采集,kernelshark 负责可视化分析。掌握这两个工具,可以高效定位系统性能问题、分析调度行为、排查内存问题等。建议从简单场景开始练习,逐步掌握高级功能。

相关推荐
JiMoKuangXiangQu1 个月前
Linux 调度延迟案例 (1):ALSA 播放 XRUN
linux·trace-cmd·xrun·调度延迟
hillstream31 年前
KernelShark在ubuntu24.04.01的编译
linux·kernelshark
CodingCos2 年前
【ARM Coresight 系列文章 22 -- linux frace 与 trace-cmd】
ftrace·trace-cmd