第 27 章 监控数据库活动
目录
- 27.1. 标准 Unix 工具
- 27.2. 统计收集器
- 27.2.1. 统计信息收集配置
- 27.2.2. 查看统计信息
- 27.2.3.
pg_stat_activity - 27.2.4.
pg_stat_replication - 27.2.5.
pg_stat_wal_receiver - 27.2.6.
pg_stat_subscription - 27.2.7.
pg_stat_ssl - 27.2.8.
pg_stat_gssapi - 27.2.9.
pg_stat_archiver - 27.2.10.
pg_stat_bgwriter - 27.2.11.
pg_stat_database - 27.2.12.
pg_stat_database_conflicts - 27.2.13.
pg_stat_all_tables - 27.2.14.
pg_stat_all_indexes - 27.2.15.
pg_statio_all_tables - 27.2.16.
pg_statio_all_indexes - 27.2.17.
pg_statio_all_sequences - 27.2.18.
pg_stat_user_functions - 27.2.19.
pg_stat_slru - 27.2.20. 统计函数
- 27.3. 查看锁
- 27.4. 进度报告
- 27.5. 动态追踪
数据库管理员常常会问:“系统现在正在做什么?”本章将讨论如何回答这个问题。
有几种工具可用于监控数据库活动和分析性能。本章的大部分内容将用于描述 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: background writer postgres 15555 0.0 0.0 57536 916 ? Ss 18:02 0:00 postgres: checkpointer postgres 15556 0.0 0.0 57536 916 ? Ss 18:02 0:00 postgres: walwriter postgres 15557 0.0 0.0 58504 2244 ? Ss 18:02 0:00 postgres: autovacuum launcher postgres 15558 0.0 0.0 17512 1068 ? Ss 18:02 0:00 postgres: stats collector 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:userdatabasehostactivity
在客户端连接的整个生命周期内,用户、数据库和(客户端)主机这几项保持不变,但活动指示符会改变。活动可以是 idle(即等待客户端命令)、idle in transaction(在 BEGIN 块内等待客户端),或者命令类型名称,例如 SELECT。此外,服务器进程当前若正在等待另一会话持有的锁,还会附加 waiting。在上面的示例中,可以推断进程 15606 正在等待进程 15610 完成事务,从而释放某个锁。(进程 15610 必定是阻塞者,因为不存在其他活动会话。在更复杂的情况下,必须查看 pg_locks 系统视图,才能确定谁在阻塞谁。)
如果配置了 cluster_name,则集簇名称也会显示在 ps 输出中:
$ psql -c 'SHOW cluster_name' cluster_name -------------- server1 (1 row) $ ps aux|grep server1 postgres 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 postgres: server1: background writer ...
如果您关闭了 update_process_title,则活动指示器不会更新;进程标题仅在新进程启动时设置一次。在某些平台上,这可以节省可观的每命令开销;在其他平台上,则微不足道。
提示
Solaris 需要特殊处理。您必须使用 /usr/ucb/ps,而不是 /bin/ps。您还必须使用两个 w 标志,而不仅仅是一个。此外,您对 postgres 命令的原始调用必须具有比每个服务器进程提供的更短的 ps 状态显示。如果未满足这三个条件,每个服务器进程的 ps 输出都会显示原始的 postgres 命令行。