谷歌云SQL PG11:无法调整共享内存段大小

8
我最近在Google Cloud SQL上将Postgres 9.6实例升级到11.1。自那以后,我开始注意到多个查询中出现了大量以下错误: org.postgresql.util.PSQLException: ERROR: could not resize shared memory segment "/PostgreSQL.78044234" to 2097152 bytes: No space left on device 据我所知,这可能是由于PG10带来的更改导致的,典型的解决方案涉及增加实例的共享内存。但据我所知,在Google Cloud SQL上不可能实现这一点。我还尝试调整work_mem,但没有积极的效果。
这可能并不重要,但为了完整起见,该实例配置有30GB的RAM,120GB的SSD硬盘空间和8个CPU。我认为Google会为这些规格提供适当的共享内存设置,但也许不是吗?有什么想法?

更新 将数据库标记random_page_cost设置为1似乎减少了该问题的影响。不过这并不是一个完整的解决方案,如果有更好的解决方法仍然希望得到。感谢这篇博客文章提供的思路。

更新2 原始问题报告已关闭,并创建了一个对公众不可见的新内部问题。但根据GCP账户经理的邮件回复,Google在2019年8月11日推出了修复程序。


谢谢@Nick。一切都正常吗?修复程序适用于旧实例吗? - eamon1234
2个回答

10

这对我很有帮助,我认为谷歌需要更改一个标志,在他们的端口上启动postgres容器时,我们无法在postgres内部进行影响。

https://www.postgresql.org/message-id/CAEepm%3D2wXSfmS601nUVCftJKRPF%3DPRX%2BDYZxMeT8M2WwLSanVQ%40mail.gmail.com

真是太好了。 你的容器技术某种程度上限制了共享内存。这个错误的设计是有效的。您可以找出如何修复挂载选项,或者通过将max_parallel_workers_per_gather设置为0来禁用并行性。

show max_parallel_workers_per_gather;
-- 2
-- Run your query
-- Query fails
alter user ${MY_PROD_USER} set max_parallel_workers_per_gather=0;
-- Run query again -- query should work
alter user ${MY_PROD_USER} set max_parallel_workers_per_gather=2;
-- -- Run query again -- fails

是的,那确实有效。但我真的非常希望谷歌能够稍微调整一下他们的图像,因为这似乎会消耗升级到pg11的性能提升的大部分优势。 - Nick
同意!对我来说,分区是短期内的重大收获,所以如果没有其他问题,我可以接受它。 - eamon1234
接受这个答案。虽然不是完美的,但它确实可以工作! - Nick
2
我大约一个月前已经向Google报告了这个问题,并提交了一个错误报告。看起来它已经被分配给某个人,但是谁知道要多久才会得到解决。https://issuetracker.google.com/issues/132367953我不知道这是否真的有帮助,但如果您受到此影响,收藏链接的问题可能会提高优先级并加快解决时间。 - Nick
酷,标星了。已经在生产环境中上线了,有11个,除此之外都很好(手指交叉!)。 - eamon1234
看起来谷歌已经承认了这个问题并开始着手解决! - Nick

1
您可以考虑增加实例的层级, 这将影响机器内存、vCPU核心和可用于您的Cloud SQL实例的资源。请查看可用的机器类型
在Google Cloud SQL PostgreSQL中,也可以更改数据库标志,这会影响内存消耗:
- max_connections:一些内存资源可以分配给每个客户端,因此最大客户端数建议最大可能的内存使用 - shared_buffers:确定用于缓存数据的PostgreSQL所使用的内存量 - autovacuum - 应该开启
我建议降低限制以降低内存消耗。

我真的希望我的层实例不是问题,因为30gigs / 8cpu并不算小。您有任何具体建议,关于如何调整这些数据库标志吗? - Nick
1
@PawelCzuczwara 你发布的链接是关于mysql的。我尝试了几个postgres标志:work_mem 1000000000、temp_file_limit 1000000000、temp_buffers 100000000、parallel_setup_cost 1000000000、random_page_cost 1。并将核心数量从2个提升到8个,但没有效果。 - eamon1234
您是否不应该尝试降低限制?对不起,那些层级适用于所有数据库类型:https://cloud.google.com/sql/pricing - Pawel Czuczwara

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接