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