View a markdown version of this page

排查 Aurora MySQL 数据库内存不足问题 - Amazon Aurora

排查 Aurora MySQL 数据库内存不足问题

当 Aurora MySQL 数据库实例的内存严重不足时,操作系统会终止数据库进程,从而导致意外的重启。为了防止这些重启,Aurora MySQL 包含内存管理功能,可以监控系统内存,并在内存不足时自动执行恢复操作。这些操作有助于防止由于内存耗尽而导致数据库不可用。

以下参数控制此行为:

  • aurora_enable_memory_management:仅在 Aurora MySQL 8.4 上可用。

    • 值为 ON(默认值)时,Aurora 会自动管理内存恢复操作,并且忽略 aurora_oom_response 参数。

    • 设置为 OFF 可通过 aurora_oom_response 手动控制恢复操作。

  • aurora_oom_response:逗号分隔的恢复操作列表。空字符串将禁用所有操作。在 Aurora MySQL 版本 3 中可用。在 Aurora MySQL 8.4 中同样可用,但只有在将 aurora_enable_memory_management 设置为 OFF 时才会考虑。

OOM 响应操作

以下操作可以包含在 aurora_oom_response 中,按激进程度从低到高列出。

处理建议 作用 备注
print 将内存密集型查询和连接记录到错误日志。不终止任何查询或连接。 在 Aurora MySQL 版本 3 和 8.4 中可用。
tune 缩小内部表缓存(table_open_cachetable_definition_cache)以释放内存。当内存恢复正常时,缓存大小就会恢复。先前缓存的条目不会恢复;只有在后续查询访问新条目时才会添加新条目。 在 Aurora MySQL 版本 3 和 8.4 中可用。仅限预调配实例,Serverless v2 不支持。
tune_buffer_pool 缩小 InnoDB 缓冲池以释放内存。当内存恢复正常时,缓冲池大小就会恢复。先前已被驱逐的缓存页面不会自动重新加载;只有当后续查询访问时,新页面才会被缓存。 仅适用于 Aurora MySQL 版本 3(3.06 和更高版本)和 Aurora MySQL 版本 8.4。仅在具有 2 个 vCPU 的预调配实例上受支持。Serverless v2 不支持。
decline 在内存不足时,拒绝新查询并报错。 在 Aurora MySQL 版本 3 和 8.4 中可用。
kill_query 终止正在运行的 SELECT 查询,从内存消耗量最高的查询开始,直到内存恢复正常。DDL、其他 DML 和事务不受影响。 在 Aurora MySQL 版本 3 和 8.4 中可用。与 kill_connect 互斥,同时设置两者时仅 kill_connect 生效。
kill_connect 终止用户连接,回滚其活动事务并终止 DDL 语句。 请参阅下面的特定于版本的行为。
重要

您必须在 aurora_oom_response 参数值中将 tune_buffer_poolkill_querykill_connect 进行配对。如果未使用其中任意一个参数,则即使包含 tune_buffer_pool,也不会对缓冲池进行大小调整。

kill_connect 特定于版本的行为

Aurora MySQL 版本 行为
Aurora MySQL 3.04 – Aurora MySQL 3.10 终止用户连接以释放足够的内存,从而让数据库从内存压力中恢复。
Aurora MySQL 3.11+、Aurora MySQL 8.4 终止用户连接以释放足够的内存,从而让数据库从内存压力中恢复。还会终止任何在内存压力期间尝试分配内存的用户连接。

在 Serverless v2 上,Aurora 通过首先扩展 ACU 以提供额外的内存来应对内存压力。如果在扩展过程中持续面临内存压力,Aurora 可能会终止现有连接以恢复内存。只有当实例达到其配置的最大 ACU 限制且无法再进一步扩展时,才会终止尝试分配内存的连接。

按版本列出的默认值

Aurora MySQL 会根据引擎版本、实例类型和可用内存自动配置 aurora_oom_response

在 Aurora MySQL 8.4 中,如果 aurora_enable_memory_managementON(默认值),Aurora 会自动管理内存恢复操作,并且不使用 aurora_oom_response 值。设置为 OFF 时,Aurora 会直接使用 aurora_oom_response 值,默认情况下该值为空,这意味着除非您明确进行配置,否则不会采取任何恢复操作。以下默认表仅适用于 Aurora MySQL 版本 3。

小型实例阈值:对于版本 3.04 和 3.05 版本 ≤2 GiB。对于版本 3.06 及更高版本 ≤4 GiB。

大型实例阈值:对于版本 3.04 和 3.05 版本 >2 GiB。对于版本 3.06 及更高版本 >4 GiB。

版本 实例大小 已预置 Serverless v2
Aurora MySQL 3.04–Aurora MySQL 3.05Smallprint,tuneprint
大型(已禁用(已禁用
Aurora MySQL 3.06Smallprint,tune,decline,kill_connectprint
大型(已禁用(已禁用
Aurora MySQL 3.07Smallprint,tune,decline,kill_connectprint
大型printprint
Aurora MySQL 3.08Smallprint,tune,tune_buffer_pool,decline,kill_connectprint
大型printprint
Aurora MySQL 3.09–Aurora MySQL 3.10Smallprint,tune,tune_buffer_pool,decline,kill_connectprint
大型print,decline,kill_connectprint,decline,kill_connect
Aurora MySQL 3.11+Smallprint,tune,tune_buffer_pool,decline,kill_connectprint,decline,kill_connect
大型print,decline,kill_connectprint,decline,kill_connect

Aurora Serverless v2

Aurora Serverless v2 不支持 tunetune_buffer_pool 操作。所有其他操作的工作方式与在预调配实例上相同。

当实例扩展其 ACU 时,内存阈值会动态调整。上面默认值表中的 Serverless v2 列显示了每个版本的有效默认值。

监控

您可以通过以下方法监控避免 OOM 活动。

错误日志

在执行内存恢复操作时,Aurora MySQL 会将消息写入数据库错误日志。消息前缀因版本而异,在将来版本中可能会有变化:

  • Aurora MySQL 版本 3:消息的前缀为 OOM crash avoidance:

  • Aurora MySQL 版本 8.4:消息的前缀为 Aurora memory management:

这些消息包括:

  • 检测到内存压力并已恢复的通知,包含总内存和可用内存

  • 为恢复内存而终止的查询或连接的详细信息

  • print 操作确定的备选查询

要查看错误日志,请参阅 Aurora MySQL 错误日志

Amazon CloudWatch 指标

以下 CloudWatch 指标在实例级别跟踪避免 OOM 活动。

指标说明可用自单位
AuroraMemoryHealthState指示内存运行状况。0 表示运行正常(无内存压力),5 表示中等内存压力,10 表示临界内存压力。Aurora MySQL 3.06.1+、Aurora MySQL 8.4计量表
AuroraMemoryNumDeclinedSqlTotal为避免 OOM 而拒绝的增量查询数。Aurora MySQL 3.06.1+、Aurora MySQL 8.4计数
AuroraMemoryNumKillConnTotal为避免 OOM 而关闭的增量连接数。Aurora MySQL 3.06.1+、Aurora MySQL 8.4计数
AuroraMemoryNumKillQueryTotal为避免 OOM 而终止的增量查询数。Aurora MySQL 3.06.1+、Aurora MySQL 8.4计数
AuroraMillisecondsSpentInOomRecovery内存运行状况降到正常状态之下的时间量。Aurora MySQL 3.08.0+、Aurora MySQL 8.4毫秒
AuroraNumOomRecoverySuccessful内存运行状况恢复到正常状态的次数。Aurora MySQL 3.08.0+、Aurora MySQL 8.4计数
AuroraNumOomRecoveryTriggered内存运行状况降至低于正常状态的次数。Aurora MySQL 3.08.0+、Aurora MySQL 8.4计数

以下常规 CloudWatch 指标也可用于监控内存压力情况:

指标说明单位
FreeableMemory可用内存量。报告来自 /proc/meminfoMemAvailable 值。字节
SwapUsage已使用的交换空间量。字节

有关 Aurora MySQL 实例级指标的完整列表,请参阅 Amazon Aurora 的实例级指标

全局状态变量

以下状态变量提供有关 OOM 状态的信息。在 Aurora MySQL 版本 3.06.0 及更高版本中可用。

变量说明
Aurora_oom_response此数据库实例当前活动的 OOM 响应操作。
aurora_oom_avoidance_recovery_stateOOM 恢复是 ACTIVE 还是 INACTIVE
aurora_oom_status数据库的当前内存运行状况:正常(无内存压力)、中等内存压力或临界内存压力。仅在版本 3 中提供。

要进行查询,请使用:SHOW GLOBAL STATUS LIKE 'aurora_oom%';

有关 Aurora MySQL 全局状态变量的完整列表,请参阅 Aurora MySQL 全局状态变量

性能详情

如果启用了性能详情,则可以使用操作系统级别的内存指标来监控内存压力和检测 OOM 事件。os.memoryos.swap 计数器下提供了以下指标:

指标说明
os.memory.outOfMemoryKillCount在上次收集间隔内的 OOM 终止次数。非零值表示操作系统由于内存耗尽终止了某个进程,这通常会导致数据库重新启动。
os.memory.total内存总量 (以 KB 为单位)。
os.memory.free未分配的内存量 (以 KB 为单位)。
os.memory.active已分配的内存量 (以 KB 为单位)。
os.memory.cached用于缓存文件系统 I/O 的内存量,以 KB 为单位。
os.memory.dirty已修改但未写入存储中的内存页面大小,以 KB 为单位。
os.memory.inactive最不常用内存页面大小 (以 KB 为单位)。
os.memory.db.residentSetSize数据库进程使用的内存量(不包括共享内存),以字节为单位。
os.memory.db.cache数据库进程用于页面缓存的内存量,以字节为单位。
os.memory.db.swap数据库进程使用的交换内存量,以字节为单位。
os.swap.in从磁盘换入的内存量,以 KB 为单位。
os.swap.out换出到磁盘的内存量,以 KB 为单位。

您可以通过监控 os.memory.outOfMemoryKillCount 来检测操作系统何时由于内存不足而终止了数据库进程。有关操作系统计数器的完整列表,请参阅性能详情操作系统指标

性能模式

如果启用了 performance_schema,则可以使用内存摘要表来确定哪些组件和连接消耗的内存最多。有关更多信息,请参阅 排查 Aurora MySQL 数据库的内存使用问题