プレイヤーズ・ハイ

 雑多な日記

Redis の設定と運用 in Amazon Linux

環境

  • Amazon Linux AMI 2013.09.2 - ami-0d13700c (64-bit)

設定

基本ポリシー

パフォーマンスをよくするために

少しでもパフォーマンスをよくするため、以下のポリシーで運用します。

  • 定期的なファイルへのデータダンプは行わない。
  • AOF は使用しない。

バックアップ

こちらは、cron による自動実行で、1 時間に 1 回、メモリー上のデータをファイルにダンプします。

最悪のケースの場合、約 1 時間前のデータに巻き戻ってしまいますが、パフォーマンスとのトレードオフで、そこには目を瞑ります。

メモリー・オーバーコミット

メモリー・オーバーコミットとは

Linux にはメモリ・オーバーコミットという機構があり、実装されているメモリ以上の領域を確保できてしまいます。

Amazon Linux AMI 2013.09.2 - ami-0d13700c (64-bit) のメモリ・オーバーコミット設定値のデフォルトは 0 で、可能な設定値は以下の 3 種類があります。

0:デフォルト。メモリ要求があったときに空き容量がなかったら実行中のプロセスを強制終了し、メモリを強引に確保する。
1:メモリを使い切るまでは十分なメモリがあるように振る舞う。それ以外は 0 と同じ。
2:メモリ要求があったときに空き容量がない場合は、メモリ確保ができないエラーを発生させる。

Redis を運用する上でのメモリー・オーバーコミット推奨設定値

vm.overcommit_memory = 0で Resid を起動すると以下のエラーがログに出力されます。

# WARNING overcommit_memory is set to 0!
Background save may fail under low memory condition.
To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and
then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.

ログの警告どおり vm.overcommit_memory = 1 にしてから Redis を起動しましょう。

メモリー・オーバーコミットの設定変更

ダイナミックな変更
$ sudo sysctl -w vm.overcommit_memory=1
永続化
$ sudo vi /etc/sysctl.conf
# 以下を追記
vm.overcommit_memory = 1

スワップ

メモリー・オーバーコミットと合わせて、十分な量のスワップを確保する必要があります。

Redis の基本的な動きとして、メモリーに持っているデータをファイルにダンプする際、オリジナルのプロセスからダンプ用のプロセスを fork して、そのプロセスがデータをファイルにダンプするため、メモリ 1GB のマシンで動かしているとして、メモリーに乗っているデータが 1GB の場合、最低でもスワップが 1GB ないと vm.overcommit_memory を 1 や 2 にしていても、OOM Killer が発動したり、メモリーエラーが発生してしまいます。

(説明を分かりやすくするため、メモリー量はざっくり計算で書いています)

★ SWAP in Amazon Linux は、エフェメラルディスクに作成します! http://dev.classmethod.jp/cloud/ec2linux-swap-bestpractice/ http://dev.classmethod.jp/cloud/introduction-ec2-swap-package/

Redis入門 インメモリKVSによる高速データ管理