【问题标题】:Greenplum error "Canceling query because of high VMEM usage."Greenplum 错误“由于 VMEM 使用率高而取消查询。”
【发布时间】:2020-05-12 23:36:05
【问题描述】:

我们有一个小型 Greenplum 集群,其中一些查询中止。

系统相关信息:

Greenplum Version: 6.3
Master Host: 1
Segment Host: 2
RAM per Segmenthost: 32GB
SWAP per Segmenthost: 32GB
TOTAL segment: 8 Primary + 0 mirror
segment per host: 4

vm_overcommmit_ratio: 95
gp_vmem_protect_limit: 8072MB
statement_mem: 250MB

查询由非超级用户执行。

症状:

查询失败,出现以下错误消息:

Canceling query because of high VMEM usage. Used: 7245MB, available 801MB, red zone: 7264MB (runaway_cleaner.c:189) 

我们尝试了什么:

  1. 我们使用以下信息计算 Greenplum 参数:https://gpdb.docs.pivotal.io/6-3/best_practices/sysconfig.html

    这有助于我们进行一些“简单”的查询,但对于更复杂的查询,错误再次发生。

  2. 在下一步中,我们配置了 max_statement_mem:2000MB

    这对段主机的内存消耗没有任何影响。我们通过以下查询跟踪这一点:

select segid, sum (vmem_mb) from session_state.session_level_memory_consumption
where query like '%<some snippet of the query>%'
group by segid
order by segid;

内存消耗增加非常快,错误再次发生。

  1. 我们尝试通过为用户设置以下资源队列来限制内存消耗:
CREATE RESOURCE QUEUE adhoc with (ACTIVE_STATEMENTS=6, MEMORY_LIMIT=6291);
ALTER ROLE user1 RESOURCE QUEUE adhoc;

数据库设置为使用参数gp_resource_manager: queue的资源队列

当我们执行“rsqmemoryvalue”为 1048 的语句时,我们在表“gp_toolkit.gp_resqueue_status”中看到,但 session_state.session_level_memory_consumption 表中的内存消耗显示段的更高值,直到再次发生错误。

有没有人可以解决这个问题?

【问题讨论】:

  • 为什么不使用资源组,你启用了吗?
  • 感谢您的提示。我会尝试并给你反馈。

标签: greenplum


【解决方案1】:

每个查询都会要求 250MB 内存,并且您将 gp_vmem_protect_limit 设置为 8GB。在这种情况下,您可能可以同时运行 (8GB- 主进程内存)/250MB =~ 20-30 个查询。主进程的大小取决于其他设置,shared_buffers, wal_buffers,...

Statement_mem 可以在会话中设置。这意味着一些用户可以将 statement_mem 设置得更高(最高可达 max_statement_mem),您将看到更少的并发查询。
当分配给这些并发查询的内存达到 gp_vmem_protect_limit 的 90(OR 95)% 时,失控检测器将开始取消查询以保护主进程免受 OS OOM Kill。

要“修复”问题(实际上不是问题),您可以

1) 设置较低的默认 statement_mem,以便您可以同时运行更多查询但速度较慢。

2) 增加段主机上的 RAM,这样您就可以增加 gp_vmem_protect_limit。

【讨论】:

  • 或减少每台主机的主要段数。 8 段只有 32GB 的 RAM 是个问题。
  • 感谢您的快速响应和不同参数的解释。不幸的是,我并不完全理解这一点。当在 greenplum 上只执行一个查询时,就会出现问题。没有其他使用资源的查询,并且 statement_mem 参数不会在数据库会话中被覆盖。默认 statement_mem 参数被忽略,执行的语句在每个段中占用超过 7GB 的 RAM 并且失败。如果我通过执行'set statement_mem'覆盖会话中的statement_mem,它也没有效果。
  • 如果您只有 1 个查询,gpdb 将为您提供默认资源队列中可用的任何内容。从你的上下文来看,你有过度提交的记忆。你有 32G 的物理内存,但是你的过载率给你大约 64G 的地址空间。当您在 gpdb 中查询时,默认 statement_mem 生效,但在查询需要时可能需要更多内存。 Gpdb 认为我有 64G ram 用于查询,但在使用 32G ram 时会遇到问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-13
相关资源
最近更新 更多