问题描述:
我有一个Redshift RA3 集群,我如何查看这个集群整体的内存使用情况?比如百分比。我如果提交大量的比较重的query,是否会有资源不足导致重启/Hang的情况?尤其是如果使用的内存较大的情况下。
分析过程:
1. 如何查看群集整体的内存使用情况, 如百分比等。
- Redshift Provisioned Cluster并没有监控指标可以查询整体的内存使用情况。
Redshift Provisioned Cluster 通过WLM来管理资源池的内存分配。
如果我们的Redshift使用自动WLM,那么Redshift会自动管理我们业务运行的每个队列(queue)的并发级别和每个已分派查询的内存分配。已分派的查询允许用户定义工作负载或用户对每个查询队列的查询优先级。自动 WLM 确定查询所需的资源量,并根据工作负载调整并发性。
如果我们的Redshift使用手动WLM,那么我们在定义每个队列所分派的内存的时候,需要手动输入这个队列所用到的内存。而所有队列之和必须<= 100%. 如果我们手动将队列所用内存之和设置为大于100%的值,那么会在点击“save”的时候遇到报错:The above configuration has a total of 140 memory, but the total limit for memory across all queues is 100。
当我们使用手动WLM的时候,当Redshift中的query已经用掉了所有的查询槽,那么未分配的内存会由Redshift自行管理。如果某个队列请求额外内存,那么Redshift可能将未分配的内存临时分配给队列。(自动WLM不会出现“额外内存”,因为所有内存均为Redshift管理。)
我们可以通过Console上的Configurations - Workload management来查看Redshift cluster所使用的参数组对应的WLM设置。
或者,我们可以执行如下语句来查询WLM配置:
select rtrim(name) as name,
num_query_tasks as slots,
query_working_mem as mem,
max_execution_time as max_time,
user_group_wild_card as user_wildcard,
query_group_wild_card as query_wildcard
from stv_wlm_service_class_config;
2. 如果提交大量的比较重的query,是否会有资源不足导致重启/Hang的情况?尤其是如果使用的内存较大的情况下。
- 这个可能性还是存在的:
2.1 首先是:我们Query可能遇到资源不足而执行缓慢,可能因为超时而被kill掉,或者我们的Query本身可能遇到OOM:
当Query执行遇到内存不足状况时,query可能会开始使用磁盘,我们可以通过查询SVL_QUERY_SUMMARY 中的查询执行计划的 is_diskbased 值,查看其是否为“true”。如果 为“true”,则考虑为查询分配更多内存。
我们可以通过增加使用的查询槽数来分配更多内存,例如:set wlm_query_slot_count to 3; 而最佳实践是,首先确定导致磁盘溢出的步骤。然后,确定为队列分配更多内存是否可以解决此问题。或者,也可以优化查询,使其占用更少资源。
当我们的查询执行时间长于statement_timeout/max_execution_time/qiuery_execution_time 参数设置时,那么我们会看到如下报错:ERROR: Query (150) canceled on user's request
或者,我们的Query可能返回会出现OOM的报错:error: Insufficient memory to run query: consider increasing compute size or re-write the query (Out of Memory)
2.2 相比而言,Redshift节点本身出现OOM的可能性相对较低。节点OOM可能因高并发的query,本身耗费很多内存的user query,optimizer没有生成正确的execution plan,以及query本身用了很多view which depending on other view的少数情形。
参考文档:
[1] https://repost.aws/zh-Hans/knowledge-center/redshift-wlm-memory-allocation
[2] https://www.repost.aws/questions/QUe2mHTu_nReyXiy95znu5Kg/redshift-out-of-memory-when-running-query
[3] https://docs.amazonaws.cn/redshift/latest/dg/tutorial-wlm-query-slot-count.html#tutorial-wlm-override-slot-count
[4] https://docs.amazonaws.cn/redshift/latest/dg/automatic-wlm.html