第 10 章 监控数据库活动
数据库管理员常常会问:“系统现在正在做什么?”本章将讨论如何回答这个问题。
有多种工具可用于监控数据库活动和分析性能。本章的大部分内容都在描述
PostgreSQL 的统计收集器,但不应忽视常规的 Unix 监控程序,如
ps 和 top。此外,一旦识别出性能不佳的查询,可能还需要用
PostgreSQL 的 EXPLAIN 命令做进一步调查。PostgreSQL 用户指南 讨论了 EXPLAIN
以及理解单个查询行为的其他方法。
10.1. 标准 Unix 工具 #
在大多数平台上,PostgreSQL 会修改
ps 报告的命令标题,这样单个服务器进程就可以很容易地识别。示例显示如下
$ ps auxww | grep ^postgres postgres 960 0.0 1.1 6104 1480 pts/1 SN 13:17 0:00 postmaster -i postgres 963 0.0 1.1 7084 1472 pts/1 SN 13:17 0:00 postgres: stats buffer process postgres 965 0.0 1.1 6152 1512 pts/1 SN 13:17 0:00 postgres: stats collector process postgres 998 0.0 2.3 6532 2992 pts/1 SN 13:18 0:00 postgres: tgl runbug 127.0.0.1 idle postgres 1003 0.0 2.4 6532 3128 pts/1 SN 13:19 0:00 postgres: tgl regression [local] SELECT waiting postgres 1016 0.1 2.4 6532 3080 pts/1 SN 13:19 0:00 postgres: tgl regression [local] idle in transaction
(ps 的适当调用方式随平台而异,显示内容的细节也是如此。此示例来自较新的 Linux 系统。)这里列出的第一个进程是
postmaster,即主服务器进程。它显示的命令参数与启动它时给出的相同。接下来的两个进程实现统计收集器,下一节将详细描述它。(如果你已把系统设置为不启动统计收集器,这两个进程将不存在。)其余的每个进程都是处理一个客户端连接的服务器进程。每个这样的进程都把它的命令行显示设置为如下形式
postgres:userdatabasehostactivity
在客户端连接的整个生命周期内,用户、数据库和连接来源主机这几项保持不变,但活动指示符会变化。活动可以是 idle(即等待客户端命令)、idle in transaction(在 BEGIN 块内等待客户端),或者命令类型名称,例如 SELECT。此外,如果服务器当前正在等待另一服务器进程持有的锁,会附上
waiting。在上面的示例中,我们可以推断进程 1003 正在等待进程 1016 完成事务,从而释放某个锁。
提示
Solaris 需要特殊处理。你必须使用 /usr/ucb/ps 而不是
/bin/ps。还必须使用两个 w
标志,而不只是一个。此外,你最初调用
postmaster 时的
ps 状态显示必须比每个后端提供的更短。如果这三点有一点没做到,每个后端的
ps 输出就都是最初的
postmaster
命令行。