我们有一个小的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)
我们尝试了什么:
我们使用以下信息计算Greenplum参数:https://gpdb.docs.pivotal.io/6-3/best_practices/sysconfig.html
这有助于我们进行一些“简单”的查询,但对于更复杂的查询,错误再次发生。
在下一步中,我们配置了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;
内存消耗非常快地增加,并且错误再次发生。
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'中看到。
有人提示您解决此问题吗?
每个查询将要求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。
为什么不使用资源组,您启用了它们吗?