【发布时间】:2020-01-16 14:18:29
【问题描述】:
在 RHEL 7 上运行 PostgreSQL 版本 12 系统有28G内存,12G共享内存 DB在磁盘上使用超过6T 有些行有大约 3 亿行。
将我的数据库从版本 9 移至版本 12,并在新数据库上运行测试。我们有一个在临时表中生成摘要数据的过程,然后我们在临时表中查询不同的内容,然后我们删除临时表 - 比多次运行非常相似的查询要快得多,这就是这样做的原因。
他们的查询是这样的:
CREATE TEMPORARY TABLE
XXX
AS
SELECT
COUNT(t.id) AS count,
t.tagged AS tagged,
t.tag_state AS tag_state,
t.error AS error,
td.duplicate AS duplicate
FROM
ttt t
INNER JOIN tweet_data td ON (td.tweet_id = t.id)
GROUP BY
t.tagged,
t.tag_state,
t.error,
td.duplicate;
请注意,这在 V9 上运行良好,但是,我没有在 V9 上仔细观察过它的作用。在 V12 上,共享内存使用量增长缓慢,然后在大约 15 分钟后进入高速档,增长到大约 12G,然后尝试使其更大并失败:
错误是: 错误:无法将共享内存段“/PostgreSQL.868719775”的大小调整为 2147483648 字节:设备上没有剩余空间
一时兴起,我们只运行了 select 语句而没有创建临时表,并且在共享内存增加时它也失败了,但是,错误消息说它被管理员杀死了。
我目前正在对数据库运行真空,看看是否有帮助。
最大的担忧是这确实适用于 V9,但在 V12 上却失败了。我也知道他们的查询引擎在 V12 中与 V9 相比是非常不同和新的。
我有一些疯狂的希望,分阶段运行真空会有所作为。使用 pg_upgrade 迁移数据。
vacuumdb -U postgres -p 5431 --all --analyze-in-stages
我不知道是否创建了临时表,但是在运行 Vacuum 之后,我们再次运行了完整的查询来创建临时表,它也失败了。
有什么想法吗?尝试更多共享内存是我唯一的选择吗?
【问题讨论】:
-
如果这在您以前的版本上有效并且不适用于新版本,那么您需要比较旧安装和新安装之间的配置(
postgresql.conf)。我猜你在“v9”中增加了几个与内存相关的配置设置,但没有为 Postgres 12 调整它们 -
“拥有 12G 共享内存”到底是什么意思?如果您指的是
shared_buffers,那么该设置与 GROUP BY 聚合所需的内存无关。 -
机器有 12 GB 的共享内存可用。使用“df -h /dev/shm”显示 12 GB 可用。此外,命令:“ipcs -lm”显示大量允许。随着命令继续运行,我看到正在使用的共享内存量增加(使用 htop 或 df)直到它用完。
-
(postgresql.conf) 中的值在 v9 和 v12 中相同(或非常相似)。 V12 似乎有一些新参数,但这些值看起来相同或相似。我们迁移到 V12 是因为它有一个全新的查询实现(或者我是这么读的)。
-
a_horse_with_no_name,我再次验证了 conf 文件非常相似。