Chapter 24. 监控数据库的活动

Table of Contents
24.1. 标准 Unix 工具
24.2. 统计收集器
24.2.1. 统计收集器配置
24.2.2. 查看收集到的统计信息
24.3. 查看锁

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

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

24.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 的命令行。