事象
AWS AuroraのCloudwatchメトリクスで以下を検知した。
・SwapUsageが一定で数十~数百KB程度ある。
・FreeableMemoryは十分に余裕がある。
メインメモリ(DRAM)に余裕があるのに、メモリ不足によるswapが発生するという矛盾した事象が発生しているように見えた。
原因
swapが発生する原因は以下の2つある。
①メインメモリ(DRAM)の不足により、メインメモリ(DRAM)上のページが、Auroraインスタンスのローカルストレージのswap領域に退避される。
②メインメモリ(DRAM)の使用頻度が低いページが、Auroraインスタンスのローカルストレージのswap領域に退避される。
★退避先のswap領域の場所
退避先となるswap領域は、Auroraインスタンスのクラスターストレージ(DBの永続データ領域)ではなく、ローカルストレージ(一時データ領域)内の領域である。
つまり、CloudwatchメトリクスのVolumeBytesUsed(使用しているクラスターストレージの容量)には表れない点に注意。
以下の事象が見られることから、今回の原因は②のパターンである。
・FreeableMemoryが十分に余裕がある
・SwapUsageは一定である
・SwapUsageはAuroraインスタンスのローカルストレージのうち数百KB程度である
★SwapUsageは一定である理由
Swap領域を再度メインメモリ(DRAM)に戻すためのオーバーヘッドを避けるためSwapUsageは解放されにくい仕様らしく、ずっと数百KB程度あるのも想定通りである。
つまり、SwapUsage≠0は必ずしも①のメインメモリ(DRAM)の不足を意味しない。
FreeableMemoryが不足、かつ、SwapUsageが上昇している場合はメモリ不足を疑い、Auroraインスタンスのスケールアップを検討する必要がある。
今回は②のパターンであるから特に問題は無い。
★AuroraがSwapUsageを解放しない理由
Swap領域に退避したページはそもそも使用頻度が低いページであるため、メインメモリ(DRAM)に戻すことにより得られるそのページへのアクセスコストの減少はほとんど見込めない。
そのため、メインメモリ(DRAM)に余裕があったとしても、メインメモリ(DRAM)に戻したことにより得られるアクセスコストの減少よりも、再度メインメモリ(DRAM)に戻すためのオーバーヘッドの方が大きい、という判断と思われる。
参考サイト
十分なメモリがあっても、Amazon RDS DB インスタンスがスワップメモリを使用している理由を知りたいです。
所感
AWS AuroraのCloudwatchメトリクスを見ていたところ、SwapUsageが0にならず、数百KB程度で安定して使用され続けていることを発見した。
swapが発生しているということはメモリ不足が発生しているのではないか、という先入観があったが、調査すると自分の先入観が誤っていたことが判明したため共有した。