• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# ___概述TraceStreamer生成的数据库___
2```
3  TraceStreamer虽然对外提供了各种各样的使用方式,但核心的业务仍是将trace数据源转化为易于理解和使用的数据库。用户可以通过SmartPerf界面直观的研究系统跟踪数据,也可在理解TraceStreamer生成的数据库的基础上,在TraceStreamer的交互模式或者Smartperf的数据库查询模式下,使用SQL查询语句自由组装查看用户关心的数据。 下文将对TraceStreamer生成的数据库进行详细描述,给用户使用SQL查询系统跟踪数据提供帮助。
4```
5
6## ___TraceStreamer输出数据库包含以下表格___
7* trace_range : 记录ftrace数据与其他类型数据的时间交集,供前端展示数据时使用。
8* process : 记录进程信息。
9* thread : 记录线程信息。
10* thread_state : 记录线程状态信息。
11* instant : 记录Sched_waking, sched_wakeup事件, 用作ThreadState表的上下文使用。
12* raw : 此数据结构主要作为ThreadState的上下文使用,这张表是sched_waking,sched_wakup, cpu_idle事件的原始记录。
13* callstack : 记录调用堆栈和异步调用,其中depth,stack_id和parent_stack_id仅在非异步调用中有效。当cookid不为空时,为异步调用,此时callid为进程唯一号,否则为线程唯一号。
14* irq : 记录中断相关事件。
15* measure : 记录所有的计量值。
16* log : 记录hilog打印日志数据。
17* heap : 记录堆内存申请与释放相关的数据。
18* heap_frame : 记录堆内存申请与释放相关的调用栈。
19* hidump : 记录FPS(Frame Per Second)数据。
20* symbols : 记录系统调用名称和其函数指针的对应关系,trace中用addr来映射function_name来节省存储空间
21* syscall : 记录用户空间函数与内核空间函数相互调用记录
22* args : 记录方法参数集合
23* sys_event_filter : 记录所有的filter
24* clk_event_filter : 记录时钟事件
25* cpu_measure_filter : cpu事件过滤器表。
26* measure_filter : 记录一个递增的filterid队列,所有其他的filter类型在获取过程中,均从此数据列表中获取下一个可用的filter_id并做记录。
27* process_measure_filter : 将进程ID作为key1,进程的内存,界面刷新,屏幕亮度等信息作为key2,唯一确定一个filter_id
28* data_type : 记录数据类型和typeId的关联关系。
29* data_dict : 记录常用的字符串,将字符串和索引关联,降低程序运行的内存占用,用作辅助数据。
30* meta : 记录执行解析操作相关的基本信息。
31
32## ___表格关系图___
33
34### 进程表与线程表关系图:
35![GitHub Logo](../figures/process_thread.png)
36### 描述:
37当一个进程或者线程结束后,系统可能再次将该进程号或者线程号分配给其他进程或者线程,造成一个进程号或线程号代表多个进程或线程的情况。
38Process和Thread表中的id字段可以唯一标识进程和线程。process表中的id在其他表中用作ipid字段。thread表中的id在其他表中用作itid字段。
39thread表通过ipid字段关联process表的id字段,可以查询线程归属进程。
40### 举例:
41已知pid = 123,查看当前进程下的所有线程信息,可以使用如下SQL语句:
42select thread.* from thread, process where process.pid = 123 and thread.ipid = process.id
43
44### 线程表与线程运行状态表关系图
45![GitHub Logo](../figures/thread_state.png)
46### 描述:
47thread_state表记录所有线程的运行状态信息,包含ts(状态起始时间),dur(状态持续时间),cpu, itid, state(线程状态)。 thread表的id字段与thread_state表的itid字段相关联。
48### 举例:
49已知tid = 123, 查看当前线程的所有运行状态信息,可以使用如下SQL语句:
50select thread_state.* from thread, thread_state where thread.tid = 123 and thread.id = thread_state.itid
51
52### 堆内存数据变化表关系图
53![GitHub Logo](../figures/dump_and_mem.png)
54### 描述:
55heap表记录堆内存申请(AllocEvent)和释放(FreeEvent)数据。heap表通过ipid和itid字段分别与process和thread表的id字段关联,通过eventId与heap_frame表的eventId字段相关联。
56heap表字段解释如下:
57    eventId: 唯一标识一次堆内存申请或释放, 通过与heap_frame表关联可以拿到当前申请或释放的函数调用堆栈。
58    addr: 堆内存申请/释放的地址
59    heap_size: 堆内存申请/释放的大小
60heap_frame表记录内存申请/释放的调用堆栈。通过eventId区分一组调用堆栈,depth为堆栈深度,depth为0时,表示当前行为栈顶数据。
61### 举例:
62已知tid = 123, 查看当前线程的所有堆内存变化信息,可以使用如下SQL语句:
63select heap.* from thread, heap where thread.tid = 123 and thread.id = heap.itid
64已知eventid = 0, 查看当前内存变化调用堆栈
65select * from heap_frame where eventId = 0
66
67### 日志表与进程线程表关系图
68![GitHub Logo](../figures/log.png)
69### 描述:
70log表记录日志信息。可以根据seq字段的连续性,来判断是否存在日志丢失的情况。
71### 举例:
72已知tid = 123, 查看当前线程的所有error级别的日志,可以使用如下SQL语句:
73select * from log where tid = 123 and level = "error"
74
75
76## TraceStreamer输出数据库表格详细介绍
77### trace_range表
78#### 表结构:
79| Columns Name | SQL TYPE |
80|----          |----      |
81|start_ts      |NUM       |
82|end_ts        |INT       |
83#### 关键字段描述:
84start_ts: trace的开始时间,纳秒为单位
85end_ts: trace的结束时间,纳秒为单位
86### process表
87#### 表结构:
88| Columns Name | SQL TYPE |
89|----          |----      |
90|id            |NUM       |
91|type          |INT       |
92|pid           |NUM       |
93|name          |INT       |
94|start_ts      |NUM       |
95#### 关键字段描述:
96id: 进程在数据库重新重新定义的id,从0开始序列增长
97pid: 进程的真实id
98name: 进程名字
99### thread表
100#### 表结构:
101| Columns Name | SQL TYPE |
102|----          |----      |
103|id	           |INT	      |
104|type	       |NUM	      |
105|tid	       |INT	      |
106|name	       |NUM	      |
107|start_ts	   |INT	      |
108|end_ts	       |INT	      |
109|ipid	       |INT	      |
110|is_main_thread|INT       |
111#### 字段详细描述:
112id: 线程在数据库重新重新定义的id,从0开始序列增长
113ipid: 线程所属的进程id, 关联进程表中的ID
114name: 线程名字
115is_main_thread: 是否主线程,主线程即该线程实际就是进程本身
116
117### thread_state表
118#### 表结构:
119| Columns Name | SQL TYPE |
120|----          |----      |
121|id            |INT       |
122|type          |NUM       |
123|ts            |INT       |
124|dur           |INT       |
125|cpu           |INT       |
126|itid          |INT       |
127|state         |NUM       |
128#### 字段详细描述:
129id: 线程状态在数据库中的id,从0开始序列增长
130ts: 该线程状态的起始时间
131dur: 该线程状态的持续时间
132cpu: 该线程在哪个cpu上执行(针对running状态的线程)
133itid: 该状态所属的线程所属的进程id, 关联进程表中的ID
134state: 线程实际的的状态值
135```
136'R', Runnable状态
137'S', interruptible sleep
138'D', uninterruptible sleep
139'T', Stoped
140't', Traced
141'X', ExitedDead
142'Z', ExitZombie
143'x', TaskDead
144'I', TaskDead
145'K', WakeKill
146'P', Parked
147'N', NoLoad
148```
149### instant表
150#### 表结构:
151| Columns Name | SQL TYPE |
152|----          |----      |
153|ts            |INT       |
154|name          |NUM       |
155|ref           |INT       |
156|ref_type      |NUM       |
157#### 表描述:
158记录了系统中的waking和wakeup事件。
159### raw表
160#### 表结构:
161| Columns Name | SQL TYPE |
162|----          |----      |
163|id            |INT       |
164|type          |NUM       |
165|ts            |INT       |
166|name          |NUM       |
167|cpu           |INT       |
168|itid          |INT       |
169#### 表描述:
170记录了系统中的waking、wakup、cpu_idel、cpu_frequency数据。
171
172### callstack表
173#### 表结构:
174| Columns Name | SQL TYPE |
175|----          |----      |
176|id            |INT       |
177|ts            |INT       |
178|dur           |INT       |
179|callid        |INT       |
180|cat           |NUM       |
181|name          |NUM       |
182|depth         |INT       |
183|cookie        |INT       |
184|parent_id     |INT       |
185|argsetid      |INT       |
186|chainId       |NUM       |
187|spanId        |NUM       |
188|parentSpanId  |NUM       |
189|flag          |NUM       |
190|args          |NUM       |
191#### 字段详细描述:
192dur: 调用时长
193callid: 调用者的ID,比如针对线程表里面的id
194name: 调用名称
195depth: 调用深度
196parent_id: 父调用的id
197
198### measure表
199#### 表结构:
200| Columns Name | SQL TYPE |
201|----          |----      |
202|type          |NUM       |
203|ts            |INT       |
204|value         |INT       |
205|filter_id     |INT       |
206#### 字段详细描述:
207
208### heap表
209#### 表结构:
210| Columns Name | SQL TYPE |
211|----          |----      |
212|eventId       |INT       |
213|ipid          |INT       |
214|itid          |INT       |
215|event_type    |NUM       |
216|start_ts      |INT       |
217|end_ts        |INT       |
218|dur           |INT       |
219|addr          |INT       |
220|heap_size     |INT       |
221|all_heap_size |INT       |
222#### 字段详细描述:
223
224### heap_frame表
225#### 表结构:
226| Columns Name | SQL TYPE |
227|----          |----      |
228|eventId       |INT       |
229|depth         |INT       |
230|ip            |INT       |
231|sp            |INT       |
232|symbol_name   |NUM       |
233|file_path     |NUM       |
234|offset        |INT       |
235|symbol_offset |INT       |
236#### 表描述:
237记录了内存的申请和释放的堆栈。
238### hidump表
239#### 表结构:
240| Columns Name | SQL TYPE |
241|----          |----      |
242|ts            |INT       |
243|fps           |INT       |
244#### 表描述:
245此表记录了设备的帧率信息,fps。
246### symbols表
247#### 表结构:
248| Columns Name | SQL TYPE |
249|----          |----      |
250|id            |INT       |
251|funcname      |NUM       |
252|addr          |INT       |
253#### 表描述:
254此表记录了数值和函数调用名称的映射关系。
255
256### measure_filter表
257记录一个递增的filterid队列,所有其他的filter类型在获取过程中,均从此数据列表中获取下一个可用的filter_id并做记录。
258#### 表结构:
259| Columns Name     | SQL TYPE |
260|----              |----      |
261|id                |NUM       |
262|type              |NUM       |
263|name              |INT       |
264|source_arg_set_id |INT       |
265
266#### 字段详细描述:
267过滤分类(type),过滤名称(key2),数据ID(key1)。
268数据ID在process_measure_filter, sys_event_filter中作为id。
269### process_measure_filter表
270将进程ID作为key1,进程的内存,界面刷新,屏幕亮度等信息作为key2,唯一确定一个filter_id, filter_id同时被记录在measure_filter表中。
271#### 表结构:
272| Columns Name | SQL TYPE |
273|----          |----      |
274|id            |INT       |
275|type          |NUM       |
276|name          |NUM       |
277|ipid          |INT       |
278#### 字段详细描述:
279filterid: 来自measure_filter表
280name: cpu状态名
281ipid: 进程内部编号
282### data_type表
283#### 表结构:
284| Columns Name | SQL TYPE |
285|----          |----      |
286|id            |INT       |
287|typeId        |INT       |
288|desc          |NUM       |
289#### 表描述:
290此表记录了一个数据类型ID和数据描述的映射。
291### data_dict表
292#### 表结构:
293| Columns Name | SQL TYPE |
294|----          |----      |
295|id            |INT       |
296|data          |NUM       |
297#### 表描述:
298此表记录了一个数据类型ID和字符串的映射。
299### meta表
300#### 表结构:
301| Columns Name | SQL TYPE |
302|----          |----      |
303|name          |NUM       |
304|value         |NUM       |
305#### 表描述:
306此表记录了数据解析或导出时的一些现场数据,比如使用的trace_streamer版本, 工具的发布时间,数据解析的时间,数据的持续时长,以及原始数据的格式。
307