Aurora MySQLでストアドプロシージャ実行時にメモリ不足によりRDSインスタンスが落ちてしまいます。
エンジンバージョン:8.0.mysql_aurora.3.04.1
ストアドプロシージャ内で大きなテーブルのINSERT SELECTステートメントを実行しており、テーブルサイズに応じてメモリが消費されます。
(今回の場合は10GBほど消費されます。)
db.r5.xlargeのFreeableMemoryが8GB程度しかない為、メモリ不足になり、OOM KillerによってAuroraインスタンスが落ちてしまいます。
Available memory is low. Trying to avoid OOM crash: system KB: 32387536 available KB: 0 low-threshold KB: 1619376 print victim: no decline query: no tune caches: no kill query: no kill connection: no
OOM crash avoidance result: success: no num success: 5 system KB: 32387536 available KB: 0 low-threshold KB: 1619376 recovery time: 11 num declined query: 0 num killed query: 0 num killed connection: 0
{
"report_time": "2024-02-20 12:46:49 UTC",
"report_version": "1.0",
"system_report": {
"total_mem_kb": 32387536,
"free_mem_kb": 2171800,
"swap_total_kb": 16777212,
"swap_used_kb": 641452,
"swap_in_change": 0,
"swap_out_change": 0
},
各種パラメータ
tmp_table_size=268435456
max_heap_table_size=268435456
Auroraインスタンスをdb.r5.2xlargeにスペックアップするとFreeableMemoryが15GB程度に増える為、
その場合はメモリ不足にならずにストアドプロシージャは成功します。
調査の為、EC2インスタンス(t3.large、WindowsServer2022)にMySQL Community Server 8.0.34をインストールし、
AuroraMySQLからダンプしたものをリストアし、同じデータでストアドプロシージャを実行すると成功します。
MySQLプロセスの使用メモリは2GB程度(innodb_buffer_pool_size=1024M)で、
ストアドプロシージャ実行時のMySQLプロセスのメモリ使用率はほとんど変化がありません。
同じデータにもかかわらずストアドプロシージャ実行時のメモリ消費量がAuroraMySQLとローカルのMySQLでかなり違いがあります。
「ストアドプロシージャなどの特定のクエリは、実行中にメモリを無制限に消費することがあります。」
https://repost.aws/ja/knowledge-center/low-freeable-memory-rds-mysql-mariadb
という記載がウェブ上にありますが、
これはどんな場合に発生しますか?
またOOMを防ぐ方法はありますか?