简介
LTTng: (Linux Trace Toolkit Next Generation),它是用于跟踪Linux内核、应用程序以及库的系统软件包.LTTng 主要由内核模块和动态链接库(用于应用程序和动态链接库的跟踪)组成。它由一个会话守护进程控制,该守护进程接受来自命令行接口的命令。babeltrace项目允许将追踪信息翻译成用户可读的日志,并提供一个读追踪库,即libbabletrace。ceph代码中大量嵌入了tracepoint,使用lttng进行跟踪。它整合了内核和用户态跟踪,对于大量的跟踪事件流有非常高的性能,并且有一系列的分析和抓取工具。
对于目前的Linux内核来说,LTTng只不过是众多Tracing工具的一个,它制造了太多重复的工作比如Rring Buffer(内核中已经有两个Ring buffer被perf和ftrace使用),并且自己的系统调用接口(内核已经有此类的接口),增加LTTng意味着更混乱的Tracing ABI在内核中。
相比较而言,LTTng进入内核比SystemTap和utrace更困难。
lttng展示可跟踪位置
lttng跟踪必定是需要进程一直在运行状态,像mon、osd的自不必多说,如果跟踪是librbd就必须保证加载 librbd.so进程是在运行。
1 | ./rbd_example ##一直在跑 |
命令行参数
嵌入式 lttng使用详细说明:https://blog.csdn.net/skdkjzz/article/details/44564951
跟踪并获取信息
1 | mkdir -p traces ##创建存放 |
可以查看traces目录,是否有对应的记录生成
首先执行程序:
1 | ./self-ust |
然后开启跟踪:
1 | lttng-sessiond --daemonize |
3.3 查看跟踪信息
1 | babeltrace2 ~/lttng-traces/myself-lttng-ust* |
使用babeltrace读取结果
1 | babeltrace traces > result.all |
Error: Unable to list kernel events: Kernel tracer not available
1 | lttng list --kernel |
查看当前Linux系统的内核编译config文件,生成编译驱动所需的内核头文件:https://blog.csdn.net/dumgeewang/article/details/128528790
相关编译选项的核实
2.0 LTTng需要的内核配置(通过读取LTTng-module文档中的README了解):https://www.shuzhiduo.com/A/QW5YBQMedm/
1 | missing the kernel header for the 4.4.0-98-generic kernel. |
Function tracing (LTTng-UST helper)
https://lttng.org/man/3/lttng-ust-cyg-profile/v2.10/
c c++ 函数入口和出口的hook(gcc 编译选项),然后打印出函数调用关系的方法:https://www.cnblogs.com/welhzh/p/4904874.html
enter,exit函数拦截
集成到自己程序则不行
追踪规则
1) 追踪内核所有的探测点和所有的系统调用事件(-k/–kernel):
# lttng enable-event -a –k
2) 追踪探测点事件,这里我们追踪 sched_switch和sched_wakeup为例 (-k/–kernel) 。
# lttng enable-event sched_switch,sched_wakeup -k
或者追踪所有的探测点事件:
# lttng enable-event -a -k –tracepoint
3) 追踪所有的系统调用:
# lttng enable-event -a -k –syscall
4) 使用 kprobes 以及 (或) 其他追踪器作为lttng的源:
这是一个LTTng2.0内核追踪器的一个新特性,你可以使用一个动态probe作为源,probe的追踪结果会显示在lttng的追踪结果中。
# lttng enable-event aname -k –probe symbol+0x0
or
# lttng enable-event aname -k –probe 0xffff7260695
可以为probe制定一个准确的地址0xffff7260695或者 symbol+offset。
你也可以使用功能追踪(使用的Ftrace API),追踪结果也会显示在lttng的追踪结果中:
# lttng enable-event aname -k –function
5) 打开一个事件的上下文信息:
这也是一个新特性,可以让你添加一个事件的上下文信息。比如说你可以添加PID:
# lttng add-context -k -e sched_switch -t pid
你也可以使用多个上下文信息:
# lttng add-context -k -e sched_switch -t pid -t nice -t tid
你可以使用’ lttng add-context –help ‘ 学习所有的上下文格式的用法。
6) 打开事件的Perf计数器:
这也是一个新的很强大的特性,为每个追踪的事件添加Perf计数器数据(使用Perf的API)。下面实例为为每个事件添加CPU周期:
# lttng add-context -k -e sched_switch -t perf:cpu-cycles
注: 你需要使用 add-context 的help学习所有的perf计数器值的含义。
专题function追踪
官方文档的只言片语
https://lttng.org/docs/v2.13/#doc-liblttng-ust-cyg-profile
测试01:修改源码,不包含lttng任何信息
g++ -lpthread -c multi_thread.cpp
g++ -o app multi_thread.o -ldl -lpthread
测试02:案例test02
测试03:funcs
编译:g++ -o app multi_thread.o my_lttng_ele.o my_lttng_gst.o -llttng-ust -ldl -lpthread -finstrument-functions
编译:g++ -o app multi_thread.o -ldl -lpthread -finstrument-functions
运行:LD_PRELOAD=liblttng-ust-cyg-profile.so ./app
此基础上开启采集
836 lttng enable-event –userspace ‘lttng_ust_cyg_profile:func_exit’
837 lttng enable-event –userspace ‘lttng_ust_cyg_profile:func_entry’
838 lttng enable-event -a -k –syscall
未采集到
这有一篇文章展示了 大概思路:
采集MySQL trace数据:https://www.hikunpeng.com/document/detail/zh/kunpengdevkithistory/vscodehistory/2.5.5/kunpengidevscode\_10\_0350.html
调整代码循环内调用函数
添加采集字段,添加采集scehd切换信息
LD_PRELOAD=liblttng-ust-cyg-profile.so ./app
lttng create test03096
lttng enable-event –kernel sched_switch
lttng enable-event –userspace ‘lttng_ust_cyg_profile:func_exit’
lttng enable-event –userspace ‘lttng_ust_cyg_profile:func_entry’
lttng add-context –kernel –type=pid –type=tid –type=procname
lttng add-context –userspace –type=ip –type=pthread_id –type=procname
lttng start
lttng destroy
babeltrace2 ~/lttng-traces/test03096* | grep lttng_ust_cyg_profile
图形工具
数据导入
数据含义分析
Timestamp Channel CPU Event type Contents TID Prio PID Source
10:38:11.978 045 845 channel0_1 1 irq_handler_entry irq=27, name=virtio2-req.0, context.packet_seq_num=1, context.cpu_id=1 0 20
Timestamp Channel CPU Event type Contents TID Prio PID Source
10:38:11.958 232 111 channel0_1 1 x86_irq_vectors_local_timer_entry vector=236, context.packet_seq_num=1, context.cpu_id=1
不同参数和现象
项目:Test4_ak
lttng enable-event -a –k
lttng enable-event –userspace ‘provider_my:enter_app’
323 lttng add-context –kernel –type=pid –type=tid –type=procname
324 lttng add-context –userspace –type=pthread_id
项目:test03_k_syscall
lttng enable-event -a -k –syscall
lttng add-context –kernel –type=pid –type=tid –type=procname
lttng add-context –userspace –type=pthread_id
问题
关于时间区间来源:减法规则
关于关注的事件
Event 和syscall区别
Function追踪,知道具有功能,怎么用没例子
使用模拟方法gst,ele,tracepiont报异常
其他结果分析软件
[LTTng学习之旅]——Trace View初探
View and analyze the recorded events
Once you have completed the Record Linux kernel events and Record user application events tutorials, you can inspect the recorded events.
There are many tools you can use to read LTTng traces:
Babeltrace 2
A rich, flexible trace manipulation toolkit which includes a versatile command-line interface (babeltrace2(1)), a C library, and Python 3 bindings so that you can easily process or convert an LTTng trace with your own script.
The Babeltrace 2 project ships with a plugin (babeltrace2-plugin-ctf(7)) which supports the format of the traces which LTTng produces, CTF.
Trace Compass
A graphical user interface for viewing and analyzing any type of logs or traces, including those of LTTng.
LTTng analyses
An experimental project which includes many high-level analyses of LTTng kernel traces, like scheduling statistics, interrupt frequency distribution, top CPU usage, and more.
Babeltrace我没尝试,看起来像是一个命令行工具。而且是LTTng自己出品的。
我们做技术研究的,一方面要向老板汇报。可视化当然要生动明确。另一方面要技术推广。太难上手也不行。即开即用最好。
我们直接来使用第二个 Trace Compass.
Trace Compass (eclipse.org)
icon-default.png?t=M4ADhttps://www.eclipse.org/tracecompass/
打开这个网页,下载一个对于host 操作系统版本的软件。
打开软件 新建 trace工程。然后导入之前生成Trace log 的目录。
就可以看了。。。。很容易。
几招教你如何使用lttng以及log分析cpeh:https://mp.weixin.qq.com/s/FY3ibq3ncDYq8V59B8nVxw
Linux内核之Tracepoint机制:https://zhuanlan.zhihu.com/p/547477490
lttng:简单易上手的 tracef:https://zhuanlan.zhihu.com/p/506236943
lttng:自定义 tracepoint:https://zhuanlan.zhihu.com/p/509848662
其他
原理,复杂,没懂
使用LTTng链接内核和用户空间应用程序追踪:https://blog.csdn.net/longerzone/article/details/12623359
[LTTng学习之旅]——Trace 数据提取和格式转换—Babeltrace 2 C 应用程序开发
https://blog.csdn.net/kuno_y/article/details/125081883
嵌入式设备源码编译
[LTTng学习之旅]——环境搭建:https://blog.csdn.net/kuno_y/article/details/124764840
Lttng接口使用吐槽
比最差的API(ETW)更差的API(LTTng)是如何炼成的, 谈如何写一个好的接口:https://www.cnblogs.com/zkweb/p/8126303.html
尝试使用LTTng+TraceCompass分析一下进程周期偏移:https://blog.csdn.net/kuno_y/article/details/128372695
Versal ACAP AI 引擎编程环境 用户指南 (UG1076)
https://docs.xilinx.com/r/2022.1-简体中文/ug1076-ai-engine-environment/Vitis-分析器中的-FIFO-深度可视化
Zephyr Tracing 追踪调试指南
https://docs.panchip.com/pan1080dk-doc/0.5.0/04\_dev\_guides/zephyr\_tracing\_guidance.html
test02
[LTTng学习之旅]——在用户程序中简单的添加一个trace点
https://blog.csdn.net/kuno_y/article/details/124983044
使用trace compass分析ftrace
https://pkemb.com/2022/09/analyze-ftrace-with-trace-compass/
如何使用lttng检查多线程用户应用程序的调度?https://cloud.tencent.com/developer/ask/sof/1800581/answer/2449880/comments
【LTTng】lttng-gen-tp — Generate LTTng-UST tracepoint provider code
https://blog.csdn.net/kuno_y/article/details/126853032
https://lttng.org/docs/v2.13/#doc-tracing-the-linux-kernel
https://wiki.eclipse.org/Linux_Tools_Project/LTTng2/User_Guide#LTTng_Tracer
https://xy2401.com/local-doc-help.eclipse.org-2019-06.zh/org.eclipse.tracecompass.doc.user/doc/LTTng-Kernel-Analysis.html
https://xy2401.com/local-doc-help.eclipse.org-2019-06.zh/org.eclipse.tracecompass.doc.user/doc/LTTng-Tracer-Control.html
https://xy2401.com/local-doc-help.eclipse.org-2019-06.zh/org.eclipse.tracecompass.doc.user/doc/Trace-Compass-Main-Features.html#Project_Explorer_View
https://xy2401.com/local-doc-help.eclipse.org-2019-06.zh/org.eclipse.tracecompass.doc.user/doc/LTTng-Kernel-Analysis.html#Resources_View