Greenplum错误“由于较高的VMEM使用率而取消了查询。”

问题描述 投票:0回答:2

我们有一个小的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

    这对segmenthost上的内存消耗没有任何影响。我们通过以下查询进行跟踪:

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,但session_state.session_level_memory_consumption表中的内存消耗显示段的较高值,直到再次发生该错误时,我们在表'gp_toolkit.gp_resqueue_status'中看到。

有人提示您解决此问题吗?

greenplum
2个回答
0
投票

每个查询将要求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%(或95%)时,失控检测器将开始取消查询,以保护主进程免遭OS OOM Kill。

要“解决”问题(实际上这不是问题),您可以

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

2)增加段主机上的RAM,以便可以增加gp_vmem_protect_limit。


0
投票

为什么不使用资源组,您启用了它们吗?

© www.soinside.com 2019 - 2024. All rights reserved.