Table of Contents
pg_stat_activitypg_stat_replicationpg_stat_replication_slotspg_stat_wal_receiverpg_stat_recovery_prefetchpg_stat_subscriptionpg_stat_subscription_statspg_stat_sslpg_stat_gssapipg_stat_archiverpg_stat_iopg_stat_bgwriterpg_stat_checkpointerpg_stat_walpg_stat_databasepg_stat_database_conflictspg_stat_all_tablespg_stat_all_indexespg_statio_all_tablespg_statio_all_indexespg_statio_all_sequencespg_stat_user_functionspg_stat_slru数据库管理员常常会问:“系统现在正在做什么?”本章将讨论如何回答这个问题。
有几种工具可用于监控数据库活动和分析性能。本章的大部分内容将用于描述PostgreSQL的统计收集器, 但也不应忽略常见的 Unix 监控程序,例如ps、top、iostat和vmstat。 此外,一旦确定了某个查询性能不佳,可能需要使用PostgreSQL的EXPLAIN命令进行进一步调查。 Section 14.1讨论了EXPLAIN以及理解单个查询行为的其他方法。
在大多数 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 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 系统。)此处列出的第一个进程是主服务器进程。它显示的命令参数是启动时使用的参数。接下来的五个进程是由主进程自动启动的后台工作进程。(如果您已将系统设置为不运行自动清理,则不会出现“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命令行。
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。