【问题标题】:PostgreSQL V12 create temp table runs out of shared memory, can I create on disk?PostgreSQL V12 创建临时表共享内存不足,我可以在磁盘上创建吗?
【发布时间】: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 文件非常相似。

标签: postgresql shared-memory


【解决方案1】:

这些共享内存段用于工作进程与parallel query 之间的通信。

PostgreSQL 似乎资源紧张,虽然错误是一种症状而不是问题的原因,但您可以通过禁用此语句的并行查询来改善这种情况:

SET max_parallel_workers_per_gather = 0;

那么您的查询将花费更多时间,但使用更少的资源,这可能足以解决问题。

从长远来看,您应该检查您的配置,这可能在内存或连接数方面过于慷慨,但我无法从这里诊断。

【讨论】:

  • 您先生,有正确的解决方案。我印象深刻。如果你能到美国俄亥俄州哥伦布市,我会很乐意为你提供一顿合适的饭菜。我不知道该怎么感谢你才足够。这很有启发性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-21
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
  • 2021-05-18
  • 1970-01-01
  • 2015-06-21
相关资源
最近更新 更多