Postgres walwriter和后台writer使用内存

Postgres walwriter and background writer using memory

我刚刚为 osm 服务器导入了大量渲染图块。我想开始我的下一个过程(运行 nominatim 的导入)但它需要大量内存。我遇到的问题是 walwriter、background writer、checkpointer 消耗了 131GB 的内存。我检查了 pg_top 并且进程正在休眠。有什么方法可以安全地清除这些进程,或者只是强制 postgres 完成 walwriter 和 background writer?

我正在使用 Postgres v12,shared_buffers 设置为 128GB。

HTOP: pg_top:

last pid: 628600;  load avg  0.08,  0.03,  0.04;       up 1+00:31:38                                                                                02:22:22
5            5 sleeping
CPU states:  0.0% user,  0.0% nice,  0.0% system,  100% idle,  0.0% iowait
Memory: 487G used, 16G free, 546M buffers, 253G cached
DB activity:   0 tps,  0 rollbs/s,   0 buffer r/s, 100 hit%,     43 row r/s,    0 row w/s  -
DB I/O:     0 reads/s,     0 KB/s,     0 writes/s,     0 KB/s
DB disk: 3088.7 GB total, 2538.8 GB free (17% used)
Swap: 45M used, 8147M free, 588K cached


627692 postgres  20    0  131G 4368K sleep   0:00  0.00%  0.00% postgres: 12/main: background writer
627691 postgres  20    0  131G 6056K sleep   0:00  0.00%  0.00% postgres: 12/main: checkpointer
627693 postgres  20    0  131G 4368K sleep   0:00  0.00%  0.00% postgres: 12/main: walwriter
628601 postgres  20    0  131G   11M sleep   0:00  0.00%  0.00% postgres: 12/main: postgres postgres [local] idle
627695 postgres  20    0  131G 6924K sleep   0:00  0.00%  0.00% postgres: 12/main: logical replication launcher

pg_wal目录:

一切都很好,htop在骗你

当然,访问共享缓冲区的后台进程将使用该内存,并且由于它是共享内存,因此会为这些进程中的每一个报告。实际上,它只分配了一次。

PostgreSQL 分配的共享内存比 shared_buffers 稍大,所以如果该参数设置为 128GB,则您报告的数据有意义并且完全正常。

如果设置max_wal_size = 32GB,WAL段多是正常的