kakts-log

programming について調べたことを整理していきます

redisをdaemonizeする

前回エントリより、ec2インスタンス上でredisのインストールが完了して、redis-serverコマンドでredisを立ち上げることが出来ました。

redis-serverコマンドで立ち上げるのでなく、常に裏っかわでredisが起動した状態にして、別に作成したwebサーバ用のインスタンスからredisサーバに疎通させようと考えているため、redisのdaemonizeを行います。

redisのdaemonizeを行うためには、起動時に読み込むredis.confの設定をいじります。
ついでにログの吐き出し先とかも変えてしまいます。

前回インストールしたredisが /usr/local/redisのディレクトリにあるとして、
/usr/local/redis/redis.confが設定ファイルなのですが、以下の設定を変えていきます

1:daemonizeするかどうか
daemonize no ➡ daemonize yes 

2: ログファイル吐き出し先
logfile "" ➡ logfile /var/log/redis.log

3: クライアントのタイムアウト
timeout 0 ➡ timeout 30     #30秒何もしなかったらタイムアウト

4: bind設定 同一ネットワーク内のwebサーバ(10.0.1.10に設定)からのみ受け付ける
#bind 127.0.0.1  ➡ bind 10.0.1.10

他にもいろいろ設定があるのですが、いちおう軽く疎通が出来る状態にするため、これくらいやっとけばよいでしょう。

あとは、本筋とはずれるのですが、
linuxの設定で、実メモリ以上にメモリをプロセスに割り当てれるようにするオーバーコミットを有効にするため、sysctlコマンドで現在の状態を確認します

[ec2-user@ip-10-0-1-10 ~]$ sysctl vm.overcommit_memory
vm.overcommit_memory = 0

こんな感じでvm.overcommit_memory = 0 という値が返ってきます。
この値がどんな値かというと、man コマンドで
man 5 proc 
とうつと/procディレクトリの下に vm/overcommit_memoryがあるのでそこでみることが出来ます。

      /proc/sys/vm/overcommit_memory
              This file contains the kernel virtual memory accounting mode.  Values are:

                     0: heuristic overcommit (this is the default)
                     1: always overcommit, never check
                     2: always check, never overcommit

              In mode 0, calls of mmap(2) with MAP_NORESERVE are not checked, and the default check
              is very weak, leading to the risk of getting a process "OOM-killed".  Under Linux 2.4
              any  non-zero value implies mode 1.  In mode 2 (available since Linux 2.6), the total
              virtual address space on the system is limited to (SS + RAM*(r/100)), where SS is the
              size of the swap space, and RAM is the size of the physical memory, and r is the con‐
              tents of the file /proc/sys/vm/overcommit_ratio.

いろいろ調べてみると、これが0のときは、オーバーコミットが有効だけど実際に利用可能なメモリの大きさまでしか一回のmallocで確保できなくて、
①のときはどんなときでもオーバーコミット可能で、かつ実メモリ以上の場合もmallocで確保可能ということです。

(参考)

このあたりの深い理解は仮想メモリに関する理解が必要そうなのでまた今後時間があったら取り上げたいですが、先に進んで、今回はこの値を1に変更します。

vm.overcommit_memory = 1

これでオーバーコミット設定完了です。

この後、/usr/local/redis/utils/redis_init_script という、デーモン起動用のスクリプトがあるので、これを /etc/init.d/redisにコピーします

cp -pi utils/redis_init_script /etc/init.d/redis
配置したら、この/etc/init.d/redisファイルの仲の設定ファイルの置き場所と、pidファイルの場所を修正します

vim /etc/init.d/redis

PIDFILE=/var/run/redis.pid
CONF="/usr/local/redis/redis.conf"  #起動時にこのファイルの設定を読み出して起動する

これで修正完了なので、あとはデーモン起動させて完了です。
[ec2-user@ip-10-0-2-10 etc]$ sudo /etc/init.d/redis start
Starting Redis server...

たまにこれがでても実際にwebサーバーから疎通ができないときがありますが、その際は
上記で設定したログファイルを確認してその都度対処すればオッケーです
/var/log/redis.log