我知道background writer
,checkpointer
,walwriter
和parallel_worker
的区别:
- walwriter vs bg writer vs checkpointer
- client_backend vs parallel_worker
但我与client backend
混淆。我使用opensnoop
和trace
发现client backend
通常会向data-file和wal-file写入(pwrite(2)
)一些内容。
PID COMM FD ERR PATH
18365 (client backend) postgres 51 0 base/16384/16403
18365 (client backend) postgres 52 0 pg_wal/0000000100000001000000E1
问题client backend
负责什么? 每个连接最多一个
client backend
?客户端后端是与客户端通信并代表客户端执行SQL语句的服务器进程。每个数据库会话都有一个客户端后端进程。
然而,客户端后端进程通常不应该写入数据文件:后端只将表数据写入共享缓冲区(缓存),以及"检查指针"。和"背景写手";进程完成了对磁盘的大部分实际写操作。这里的设计思想是,客户机后端不应该被这些潜在的缓慢任务所困扰,而是可以自由地尽可能快地处理SQL语句。当事务提交时,WAL由后端进程编写,否则由WAL编写进程负责。因此,您看到后端执行这些写操作是正常的。
如果后台写入器速度不够快,无法处理工作负载,可能会发生后端进程必须完成一些写入的情况。这不应该经常发生,而应该只在数据修改活动的高峰期间发生。通常,这表明如果增加共享缓冲区的大小,可以提高SQL语句的性能。