You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求推荐可关联调用栈与发生时间的Linux进程性能分析工具

关联性能事件与调用栈时间戳的解决方案

Got it, I totally get your frustration—perf's default periodic sampling is great for frequency stats, but when you need to tie specific call stacks exactly to the timing of your event E(i), it falls short. Let's walk through a few tools and tweaks that will let you map those call stacks directly to when E(i) fires:

1. 调整perf配置,基于事件触发采样(而非周期性)

你不必局限于perf默认的周期性快照。可以配置它在事件E(i)每次触发时捕获调用栈,并附上精确时间戳。使用以下命令:

perf record -e <你的事件E(i)名称> -g -T -p <目标进程PID>
  • -e <你的事件E(i)名称>:指定perf监听的目标事件(替换为E(i)对应的tracepoint/kprobe/uprobes实际名称)
  • -g:事件触发时捕获完整调用栈
  • -T:为每个捕获的事件添加时间戳
  • -p <PID>:仅跟踪目标进程,过滤无关噪声

录制完成后,运行perf script查看输出——你会看到E(i)的每次触发记录,包含精确时间戳和对应的fx->fy->fk调用栈。

2. 使用bpftrace实现灵活的自定义关联

如果需要更灵活的数据捕获控制,bpftrace是一款强大的动态追踪工具。你可以编写简单脚本,在事件触发时精准捕获时间戳、调用栈和其他上下文信息。

这里有一个适配你需求的基础脚本:

# 将<subsystem>和<event-E(i)>替换为事件对应的tracepoint详情
tracepoint:<subsystem>:<event-E(i)> {
    # 打印精确时间戳(时:分:秒.微秒)
    time("%H:%M:%S.%f ");
    # 打印目标进程ID,确认是你关注的进程
    printf("PID: %d\n", pid);
    # 打印用户空间完整调用栈
    stack();
    printf("\n");
}

用sudo bpftrace <你的脚本文件.bt>运行——它会实时输出E(i)的每次触发记录、精确时间,以及触发时运行的fx->fy->fk调用栈。

如果E(i)是由用户空间函数触发(而非内核tracepoint),可以用uprobe替代tracepoint直接挂钩到目标函数。

3. 使用trace-cmd生成详细事件时间线

Trace-cmd是内核ftrace框架的前端工具,非常适合构建事件与调用栈对应的完整时间线。针对你的场景,使用以下命令:

trace-cmd record -p function_graph -e <你的事件E(i)名称> -P <目标进程PID>
  • -p function_graph:将调用栈捕获为图形形式,便于跟踪fx->fy->fk的执行流程
  • -e <事件>:仅过滤你关注的E(i)事件
  • -P <PID>:聚焦于目标进程

录制完成后,运行trace-cmd report查看输出——你会得到按时间排序的E(i)事件列表,每个事件都带有时间戳和触发时执行的完整调用栈。

快速提示

  • 这些工具大多需要root/sudo权限来访问内核追踪能力。
  • 确保使用E(i)的正确事件名称——可以用perf list或bpftrace -l查看可用的tracepoint。
  • 对于自定义用户空间事件,可能需要先设置uprobes(perf和bpftrace都支持该功能)。

内容的提问来源于stack exchange,提问作者Vikram Rautela

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:15:59