更新时间:2024-07-01 GMT+08:00
集群报错内存溢出
问题现象
查看日志提示:
[ERROR] Mpp task queryDataAnalyseById or updateDataAnalyseHistoryEndTimesAndResult fail, dataAnalyseId:17615 org.postgresql.util.PSQLException: ERROR: memory is temporarily unavailable sql:vacuum full dws_customer_360.t_user_resource;
原因分析
存在部分SQL语句使用内存资源过多,造成内存资源耗尽,其余语句执行作业时无法分配到内存就提示内存不足。
处理方法
- 调整业务执行时间窗,与高并发执行业务的时间错峰执行。
- 查询当前集群的内存使用情况,找到内存使用过高的语句并及时终止,释放资源之后集群内存就会恢复。具体的操作步骤如下:
- 8.1.1及之前集群版本连接数据库后执行以下步骤:
- 执行以下语句查询当前集群的内存使用情况,观察是否有实例的dynamic_used_memory已经大于或者接近于该实例的max_dynamic_memory,出现上述报错,一般为dynamic_used_memory达到上限。
1
SELECT * FROM pgxc_total_memory_detail;
- 开启topsql的情况下,使用实时topsql查询正在执行的高内存query语句,根据结果中的max_peak_memory以及memory_skew_percent值,较大的值就是消耗内存较多的语句。
1
SELECT nodename,pid,dbname,username,application_name,min_peak_memory,max_peak_memory,average_peak_memory,memory_skew_percent,substr(query,0,50) as query FROM pgxc_wlm_session_statistics;
- 根据步骤2查询的会话信息,通过执行pg_terminate_backend函数结束相应会话,即可恢复内存。恢复后可根据实际业务情况重新优化该SQL语句。
SELECT pg_terminate_backend(pid);
- 8.1.2及以上集群版本支持登录GaussDB(DWS) 管理控制台,在实时查询监控页面执行以下步骤:
- 实时查询仅8.1.2及以上集群版本支持。
- 启动实时查询功能需要在“监控设置>监控采集”页面打开“实时查询监控”指标项。
- 登录GaussDB(DWS) 管理控制台,在“集群管理”页面,找到需要查看监控的集群,在集群所在行的“操作”列,单击“监控面板”,系统将显示数据库监控页面。
- 在左侧导航栏选择“监控 > 实时查询”,进入实时查询监控页面。
- 根据选择的指定时间段浏览集群中正在运行的所有查询信息。
- 单击指定实时查询监控的会话查询ID,进入该会话ID的实时查询的详情页面,在详情页面中会展示当前监控的详细内容。例如用户名称、数据库名称、执行时间、查询语句、查询状态、排队状态、dn最小内存峰值、dn最大内存峰值、dn每秒最大io峰值、dn每秒最小io峰值和内存使用平均值等信息。
根据“dn最大内存峰值”和“内存使用平均值”查询结果,值较大的就是消耗内存较多的语句。
- 如果已确认所查询的占用内存高的语句需要被终止,勾选指定的查询ID后,单击“终止查询”按钮,终止查询。
如果设置了细粒度权限控制功能,只有配置了操作权限的用户才能使用终止查询按钮。只读权限用户登录后终止查询按钮为灰色。
父主题: 集群性能