systemtap统计 探测linux驱动或应用程序中某个函数的执行时间
systemtap可以无损的探测。当然前提是ubuntu之类的系统默认已经开启kprobe。
直接上脚本:
#!/usr/bin/stap
global start, end
probe module("your_driver").function("your_function") {
start[tid()] = gettimeofday_ns()
}
probe module("your_driver").function("your_function").return {
end[tid()] = gettimeofday_ns()
printf("your_driver:your_function took %d ns to execute\n", end[tid()] - start[tid()])
}
使用方法:保存成xxx.stp,然后sudo stap xxx.stp ——和sh脚本用法一样
全过程在ubuntu 20.04 destop lts 上测试,只需要安装systemtap-4.9,然后就可以直接运行这个脚本了,没有其他配置。我是systemtap-4.9源码编译安装的,linux kernel版本:5.15.0-88
systemtap的安装或源码安装,都需要和kernel版本匹配,这一点非常重要。
另外:linux用户空间的函数也可以探测:
#!/usr/local/bin/stap
global ns_starts
global enable_trace = 0
probe begin{
printf("begin>>>>")
}
probe process("/data/xxx/cccc/output/zzz_write_read_buffer").library("/opt/eee/lib/x86_64-linux-gnu/libOpenCL.so.1").function("clEnqueueReadBuffer").call {
enable_trace = 1
}
probe process("/data/xxx/ccc/output/zzz_write_read_buffer").library("/opt/eee/lib/x86_64-linux-gnu/libOpenCL.so.1").function("clEnqueueReadBuffer").return {
enable_trace = 0
}
probe process("/data/xxx/ccc/output/zzz_write_read_buffer").function("MemCopy_dev").call {
if(enable_trace >= 1)
{
ns_starts = gettimeofday_ns()
}
}
probe process("/data/xxx/ccc/output/zzz_write_read_buffer").function("MemCopy_dev").return {
if(enable_trace >= 1)
{
printf("%s:%d\n", ppfunc(), gettimeofday_ns()-ns_starts)
}
}
如果你不知道函数在哪个动态库,可以试试模糊匹配,自动查找:.library("/opt/eee/lib/x86_64-linux-gnu*.so.1")
systemtap里还有其他模糊匹配的方式
批评下2024年初的国产大模型:把标题给大模型,chatgpt 3.5给出的就是上述可用脚本,国产的讯飞和百度模型,全都错误,东拉西扯。
整合下各家的算力、知识库,引入外网知识库,好好搞搞吧。