关系型数据库Process per Connection
进程模型 是什么?
每个连接 fork 一个独立进程,而不是线程池
类比:一个客户配一个专属柜员,不用排队等公共窗口
怎么工作
postmaster 是主进程,监听 5432 端口。每来一个连接就 fork 一个 backend 进程,这个进程负责该连接的全部工作:解析 SQL、执行计划、读写共享缓冲。
好处是隔离性强:某个连接把内存搞崩,不会影响其他连接;坏处是每个进程都有独立内存开销,连接数一多,上下文切换和内存都吃不消。
为什么要连接池
几百个连接意味着几百个进程,而真正在干活的可能只有几个。标准做法是在前面挂 pgbouncer(事务级池化),把上千个客户端连接收敛成几十个真实连接。
PG 还有个“后端进程”的连带成本:每个连接默认要分配 work_mem 等资源,连接数爆炸时容易 OOM。
和 MySQL 的差别
MySQL 是一进程多线程,连接是线程,开销小、切换快,但一个线程崩溃可能拖垮整个进程。两种模型各有取舍,这也是 PG 更强调连接池的原因。