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 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 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 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 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