TraceCompass为什么同时能解析LTTng和Perf的cft Log
- 问题的引出和现在的上下文时空
- 问题的引出
- 二者的Meta define
- 问题的进一步解释
- 当下的解答
问题的引出和现在的上下文时空
就要准备生成metadata 为我的程序。
一旦开动,就很难转向了。
所以,开始之前,有许多问题在困扰着我,其中一个是为什么LTTng的meta与perf的meta定义并不同,
lttng是compass的亲兄弟,而不是perf.
所以,开始之前,我需要将这件事搞清楚。
问题的引出
被lttng和perf抓取的cft信息,都能被 trace compass解析。
TraceCompass
LTTng的图形
下图是Lttng
### Perf 的图形
下图是Perf
说明:可以看到,二者都能正常工作。
再来看Meta
二者的Meta define
LTTng meta
here is lttng metadata defination of sched_switch
event {
name = "sched_switch";
id = 1290;
stream_id = 0;
fields := struct {
integer { size = 8; align = 8; signed = 1; encoding = UTF8; base = 10; } _prev_comm[16];
integer { size = 32; align = 8; signed = 1; encoding = none; base = 10; } _prev_tid;
integer { size = 32; align = 8; signed = 1; encoding = none; base = 10; } _prev_prio;
integer { size = 64; align = 8; signed = 1; encoding = none; base = 10; } _prev_state;
integer { size = 8; align = 8; signed = 1; encoding = UTF8; base = 10; } _next_comm[16];
integer { size = 32; align = 8; signed = 1; encoding = none; base = 10; } _next_tid;
integer { size = 32; align = 8; signed = 1; encoding = none; base = 10; } _next_prio;
};
};
Perf meta
here is perf’s metadata of sched_switch
event {
id = 3;
name = "sched:sched_switch";
stream_id = 0;
fields := struct {
integer { size = 64; align = 1; signed = false; encoding = none; base = hexadecimal; byte_order = le; } perf_ip;
integer { size = 32; align = 1; signed = true; encoding = none; base = decimal; byte_order = le; } perf_tid;
integer { size = 32; align = 1; signed = true; encoding = none; base = decimal; byte_order = le; } perf_pid;
integer { size = 64; align = 1; signed = false; encoding = none; base = decimal; byte_order = le; } perf_id;
integer { size = 64; align = 1; signed = false; encoding = none; base = decimal; byte_order = le; } perf_period;
integer { size = 64; align = 1; signed = false; encoding = none; base = decimal; byte_order = le; } perf_data_src;
integer { size = 32; align = 1; signed = false; encoding = none; base = decimal; byte_order = le; } perf_callchain_size;
integer { size = 64; align = 1; signed = false; encoding = none; base = hexadecimal; byte_order = le; } perf_callchain[perf_callchain_size];
integer { size = 32; align = 1; signed = false; encoding = none; base = decimal; byte_order = le; } common_type;
integer { size = 32; align = 1; signed = false; encoding = none; base = decimal; byte_order = le; } common_flags;
integer { size = 32; align = 1; signed = false; encoding = none; base = decimal; byte_order = le; } common_preempt_count;
integer { size = 32; align = 1; signed = true; encoding = none; base = decimal; byte_order = le; } common_pid;
integer { size = 32; align = 1; signed = false; encoding = none; base = decimal; byte_order = le; } common_migrate_disable;
integer { size = 32; align = 1; signed = false; encoding = none; base = decimal; byte_order = le; } common_padding;
string { encoding = UTF8; } prev_comm;
integer { size = 32; align = 1; signed = true; encoding = none; base = decimal; byte_order = le; } prev_pid;
integer { size = 32; align = 1; signed = true; encoding = none; base = decimal; byte_order = le; } prev_prio;
integer { size = 64; align = 1; signed = true; encoding = none; base = decimal; byte_order = le; } prev_state;
string { encoding = UTF8; } next_comm;
integer { size = 32; align = 1; signed = true; encoding = none; base = decimal; byte_order = le; } next_pid;
integer { size = 32; align = 1; signed = true; encoding = none; base = decimal; byte_order = le; } next_prio;
} align(8);
};
问题的进一步解释
注意上图的右角的可视化部分,即两种ctf文件,因为不同的meta都能绘制出图形。
所以,本文的标题的主语是TraceCompass,
而不是Perf或LTTng。
因为这些图形,是TraceCompass根据几个内嵌的事件,而实现的。
“sched:sched_switch”;
“sched:sched_waking”;
“sched:sched_process_exit”;
“sched:sched_process_fork”;
这些事件能被抓到,是因为kernel,提供了这些probe.
lttng的meta中这些内定的事件,为如下名字: