Chapter 23. 监控数据库的活动

Table of Contents
23.1. 标准 Unix 工具
23.2. 统计收集器
23.2.1. 统计收集器配置
23.2.2. 查看收集到的统计信息
23.3. 查看锁

一个数据库管理员常常想知道,"现在系统正在干什么呢?"。 本章讨论如何回答这个问题。

有一些工具可以用来监控数据库的活动以及分析性能。 本章大部分内容是用于描述 PostgreSQL统计收集器(statistics collector), 但我们也不能忽视普通的 Unix 监控程序,比如 pstopiostatvmstat。 同样,一旦我们找出了一个性能恶劣的查询,那么我们可能还要用 PostgreSQLEXPLAIN 命令进一步分析。 Section 13.1 里讨论了 EXPLAIN 和其它用于理解独立查询的行为的方法。

23.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: user database host activity

在该客户端联接的生命期中,用户,数据库,和联接源主机项都保持不变, 但是活跃性指示符会变化。活跃性可以是 idle (也就是说, 等待客户端的命令),idle in transaction (在一个BEGIN 块里等待用户),或者一个命令类型名,比如 SELECT。 同样,如果服务器目前正在等待一个其它服务器进程持有的锁的时候, 会在信息后面附加 waiting。在上面的例子中,我们可以推出:进程 1003 正在等待 1016完成其事务, 这样才能施放一些锁或者其它什么东西.

提示: Solaris 需要特别的处理。 你必需使用 /usr/ucb/ps,而不是 /bin/ps.你还必需使用两个 w 标志,而不是一个。另外,你最初调用 postmaster 时用到的命令行在 ps 状态显示中必须比 ps 给每个服务器进程显示的短。如果没满足这三个条件, 那么 ps 为每个服务器进程输出的将是最初的 postmaster 的命令行。