这是《PostgreSQL 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 PostgreSQL 是多进程架构。理解后台进程职责,有助于判断 IO 抖动、复制延迟、autovacuum 行为和恢复过程。
20.1 进程列表
ps -ef | grep postgres
常见进程:
| 进程 | 职责 |
|---|---|
| postmaster | 主进程,管理子进程 |
| backend | 服务客户端连接 |
| checkpointer | 执行检查点 |
| background writer | 后台刷脏页 |
| WAL writer | 刷 WAL 缓冲 |
| autovacuum launcher | 调度 autovacuum |
| autovacuum worker | 执行清理 |
| walreceiver | 流复制接收 WAL |
| walsender | 发送 WAL |
| logical replication launcher | 逻辑复制调度 |
20.2 连接进程
每个连接对应一个 backend 进程:
Client A -> postgres: app db app_user
Client B -> postgres: app db app_user
因此连接数过高会带来:
- 进程调度成本;
- 内存开销;
- 上下文切换;
- 锁竞争;
- 管理复杂。
应用应使用连接池。
20.3 autovacuum 进程
SHOW autovacuum_max_workers;
SHOW autovacuum_naptime;
worker 数量不是越大越好,还要考虑 IO 限速、磁盘能力和表数量。
查看正在运行:
SELECT
pid,
datname,
relid::regclass AS table_name,
phase,
heap_blks_total,
heap_blks_scanned
FROM pg_stat_progress_vacuum;
20.4 WAL 进程
WAL writer 周期性刷新 WAL 缓冲。walsender 和 walreceiver 用于物理流复制。
查看复制:
SELECT
pid,
usename,
application_name,
client_addr,
state,
sent_lsn,
write_lsn,
flush_lsn,
replay_lsn
FROM pg_stat_replication;
20.5 检查点进程
查看检查点:
SELECT checkpoints_timed, checkpoints_req
FROM pg_stat_bgwriter;
checkpoints_req 过高说明请求检查点过多,可能与 WAL 压力、批量写入或配置有关。
20.6 工作进程
并行查询 worker:
SHOW max_worker_processes;
SHOW max_parallel_workers;
SHOW max_parallel_workers_per_gather;
并行 worker 消耗 CPU、内存和 IO,需要与 max_connections、备份任务和扩展任务统一规划。
20.7 进程异常排查
常见日志:
server process was terminated by signal 9
terminating connection due to administrator command
canceling statement due to statement timeout
处理顺序:
- 查看数据库日志;
- 对应时间线;
- 检查 OOM 和系统日志;
- 查看连接和内存参数;
- 复现并保留计划;
- 补监控和资源隔离。
本章小结
后台进程承担刷盘、检查点、清理、复制和并行执行。生产运维要能通过进程、日志和统计视图判断是业务连接、autovacuum、WAL 还是检查点在消耗资源。
思考题
- 为什么 PostgreSQL 需要连接池?
- autovacuum worker 增加就一定更快吗?
- checkpoints_req 高说明什么?
- walsender 和 walreceiver 分别在哪里运行?
- 进程被 signal 9 终止应如何排查?