↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2
历史版本。 PostgreSQL 9.4 已结束支持。 2020-02-13. 请参阅 当前版本手册.

第 27 章 监控数据库活动

数据库管理员常常会问:“系统现在正在做什么?”本章将讨论如何回答这个问题。

有几种工具可用于监控数据库活动和分析性能。本章的大部分内容将用于描述PostgreSQL的统计收集器,但也不应忽略常见的 Unix 监控程序,例如ps、top、iostat和vmstat。此外,一旦确定了某个查询性能不佳,可能需要使用PostgreSQL的EXPLAIN命令进行进一步调查。第 14.1 节讨论了EXPLAIN以及理解单个查询行为的其他方法。

27.1. 标准 Unix 工具 #

在大多数 Unix 平台上,PostgreSQL会修改由ps报告的命令标题,以便轻松识别各个服务器进程。以下是一个显示示例:

$ ps auxww | grep ^postgres
postgres  15551  0.0  0.1  57536  7132 pts/0    S    18:02   0:00 postgres -i
postgres  15554  0.0  0.0  57536  1184 ?        Ss   18:02   0:00 postgres: writer process
postgres  15555  0.0  0.0  57536   916 ?        Ss   18:02   0:00 postgres: checkpointer process
postgres  15556  0.0  0.0  57536   916 ?        Ss   18:02   0:00 postgres: wal writer process
postgres  15557  0.0  0.0  58504  2244 ?        Ss   18:02   0:00 postgres: autovacuum launcher process
postgres  15558  0.0  0.0  17512  1068 ?        Ss   18:02   0:00 postgres: stats collector process
postgres  15582  0.0  0.0  58772  3080 ?        Ss   18:04   0:00 postgres: joe runbug 127.0.0.1 idle
postgres  15606  0.0  0.0  58772  3052 ?        Ss   18:07   0:00 postgres: tgl regression [local] SELECT waiting
postgres  15610  0.0  0.0  58772  3056 ?        Ss   18:07   0:00 postgres: tgl regression [local] idle in transaction

(ps的适当调用方式随平台而异,显示内容的细节也是如此。此示例来自较新的 Linux 系统。)这里列出的第一个进程是主服务器进程。显示的命令参数与启动该进程时使用的参数相同。接下来的五个进程是主进程自动启动的后台工作进程。(如果系统被设置为不启动统计收集器,则不会出现“stats collector”进程;同样,也可以禁用“autovacuum launcher”进程。)其余每个进程都是处理一个客户端连接的服务器进程。每个这样的进程都将其命令行显示设置为以下形式:

postgres: user database host activity

在客户端连接的整个生命周期内,用户、数据库和(客户端)主机这几项保持不变,但活动指示符会改变。活动可以是idle(即等待客户端命令)、idle in transaction(在BEGIN块内等待客户端),或者命令类型名称,例如SELECT。此外,服务器进程当前若正在等待另一会话持有的锁,还会附加waiting。在上面的示例中,可以推断进程 15606 正在等待进程 15610 完成事务,从而释放某个锁。(进程 15610 必定是阻塞者,因为不存在其他活动会话。在更复杂的情况下,必须查看pg_locks系统视图,才能确定谁在阻塞谁。)

如果您关闭了update_process_title,则活动指示器不会更新;进程标题仅在新进程启动时设置一次。在某些平台上,这可以节省可观的每命令开销;在其他平台上,则微不足道。

提示

Solaris需要特殊处理。您必须使用/usr/ucb/ps,而不是/bin/ps。您还必须使用两个w标志,而不仅仅是一个。此外,您对postgres命令的原始调用必须具有比每个服务器进程提供的更短的ps状态显示。如果未满足这三个条件,每个服务器进程的ps输出都会显示原始的postgres命令行。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.