Android Linux内核模块驱动启动耗时测量工具咨询
测量Android Linux内核驱动启动耗时的方案
一、利用内核现成工具追踪
1. ftrace 函数追踪
ftrace是内核原生的追踪框架,可直接定位驱动probe/bind函数的执行耗时:
- 先挂载debugfs(若系统未默认挂载):
mount -t debugfs none /sys/kernel/debug - 切换到
function_graph追踪器(能展示函数调用树及单个函数的执行时长):echo function_graph > /sys/kernel/debug/tracing/current_tracer - 指定要追踪的目标驱动probe和bind函数(替换为你的实际函数名,多个函数用空格分隔):
echo 'drv1_probe drv1_bind drv2_probe drv2_bind ...' > /sys/kernel/debug/tracing/set_graph_function - 启动追踪:
echo 1 > /sys/kernel/debug/tracing/tracing_on - 触发驱动绑定(或重启系统)后停止追踪:
echo 0 > /sys/kernel/debug/tracing/tracing_on - 查看结果:
cat /sys/kernel/debug/tracing/trace,输出会清晰显示每个函数的调用时间、耗时,直接对应各驱动的启动开销。
若需要更高效的分析,可使用trace-cmd工具(需确保Android系统编译时包含该工具),它能简化trace数据的收集、过滤与展示。
2. perf 性能分析工具
perf可用于采样或追踪特定函数的执行耗时:
- 记录启动阶段的函数调用(驱动绑定通常由init进程触发,pid为1):
perf record -g -a -p 1 - 重启系统后停止记录,通过
perf report查看函数调用栈及各函数的耗时占比,定位目标驱动的probe/bind耗时。 - 也可直接过滤目标函数进行实时追踪:
perf trace -e 'drv1_probe','drv1_bind','drv2_probe','drv2_bind'
二、手动添加定时器KPI(工具无法满足需求时)
如果需要更精准的自定义统计,可在每个驱动的bind/probe函数中添加时间戳逻辑:
- 示例代码(以bind函数为例):
#include <linux/ktime.h> #include <linux/printk.h> static int xxx_bind(struct device *dev, struct device_driver *drv) { ktime_t start_time, end_time; s64 duration_ns; start_time = ktime_get(); // 原bind函数业务逻辑 ... end_time = ktime_get(); duration_ns = ktime_to_ns(ktime_sub(end_time, start_time)); pr_info("[%s] bind completed, took %lld ns (%lld ms)\n", __func__, duration_ns, duration_ns / 1000000); return ret; } - 对probe函数可添加相同逻辑,编译驱动模块后,启动系统查看
dmesg输出即可获取每个驱动的启动耗时。
内容的提问来源于stack exchange,提问作者StarkSpec
相关产品推荐
相关产品推荐

