更新时间: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语句使用内存资源过多,造成内存资源耗尽,其余语句执行作业时无法分配到内存就提示内存不足。

处理方法

  1. 调整业务执行时间窗,与高并发执行业务的时间错峰执行。
  2. 查询当前集群的内存使用情况,找到内存使用过高的语句并及时终止,释放资源之后集群内存就会恢复。具体的操作步骤如下:
  • 8.1.1及之前集群版本连接数据库后执行以下步骤:
  1. 执行以下语句查询当前集群的内存使用情况,观察是否有实例的dynamic_used_memory已经大于或者接近于该实例的max_dynamic_memory,出现上述报错,一般为dynamic_used_memory达到上限。

    1
    SELECT * FROM pgxc_total_memory_detail;
    

  2. 开启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; 
    

  3. 根据步骤2查询的会话信息,通过执行pg_terminate_backend函数结束相应会话,即可恢复内存。恢复后可根据实际业务情况重新优化该SQL语句。

    SELECT pg_terminate_backend(pid);

  • 8.1.2及以上集群版本支持登录GaussDB(DWS) 管理控制台,在实时查询监控页面执行以下步骤:
  • 实时查询仅8.1.2及以上集群版本支持。
  • 启动实时查询功能需要在“监控设置>监控采集”页面打开“实时查询监控”指标项。
  1. 登录GaussDB(DWS) 管理控制台,在“集群管理”页面,找到需要查看监控的集群,在集群所在行的“操作”列,单击“监控面板”,系统将显示数据库监控页面。
  2. 在左侧导航栏选择“监控 > 实时查询”,进入实时查询监控页面。
  3. 根据选择的指定时间段浏览集群中正在运行的所有查询信息。
  4. 单击指定实时查询监控的会话查询ID,进入该会话ID的实时查询的详情页面,在详情页面中会展示当前监控的详细内容。例如用户名称、数据库名称、执行时间、查询语句、查询状态、排队状态、dn最小内存峰值、dn最大内存峰值、dn每秒最大io峰值、dn每秒最小io峰值和内存使用平均值等信息。

    根据“dn最大内存峰值”和“内存使用平均值”查询结果,值较大的就是消耗内存较多的语句。

  5. 如果已确认所查询的占用内存高的语句需要被终止,勾选指定的查询ID后,单击“终止查询”按钮,终止查询。

    如果设置了细粒度权限控制功能,只有配置了操作权限的用户才能使用终止查询按钮。只读权限用户登录后终止查询按钮为灰色。