PostgreSQL码农集散地

PostgreSQL 代码追踪分析: pg_uprobe

PostgreSQL 代码追踪分析: pg_uprobe

pg_uprobe 是一个 PostgreSQL 扩展,用于在会话中进行查询追踪和分析。它利用 Frida 和 Frida Gum 库进行动态代码注入,因此不需要修改 PostgreSQL 的源代码。

该项目提供了两个主要功能:

  1. **会话追踪 (Session Tracing)**:

  • 追踪当前会话:在 SQL 客户端中执行 SELECT pg_uprobe.uprobe_trace_session(0);
  • 追踪其他会话:如果知道其他会话的进程 ID (PID),执行 SELECT pg_uprobe.uprobe_trace_session(<pid>);
  • 注意:追踪功能会带来约 5% 的性能下降,不建议长时间启用。
  • 目的:追踪会话中执行的所有查询,记录查询文本、解析、规划和执行所花费的时间,以及查询计划和等待事件(如文件读取或锁等待)所花费的时间。
  • 用途:帮助识别耗时或资源消耗大的操作。
  • 使用示例:
  • **剖析 PostgreSQL 函数 (Profiling PostgreSQL Functions)**:

    • 设置探针:使用 SQL 函数 pg_uprobe.uprobe_trace_function。例如,要追踪 insert 函数的执行时间,可以执行 SELECT pg_uprobe.uprobe_trace_function('insert', 'TIME');
    • 结果查询:探针结果会写入 PostgreSQL 的日志文件,可以通过查看日志来获取分析数据。
    • TIME:测量函数执行时间。
    • HIST:测量函数执行时间并构建直方图。
    • MEM:测量函数执行前后内存变化。
    • 目的:对于熟悉 PostgreSQL 源代码的高级用户,可以在 C 函数上设置动态探针来分析其性能。
    • 探针类型:
    • 使用示例:

    注意:由于 pg_uprobe 的动态代码注入特性,建议在测试或开发环境中谨慎使用,并确保您了解其潜在的性能影响。

    更多例子参考:

    • https://github.com/postgrespro/pg_uprobe