Amazon ElastiCache for Redis のメトリクスで DatabaseMemoryUsagePercentage
というやつがある。
Redisはインメモリデータベースなので、Data Tieringを使っていなければメモリ使用率 = データストレージの使用率ということになる。
というわけでこのメトリクスをよく見ることになるわけですが、そういえばElastiCacheには予約メモリ(Reserved Memory)というのがある。
平たくいうと、バックアップとか諸々の処理に結構メモリを食う場合があるのでデータを入れられない領域をあらかじめ確保しておきましょうというもの。2017年以降に作られたインスタンスでは基本的に全メモリの25%がデフォルトでこの予約メモリ領域として設定されている。
で、DatabaseMemoryUsagePercentage
の値がどうやって計算されているのか気になった。例えばノードのメモリが10GBあったとすると、予約メモリを考慮すれば実際に利用可能なメモリは7.5GBになる。今5GB分のデータが入っていたとすると、DatabaseMemoryUsagePercentage
の値は以下のどちらになるか。
- (予約メモリを考慮した値)5GB / 7.5GB = 67%
- (予約メモリ考慮なし)5GB / 10GB = 50%
普通に考えたら1. なんだろうけどちゃんとした記述がなかなか見つけられず。2.だったら不便すぎるよ。。かと言って75%以上のデータを実際に突っ込んで試してみるというのも面倒なので頑張って資料を探したらどうにか見つけられた。
以下引用。
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).
雑な日本語訳はこちら。
クラスタの
maxmemory
はRedis 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. が正しい。よかったよかった。