PostgreSQLNotes

第 20 章:后台进程

zjc 于 2026-01-20 发布

这是《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

因此连接数过高会带来:

  1. 进程调度成本;
  2. 内存开销;
  3. 上下文切换;
  4. 锁竞争;
  5. 管理复杂。

应用应使用连接池。

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

处理顺序:

  1. 查看数据库日志;
  2. 对应时间线;
  3. 检查 OOM 和系统日志;
  4. 查看连接和内存参数;
  5. 复现并保留计划;
  6. 补监控和资源隔离。

本章小结

后台进程承担刷盘、检查点、清理、复制和并行执行。生产运维要能通过进程、日志和统计视图判断是业务连接、autovacuum、WAL 还是检查点在消耗资源。

思考题

  1. 为什么 PostgreSQL 需要连接池?
  2. autovacuum worker 增加就一定更快吗?
  3. checkpoints_req 高说明什么?
  4. walsender 和 walreceiver 分别在哪里运行?
  5. 进程被 signal 9 终止应如何排查?