24時間365日フルマネージドホスティングサービスのデイーネット

Redisのmaxmemoryについて

Redisのmaxmemoryについて

こんにちは。

見習いエンジニアの下地です。

前回記事ではReidsをインストールと起動までご紹介しました。

今回はインストールしたReidsを使って、maxmemoryの設定について検証をします。

maxmemoryとは

yumでRedisをインストールした場合、設定ファイルは/etc/redis.conf に設置されます。

この設定ファイルにて、Redisに関する様々なパラメタを設定することができるのですが、その中の1つがmaxmemoryです。

このパラメタで、Redisが使用できるメモリを制限することができます。

どうしてこのパラメタが重要なのか

Redisはオンメモリデータベースなので、データ量が大きいとメモリを消費します。

その際、制限なくRedisがメモリを使ってしまうと、最終的にカーネルのOOM Killerがやってきてプロセスを落としてしまい、Redisがダウンする可能性があります。

したがって、メモリ管理のためにも、maxmemoryを事前に設定することでRedisのメモリ使用量を制限します。

どのくらいの値を設定すればよいか

Redisの公式ページを見ると、以下のような記述がありました。

Set an explicit maxmemory option limit in your instance in order to make sure that the instance will report errors instead of failing when the system memory limit is near to be reached.
If you are using Redis in a very write-heavy application, while saving an RDB file on disk or rewriting the AOF log Redis may use up to 2 times the memory normally used.
The additional memory used is proportional to the number of memory pages modified by writes during the saving process, so it is often proportional to the number of keys (or aggregate types items) touched during this time.
Make sure to size your memory accordingly.

「重いアプリを動かす場合、RDBファイルの保存やAOFログの書き換えにより、通常使用されるメモリの2倍まで使用することがあります」とのことです。

従って、実メモリの半分程度をmaxmemoryに設定すれば大丈夫でしょう。

maxmemoryを設定する

では実際に設定してみます。

実メモリの半分程度ということなので、まずマシンのメモリ容量を確認します。

[root@RedisCent7 ~]# free -th
total used free shared buff/cache available
Mem: 1.8G 160M 735M 24M 928M 1.4G
Swap: 1.0G 0B 1.0G
Total: 2.8G 160M 1.7G

メインメモリは1.8GBでした。

従ってmaxmemoryの値は900MBとします。

設定は、/etc/redis.confにmaxmemoryとmaxmemory-policyを記載します。

maxmemoryがメモリ使用量の閾値で、maxmemory-policyは閾値を超えた場合の振る舞いです。

maxmemory 900mb
maxmemory-policy noeviction

maxmemory-policyがnoevictionの場合、Redisがmaxmemoryの値までメモリを使用すると、書き込み時にエラーを返すようになります。

これでRedisを再起動して設定を反映させます。

maxmemoryの動作確認をしてみる

設定方法は分かりましたので、閾値を超えると本当に書き込みエラーが出るか確認してみます。

動作確認のため簡単なシェルスクリプトを作成します。

#!/bin/sh

for count in `seq 1 100000`
do
redis-cli set $count $count
echo $count
done

これはDBに次々データを入れて、同時にカウントを表示するだけのスクリプトです。

次に、先ほど設定したmaxmemoryを1mbに変更します。

先の手順で900mbに設定しましたが、検証だとデータ挿入でmaxmemoryに達するのに時間がかかるので、一時的に1mbにしてみました。

ではスクリプトを実行してみましょう。

[root@RedisCent7 ~]# ./redistest 
OK
1
OK
2
OK
3
・・・略・・・
OK
3948
OK
3949
OK
3950
(error) OOM command not allowed when used memory > 'maxmemory'.
3951
(error) OOM command not allowed when used memory > 'maxmemory'.
3952
(error) OOM command not allowed when used memory > 'maxmemory'.
3953

最初は問題なくデータを書き込めていますが、3950回目の書き込みからmaxmemroyの閾値に引っかかりちゃんと書き込みエラーとなりました。

このようにRedisは、メモリ使いすぎでRedis自身が停止したり、他のミドルウェアに悪影響を与えないよう適切なチューニングをすると良いと感じています。

実験後はまたmaxmemoryの値を900mbに戻しておきましょう。

今回もお読み頂きありがとうございました。

  • このページの先頭へ

  • 東京本社
    〒105-0001東京都港区虎ノ門2-3-22 第一秋山ビル5F
    TEL:03-3591-8887 FAX:03-3591-8886
  • 大阪本社
    〒541-0041 大阪市中央区北浜2-6-11北浜エクセルビル5F
    TEL:06-6231-8887 FAX:06-6231-8897

  • 認証範囲はこちらをご覧ください。

Denet logo

クラウドサービス・データセンタ・高機能専有サーバ・共有サーバホスティングサービス 株式会社ディーネット
dot_bar