我让PostgreSQL15.3作为停靠容器运行.
我的 docker 运行配置是
-m 512g --memory-swap 512g --shm-size=16g
个
使用这种配置,我加载了36B行,在表和索引之间占用了大约30T. 我加载了大约24个并行操作,PG驱动程序使用连接池,因此有大约150个并发连接,但并不都是活动的. 我的postgresql.conf设置为
max_connections = 512
max_locks_per_transaction = 1024
所有这一切运行起来都没有任何问题.
36B行表是子分区的.包含实际数据的层大约有80,000个表. 父代,按类别划分,每个按年划分,每个按月划分,每个按传感器ID划分,传感器ID是80K个数据表.
我的问题是,在我的一生中,如果没有
out of shared memory, you might need to increase max_locks_per_connection
.事实上,我可以从单个表和月分区进行计数,但不能从年分区进行计数,年分区只有大约10K个表.
读到我需要锁表来保存共享内存中的max_connection * max_locks,我try 降低max_connections,并增加max_locks和共享内存,但没有成功.
目前我在
集装箱-m 512g --memory-swap 512g --shm-size=64g
美元,
max_connections = 8
max_locks_per_transaction = 163840
在配置中,当然是以增量的方式.
我确实有第二个表以相同的方式进行分区,数据量要小得多,但也有80K个表包含数据. 根据我所读到的,大概是这样的
max_connections = 100
max_locks_per_transaction = 1600
应该覆盖160K表,如果每个锁占用168字节,则共享内存至少只需要26M.
对于我应该修改什么以及如何计算目标值,有什么建议吗?