排查 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_cache、table_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_pool 或 kill_query 与 kill_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_management 是 ON(默认值),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.05 | Small | print,tune | print |
| 大型 | (已禁用) | (已禁用) | |
| Aurora MySQL 3.06 | Small | print,tune,decline,kill_connect | print |
| 大型 | (已禁用) | (已禁用) | |
| Aurora MySQL 3.07 | Small | print,tune,decline,kill_connect | print |
| 大型 | print | print | |
| Aurora MySQL 3.08 | Small | print,tune,tune_buffer_pool,decline,kill_connect | print |
| 大型 | print | print | |
| Aurora MySQL 3.09–Aurora MySQL 3.10 | Small | print,tune,tune_buffer_pool,decline,kill_connect | print |
| 大型 | print,decline,kill_connect | print,decline,kill_connect | |
| Aurora MySQL 3.11+ | Small | print,tune,tune_buffer_pool,decline,kill_connect | print,decline,kill_connect |
| 大型 | print,decline,kill_connect | print,decline,kill_connect |
Aurora Serverless v2
Aurora Serverless v2 不支持 tune 和 tune_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/meminfo 的 MemAvailable 值。 | 字节 |
SwapUsage | 已使用的交换空间量。 | 字节 |
有关 Aurora MySQL 实例级指标的完整列表,请参阅 Amazon Aurora 的实例级指标。
全局状态变量
以下状态变量提供有关 OOM 状态的信息。在 Aurora MySQL 版本 3.06.0 及更高版本中可用。
| 变量 | 说明 |
|---|---|
Aurora_oom_response | 此数据库实例当前活动的 OOM 响应操作。 |
aurora_oom_avoidance_recovery_state | OOM 恢复是 ACTIVE 还是 INACTIVE。 |
aurora_oom_status | 数据库的当前内存运行状况:正常(无内存压力)、中等内存压力或临界内存压力。仅在版本 3 中提供。 |
要进行查询,请使用:SHOW GLOBAL STATUS LIKE 'aurora_oom%';
有关 Aurora MySQL 全局状态变量的完整列表,请参阅 Aurora MySQL 全局状态变量。
性能详情
如果启用了性能详情,则可以使用操作系统级别的内存指标来监控内存压力和检测 OOM 事件。os.memory 和 os.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 数据库的内存使用问题。