降低内存的处理方案
如果当前集群内存负载较高,或出现“memory is temporary unavailable”内存报错,首先利用日志信息确定内存异常节点,然后连接到该节点查询pv_total_memory_detail视图确认当前是否还存在内存不足问题,可比较process_used_memory和max_process_memory的关系,如前者明显小于后者,则说明占用内存大的语句已经跑完或者被杀掉,当前系统已经恢复,若已经大于或比较接近,则说明当前内存使用已经或即将超限,若此时dynamic_used_memory过大,说明动态申请的内存过大,这类问题可能和正在运行的SQL强相关,此时可参考如下步骤进行优化:
- 检查当前集群业务是否占用内存过高。
- 登录GaussDB(DWS)管理控制台。
- 在“监控 > 告警”界面,单击右上角“集群选择”下拉框,选中告警集群,查看集群最近7天的告警信息,通过定位信息锁定触发告警的节点名称。
- 在“专属集群 > 集群列表”界面找到告警集群,在所在行操作列单击“监控面板”进入监控界面。
- 选择“监控 > 节点监控 > 概览”可查看当前集群各节点CPU使用率的具体情况,单击最右的监控按钮,查看最近1/3/12/24小时的CPU性能指标,判断是否有CPU使用率突然增大的情况。
- 设置异常规则及时终止高内存语句。
防止极端场景下某些语句使用内存过多,导致其他语句由于内存分配不足而出现算子下盘执行缓慢或者申请不到内存而执行失败的情况,可创建与内存资源相关的异常规则,具体操作可参考异常规则,对超过异常规则阈值的SQL进行及时终止拦截,保持集群稳定。
- 分析计划,优化语句。
- 对语句中的相关表进行ANALYZE,矫正内存估算情况,避免该语句申请内存过大导致内存超限报错。
- 是否完全下推,参考使排序下推。
- 是否存在对数据量大的表执行broadcast。
- 是否有不合理的join顺序。例如,多表关联时,执行计划中优先关联的两表的中间结果集比较大,导致最终执行代价比较大。
- 根据业务场景适当降低作业并发量。