system.trace_log
在 ClickHouse Cloud 中进行查询
该系统表中的数据保存在 ClickHouse Cloud 中每个节点的本地。因此,如需获得所有数据的完整视图,需要使用 clusterAllReplicas 函数。更多详情请参阅此处。
描述
包含由 查询采样分析器 收集的堆栈跟踪信息。
在配置了 trace_log 服务器配置部分后,ClickHouse 会创建此表。另请参阅以下设置:query_profiler_real_time_period_ns、query_profiler_cpu_time_period_ns、memory_profiler_step、memory_profiler_sample_probability、trace_profile_events。
要分析日志,请使用 addressToLine、addressToLineWithInlines、addressToSymbol 和 demangle 内省函数。
列
hostname(LowCardinality(String)) — 执行该查询的服务器主机名。event_date(Date) — 采样时间的日期。event_time(DateTime) — 采样时刻的时间戳。event_time_microseconds(DateTime64(6)) — 采样时刻的时间戳,精确到微秒。timestamp_ns(UInt64) — 采样时刻的纳秒级타임스탬프。revision(UInt32) — ClickHouse 服务端的构建修订号。使用clickhouse-client连接到服务端时,你会看到类似Connected to ClickHouse server version 19.18.1.的字符串。此字段包含的是服务端的revision,而不是version。trace_type(Enum8('Real' = 0, 'CPU' = 1, 'Memory' = 2, 'MemorySample' = 3, 'MemoryPeak' = 4, 'ProfileEvent' = 5, 'JemallocSample' = 6, 'MemoryAllocatedWithoutCheck' = 7, 'Instrumentation' = 8)) — 跟踪类型:Real表示按挂钟时间收集堆栈跟踪。CPU表示按 CPU 时间收集堆栈跟踪。Memory表示当内存分配超过后续水位线时,收集分配和释放事件。MemorySample表示收集随机分配和释放事件。MemoryPeak表示收集峰值内存占用的更新。ProfileEvent表示收集 profile events 的增量。JemallocSample表示收集 jemalloc 样本。MemoryAllocatedWithoutCheck表示收集在忽略任何内存限制的情况下进行的重大分配 (>16MiB) (仅适用于 ClickHouse 开发者) 。Instrumentation表示收集通过 XRay 插桩获得的跟踪。cpu_id(UInt64) — CPU ID。thread_id(UInt64) — 线程 ID。thread_name(LowCardinality(String)) — 线程名。query_id(String) — 可用于从query_log系统表获取正在运行的查询详细信息的查询标识符。trace(Array(UInt64)) — 采样时刻的调用堆栈。每个元素都是 ClickHouse 服务端进程中的一个虚拟内存地址。size(Int64) — 对于 trace 类型 Memory、MemorySample、MemoryAllocatedWithoutCheck 或 MemoryPeak,表示已分配的内存量;对于其他 trace 类型,该值为 0。ptr(UInt64) — 已分配数据块的地址。memory_context(Enum8('Unknown' = -1, 'Global' = 0, 'User' = 1, 'Process' = 2, 'Thread' = 3, 'Max' = 4)) — 内存跟踪器上下文 (仅适用于 Memory/MemoryPeak) :Unknown表示此 trace_type 未定义上下文。Global表示服务器上下文。User表示用户/合并上下文。Process表示进程 (即查询) 上下文。Thread表示线程上下文 (特定进程的线程) 。Max是一个特殊值,表示内存跟踪器未被阻塞 (针对 blocked_context 列) 。memory_blocked_context(Enum8('Unknown' = -1, 'Global' = 0, 'User' = 1, 'Process' = 2, 'Thread' = 3, 'Max' = 4)) — 内存跟踪器被阻塞时所属的上下文 (仅供 ClickHouse 开发者使用) :对于此trace_type,Unknown上下文未定义。Global表示服务器上下文。User表示用户/合并上下文。Process表示进程 (即查询) 上下文。Thread表示线程 (特定进程的线程) 上下文。Max是一个特殊值,表示内存跟踪器未被阻塞 (针对blocked_context列) 。event(LowCardinality(String)) — 对于 trace 类型ProfileEvent,该值为已更新的 profile event 名称;对于其他 trace 类型,该值为空字符串。increment(Int64) — 对于trace类型的 ProfileEvent,表示该 profile event 的增量;对于其他trace类型,该值为 0。symbols(Array(LowCardinality(String))) — 如果启用了符号化,则包含与trace对应的去修饰后的符号名称。可在服务器配置文件中trace_log下的symbolize设置中启用或禁用符号化。lines(Array(LowCardinality(String))) — 如果启用了符号化,则包含与trace对应的、带行号的文件名字符串。function_id(Nullable(Int32)) — 对于 trace 类型的 Instrumentation,这是分配给 ELF 二进制文件中 xray_instr_map 节内函数的 ID。function_name(Nullable(String)) — 对于 trace 类型的 Instrumentation,表示已插桩函数的名称。handler(Nullable(String)) — 对于 trace 类型的 Instrumentation,表示已插桩函数的 handler。entry_type(Nullable(Enum8('Entry' = 0, 'Exit' = 1))) — 对于 trace 类型的 Instrumentation,表示被插桩函数的进入/退出类型。duration_nanoseconds(Nullable(UInt64)) — 对于 trace 类型的 Instrumentation,表示函数运行耗时,单位为纳秒。
別名:
build_id— 是'E2EEB60ED9503BFFA825B628D480CCDC40B2D416'的别名。
可以在服务器配置文件的 trace_log 部分,通过 symbolize 启用或禁用符号化。
示例
转换为 Chrome 事件跟踪格式
可以使用以下查询将性能分析数据转换为 Chrome 的事件跟踪格式 (Event Trace Format) 。将该查询保存为名为 chrome_trace.sql 的文件:
并使用 ClickHouse Client 执行它,将结果导出为 trace.json 文件,以便我们在 Perfetto 或 speedscope 中导入。
如果我们希望获得更紧凑但信息更少的 trace,可以省略 stack 部分。
另请参阅
- SYSTEM INSTRUMENT — 添加或移除插桩点。
- system.instrumentation — 查看已插桩的点。
- system.symbols — 查看符号以确定插桩点。