一个数据库管理员常常想知道,"现在系统正在干什么呢?". 本章讨论如何回答这个问题.
有一些工具可以用来监控数据库的活动以及分析性能. 本章大部分内容是用于描述 PostgreSQL 的 统计收集器(statistics collector), 但我们也不能忽视普通的 Unix 监控程序,比如 ps 和 top.同样,一旦我们找出了一个性能恶劣的查询,那么 我们可能还要用 PostgreSQL 的 EXPLAIN 命令进一步分析. PostgreSQL 7.3.3 用户手册 里讨论了 EXPLAIN 和其它用于理解独立查询的行为的方法.
在大多数平台上,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: user database host activity
在该客户端联接的生命期中,用户,数据库,和联接源主机项都保持不变, 胆识活跃性指示符会变化.活跃性可以是 idle (也就是说, 等待客户端的命令),idle in transaction (在一个BEGIN 块里等待用户),或者一个命令类型名,比如 SELECT. 同样,如果服务器目前正在等待一个其它服务器进程持有的锁的时候, 会在信息后面附加 waiting.在上面的例子中,我们可以 推出∶进程 1003 正在等待 1016完成其事务,这样才能施放一些锁或者其它 什么东西.
小知识: Solaris 需要特别的处理. 你必需使用 /usr/ucb/ps,而不是 /bin/ps.你还必需使用两个 w 标志,而不是一个.另外,你最初调用 postmaster 是用到的命令行在 ps 状态显示中必需比每个后端显示的短.如果没做到这三件事, 那么 ps 为每个后端输出的将是最初的 postmaster 的命令行.