如何分析 Postgresql 实例?

Gil*_*ili 8 postgresql profiler

我的 Postgresql 服务器正在使用 100% cpu。我想弄清楚单个查询是否很慢,或者我只是开始用过多的请求来敲打服务器。

是否有某种我可以附加的分析器让我知道:

  1. 哪些查询会在多个连接中触发大部分 CPU 时间?
  2. 对于上述查询,每个查询的平均运行时间是多少?

jja*_*nes 4

如果你使用的是Linux或者亲戚,你可以使用top来查看最上面的进程是什么。如果您在顶部点击“c”,它应该会显示进程标题,这会告诉您是否有选择、更新、插入,或者是否有其他维护任务占用了 CPU(或者您是否已被黑客攻击并且现在正在运行)。为某人挖掘加密货币,这最近似乎很常见)。您还可以查看是否有少量进程各自使用一个 CPU,或者是否有大量进程都在争夺各自的 CPU 份额。

您可以使用 来pg_stat_statements跟踪每个查询运行的次数以及运行时间。这报告的是挂钟时间,而不是 CPU 时间。如果您打开track_io_timing,您还可以获取从磁盘读取数据所花费的时间,这很好,但仍然不会为您提供 CPU 时间,因为有些时间可能会用于等待锁或等待 CPU 时间片。

如果问题是间歇性的并且难以在行为中发现,那么auto_explainlog_min_duration_statement可能会有所帮助。

对于更高级的分析,您可以使用系统工具,例如perf topstrace -y -p <pid>甚至gdb. 这些通常需要相当多的 PostgreSQL 内部知识才能解释它们。这些通常用于研究改进 PostgreSQL 本身(即未来版本)的方法,但我经常发现它们也可以帮助诊断调整问题。您必须安装调试符号才能最大限度地利用perfgdb