yak shaving life

遠回りこそが最短の道

ElastiCacheのDatabaseMemoryUsagePercentageってReserved Memory考慮されてる?


Amazon ElastiCache for Redis のメトリクスで DatabaseMemoryUsagePercentageというやつがある。

docs.aws.amazon.com

Redisはインメモリデータベースなので、Data Tieringを使っていなければメモリ使用率 = データストレージの使用率ということになる。

というわけでこのメトリクスをよく見ることになるわけですが、そういえばElastiCacheには予約メモリ(Reserved Memory)というのがある。

docs.aws.amazon.com

平たくいうと、バックアップとか諸々の処理に結構メモリを食う場合があるのでデータを入れられない領域をあらかじめ確保しておきましょうというもの。2017年以降に作られたインスタンスでは基本的に全メモリの25%がデフォルトでこの予約メモリ領域として設定されている。

で、DatabaseMemoryUsagePercentageの値がどうやって計算されているのか気になった。例えばノードのメモリが10GBあったとすると、予約メモリを考慮すれば実際に利用可能なメモリは7.5GBになる。今5GB分のデータが入っていたとすると、DatabaseMemoryUsagePercentageの値は以下のどちらになるか。

  1. (予約メモリを考慮した値)5GB / 7.5GB = 67%
  2. (予約メモリ考慮なし)5GB / 10GB = 50%

普通に考えたら1. なんだろうけどちゃんとした記述がなかなか見つけられず。2.だったら不便すぎるよ。。かと言って75%以上のデータを実際に突っ込んで試してみるというのも面倒なので頑張って資料を探したらどうにか見つけられた。

aws.amazon.com

以下引用。

The maxmemory of your cluster is available in the memory section of the Redis INFO command and Redis Node-Type Specific Parameters. These default values are subject to the reserved memory. Because of this, the maxmemory of your cluster is reduced. For example, the cache.r5.large node type has a default maxmemory of 14037181030 bytes, but if you’re using the default 25% of reserved memory, the applicable maxmemory is 10527885772.5 bytes (14037181030×.75).

雑な日本語訳はこちら。

クラスタmaxmemoryRedis INFOコマンドのmemoryセクションで確認でき、Redisノードのタイプによって決まります。maxmemoryの値は予約メモリの設定に依存するため、実際には(ノードタイプに記載された値よりも)少なくなります。例えば、cache.r5.largeノードのデフォルト maxmemoryは14037181030 bytesですが、予約メモリのデフォルト値は25%なので、実際のmaxmemoryの値は10527885772.5 bytes(14037181030×.75) になります。

で、DatabaseMemoryUsagePercentageの計算方法は最初のドキュメントに書いてある。

使用中のクラスターのメモリの割合。これは、[Redis INFO] からの used_memory/maxmemory を使用して計算されます。

ということで、ちゃんとreserved memoryを織り込み済みのmaxmemoryを使って計算されているようだ。よって1. が正しい。よかったよかった。