trace收集与格式化工具

用户通过本文将了解:

  • trace 跟踪相关的命令
  • 通过相关命令开启 trace 日志收集和断点跟踪功能
  • 如何输出 trace 日志,并将其格式化为可读的形式

trace 相关的命令

traceOn

描述:开启数据库引擎跟踪功能,并且可以指定多个过滤选项。指定断点跟踪时,会在流程进入相应断点时,挂起相应线程。

语法:

  1. db.traceOn( <bufferSize>, [options])
参数名类型描述是否必填
bufferSizeint缓冲区大小,单位:MB,取值:【1~1024】
optionsSdbTraceOption是一个 json 类型,用于指定过滤选项
  1. SdbTraceOption({[Components:[...]], [BreakPoint:[...]],[Threads:[...]], [FunctionNames:[...]], [ThreadTypes:[...]]})
参数名类型描述
Componentsstring 数组用于指定一组[模块][component],默认跟踪所有模块
BreakPointstring 数组用于指定一组断点,最大断点数量为10个
Threadsint 数组用于指定一组[线程][snapshot],最大线程数量为10个
FunctionNamesstring 数组用于指定一组函数名
ThreadTypesstring 数组用于指定一组[线程类型][snapshot]

traceResume

描述:所有被断点跟踪挂起的线程恢复执行,并且将删除所有断点。

语法:

  1. db.traceResume()

traceStatus

描述:查看 trace 的状态,可以了解 trace 是否启用,当前跟踪设置的过滤选项,缓冲区的使用情况等信息。

语法:

  1. db.traceStatus()

traceOff

描述:将缓冲区中的 trace 日志导出为二进制文件。

语法:

  1. db.traceOff(<dumpFile>)
参数名类型描述是否必填
dumpFilestring导出的二进制文件的路径;如果指定文件为相对路径则存放于相应节点的 diagpath 中

traceFmt

描述:完成 trace 日志的解析,按照指定的格式化类型输出相应的文本文件。

语法:

  1. traceFmt(<formatType>, <input>, <output>)
参数名类型描述是否必填
formatTypeint格式化类型,取值为0或者1
inputstringtraceOff 导出的二进制文件路径
outputstring输出的目标文件

开启 trace 日志收集

本部分主要介绍 trace 日志的收集,通过 traceOn 命令可以开启 trace 功能,通过 traceStatus 可以了解 trace 的状态,通过 traceResume 可以恢复被挂起的线程,继续跟踪。

开启 trace 日志收集需要先连接到相应节点上。

跟踪所有模块:

  1. db.traceOn( 256 )

按模块过滤:

  1. db.traceOn( 256, SdbTraceOption( { Components:['dms'] } ) )

按线程过滤:

  1. db.traceOn( 256, SdbTraceOption( { Threads:[4650] } ) )

按函数名过滤:

  1. db.traceOn( 256, SdbTraceOption( { FunctionNames:['_dmsTempSUMgr::init'] } ) )

按线程类型过滤:

  1. db.traceOn( 256, SdbTraceOption( { threadTypes:['ShardAgent'] } ) )

断点跟踪:

  1. db.traceOn( 256, SdbTraceOption( { BreakPoint:['_dmsTempSUMgr::init'] } ) )

恢复断点执行:

  1. db.traceResume()

模块和线程组合过滤:

  1. db.traceOn( 256, SdbTraceOption( { Components:['rtn'], Threads:[8337] } ) )

查看跟踪状态:

  1. > db.traceStatus()
  2. {
  3. "TraceStarted": true,
  4. "Wrapped": false,
  5. "Size": 268435456,
  6. "FreeSize": 268432584,
  7. "PadSize": 0,
  8. "Mask": [
  9. "rtn"
  10. ],
  11. "BreakPoint": [],
  12. "Threads": [
  13. 8337
  14. ]
  15. }

trace 日志输出

  1. db.traceOff( 'tracedump.dat')

关闭跟踪,并将缓冲区中的 trace 日志以二进制格式输出到指定的文件中。 文件路径为绝对路径需要有相关目录的权限,为相对路径则输出到节点日志目录下面。

trace 日志格式化

  • 输出分析文件,按线程进行组织输出流程文件,并且针对结果作初步分析。
  1. traceFmt(0, ${dbpath} + '/diaglog/tracedump.dat', ${dbpath} + '/diaglog/trace_fmt'
  1. -rw-r----- 1 root root 0 Mar 25 20:35 trace_flw.error
  2. -rw-r----- 1 root root 880 Mar 25 20:35 trace_flw.except
  3. -rw-r----- 1 root root 129033 Mar 25 20:35 trace_flw.flw
  4. -rw-r----- 1 root root 6497 Mar 25 20:35 trace_flw.funcRecord.csv
  5. -rw-r----- 1 root root 40 Mar 25 20:35 trace_flw.version

其中 trace_flw.flw 输出为:

  1. 1231: _pmdLocalSession::_processMsg Entry(369): 2019-03-25-20.32.32.543809
  2. 1232: | _pmdLocalSession::_processMsg(370): 2019-03-25-20.32.32.543810
  3. 1233: | _pmdCoordProcessor::processMsg Entry(1756): 2019-03-25-20.32.32.543812
  4. 1234: | | _pmdCoordProcessor::_processCoordMsg Entry(1352): 2019-03-25-20.32.32.543813
  5. 1235: | | | _pmdCoordProcessor::_processCoordMsg(1354): 2019-03-25-20.32.32.543814
  6. 1236: | | | _netFrame::syncSend Entry(790): 2019-03-25-20.32.32.543844
  7. 1237: | | | | _netEventHandler::syncSend Entry(465): 2019-03-25-20.32.32.543847
  8. 1238: | | | | _netEventHandler::syncSend Exit(508): 2019-03-25-20.32.32.543862
  9. 1239: | | | _netFrame::syncSend Exit(821): 2019-03-25-20.32.32.543863
  10. 1240: | | | _pmdEDUCB::isInterrupted Entry(730): 2019-03-25-20.32.32.543867
  11. 1241: | | | | _pmdEDUCB::isInterrupted(778): 2019-03-25-20.32.32.543868
  12. 1242: | | | _pmdEDUCB::isInterrupted Exit(779): 2019-03-25-20.32.32.543869
  13. 1263: | | | _pmdEDUCB::delTransaction Entry(1066): 2019-03-25-20.32.32.545389 (1520)
  14. 1264: | | | _pmdEDUCB::delTransaction Exit(1072): 2019-03-25-20.32.32.545391
  15. 1265: | | | _pmdCoordProcessor::_processCoordMsg(1582): 2019-03-25-20.32.32.545398
  16. 1266: | | _pmdCoordProcessor::_processCoordMsg Exit(1617): 2019-03-25-20.32.32.545399
  17. 1267: | _pmdCoordProcessor::processMsg Exit(1778): 2019-03-25-20.32.32.545400
  18. 1268: | ossSocket::send Entry(368): 2019-03-25-20.32.32.545402
  19. 1269: | ossSocket::send Exit(492): 2019-03-25-20.32.32.545426
  20. 1270: _pmdLocalSession::_processMsg Exit(430): 2019-03-25-20.32.32.545428

trace_flw.funcRecord.csv 输出为:

  1. name, count, avgcost, min, maxIn2OutCost, maxCurrentCost, first, second, third, fourth, fifth
  2. _clsGroupItem::getNodeID,1,1.0,1,1,1,"(425, 1, 1, 1)"
  3. _clsGroupItem::getNodeInfo,1,3.0,3,4,3,"(427, 4, 3, 1)"
  4. msgCheckBuffer,2,5.0,5,5,5,"(98, 5, 5, 4)","(250, 5, 5, 4)"
  5. msgExtractInsert,2,2.0,2,2,2,"(802, 2, 2, 1)","(1066, 2, 2, 1)"
  6. msgBuildQueryMsg,2,4.5,4,10,5,"(95, 10, 5, 2)","(247, 9, 4, 1)"
  7. msgExtractQuery,11,2.1,2,3,3,"(83, 3, 3, 2)","(87, 2, 2, 1)","(91, 2, 2, 1)","(235, 2, 2, 1)","(239, 2, 2, 1)"
  8. msgExtractGetMore,2,0.0,0,0,0,"(533, 0, 0, 0)","(634, 0, 0, 0)"
  9. msgFillGetMoreMsg,4,0.2,0,1,1,"(570, 1, 1, 1)","(176, 0, 0, 0)","(328, 0, 0, 0)","(482, 0, 0, 0)"
  10. _netFrame::_getHandle,1,2.0,2,2,2,"(442, 2, 2, 2)"
  11. _netFrame::syncSend,1,3.0,3,20,3,"(441, 20, 3, 1)"
  12. _netFrame::syncSend,8,3.8,3,20,5,"(125, 20, 5, 4)","(572, 15, 4, 3)","(825, 20, 4, 3)","(1089, 20, 4, 3)","(1236, 19, 4, 3)"
  13. _netFrame::handleMsg,17,6.1,1,20,11,"(560, 11, 11, 11)","(848, 11, 11, 11)","(148, 11, 11, 10)","(300, 11, 11, 10)","(1112, 11, 11, 10)"

trace_flw.except 输出为:

  1. _ossEvent::wait
  2. sequence: 756 tid: 8193 cost: 5000110 (5000110)
  3. 756: _ossEvent::wait Entry(64): 2019-03-25-20.32.02.602858
  4. 872: _ossEvent::wait Exit(93): 2019-03-25-20.32.07.602968 (5000110)

trace_flw.version 输出为:

  1. SequoiaDB version : 3.2
  2. Release : 39719
  • 输出 dump 记录信息

    按照日志收集顺序,顺序格式化成可读的文本形式。

  1. traceFmt(1, ${dbpath} + '/diaglog/tracedump.dat', ${dbpath} + '/diaglog/trace_fmt'
  1. -rw-r----- 1 sdbadmin sdbadmin_group 170129 Mar 25 20:32 tracedump.out
  2. -rw-r----- 1 root root 215544 Mar 25 20:34 trace_fmt.fmt
  3. -rw-r----- 1 root root 40 Mar 25 20:34 trace_fmt.version

trace_fmt.fmt 输出为:

  1. 1: _rtnTraceStart::doit Exit(2736): 2019-03-25-19.40.34.097959
  2. tid: 8369, numArgs: 1
  3. arg0: 0
  4. 2: _pmdCoordProcessor::_processCoordMsg Normal(1582): 2019-03-25-19.40.34.097966
  5. tid: 8369, numArgs: 1
  6. arg0: 0
  7. 3: _pmdCoordProcessor::_processCoordMsg Exit(1617): 2019-03-25-19.40.34.097967
  8. tid: 8369, numArgs: 1
  9. arg0: 0
  10. 4: _pmdCoordProcessor::processMsg Exit(1778): 2019-03-25-19.40.34.097968
  11. tid: 8369, numArgs: 1
  12. arg0: 0
  13. 5: ossSocket::send Entry(368): 2019-03-25-19.40.34.097969
  14. tid: 8369, numArgs: 0
  15. 6: ossSocket::send Exit(492): 2019-03-25-19.40.34.097992
  16. tid: 8369, numArgs: 1
  17. arg0: 0
  18. 7: _pmdLocalSession::_processMsg Exit(430): 2019-03-25-19.40.34.097994
  19. tid: 8369, numArgs: 1
  20. arg0: 0

版本文件输出同分析文件输出。