更新时间:2024-05-16 GMT+08:00
分享

内存使用率高怎么处理

内存使用率是用来监控GaussDB(for MySQL)实例内存使用情况的关键指标,如果内存使用率过高,会存在内存耗尽风险。

内存使用率高的排查思路

以下排查思路根据原因的出现概率进行排序,建议您从高频率原因往低频率原因排查,从而帮助您快速找到问题的原因。

如果解决完某个可能原因仍未解决问题,请继续排查其他可能原因。

图1 内存使用率高的排查思路

序号

可能原因

解决方案

1

内存相关参数设置不合理。

请参见原因一:内存相关参数设置不合理

2

存在大量消耗内存的查询语句。

请参见原因二:存在大量消耗内存的查询语句

3

开启了消耗内存的特性。

请参见原因三:开启了消耗内存的特性

原因一:内存相关参数设置不合理

GaussDB(for MySQL)中存在许多与内存相关的参数,表1-2列举了部分参数。当这些参数设置不合理时,可能会导致内存利用率过高。
表1 内存相关的参数

序号

参数名称

参数描述

1

innodb_buffer_pool_size

InnoDB buffer pool大小。Global级别,容量不会缩减。

2

table_open_cache

表缓存的最大打开表数量。Global级别,当open_tables等于table_open_cache且opened_tables在不断增大时,可以适当调大table_open_cache。

3

sort_buffer_size

排序buffer大小。Session级别,调大值可以提高排序操作的性能,过大可能会导致内存不足。

针对上述原因,您可以采取以下处理措施:
  1. 内存相关参数值尽量使用默认值。
  2. 根据实际情况,合理配置相关参数。

原因二:存在大量消耗内存的查询语句

一些涉及到排序或者分组的语句会使用到临时表,当并发量过大、查询中间结果过多时,会导致临时表占用过多内存,出现实例OOM风险。

针对上述原因,您可采取以下处理措施:

  • 可以使用EXPLAIN命令检查Extra列是否显示Using Temporary,确定语句是否会用到临时表,对于使用临时表的SQL语句进一步分析查询计划和重写查询语句,尽量减少临时表的使用。表2列举了部分需要使用临时表的SQL语句。
    表2 需要使用临时表的场景

    序号

    场景

    1

    UNION查询。

    2

    用到TEMPTABLE算法或者是UNION查询中的视图。

    3

    ORDER BY和GROUP BY的子句不一样时。

    4

    表连接中,ORDER BY的列不是驱动表中的。

    5

    DISTINCT查询并且加上ORDER BY时。

    6

    SQL中用到SQL_SMALL_RESULT修饰符的查询。

    7

    FROM中的子查询(派生表)。

    8

    子查询或者SEMI-JOIN时创建的表。

    9

    评估多表UPDATE语句。

    10

    评估GROUP_CONCAT()或COUNT(DISTINCT)表达式计算。

  • 创建合适的索引,减小查询结果的数量,来控制临时表使用的内存。
  • 使用LIMIT子句限制查询结果的数量,避免一次性返回大量数据。
  • 对于需要大量使用内存的SQL语句,减小并发度,避免内存突增导致实例OOM。
  • 结合业务情况扩大实例规格。

原因三:开启了消耗内存的特性

部分特性开启会占用一定的内存空间。例如对小规格实例(如:2U4GB),开启performance_schema会带来一定的内存开销,可能会导致内存占用比例明显增大。

针对上述原因,您可以采取以下处理措施:

  • 排查是否开启了消耗内存的特性,如performance_schema、plan cache、ptrc等。根据实际情况,考虑是否需要关闭相应特性。
  • 结合业务情况扩大实例规格。
分享:

    相关文档

    相关产品