Redis の versin up ついでに内部を軽く探ってみる 対象の version は 2.6.7 Redis を起動すると 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.
と表示されることから、save って fork した子供がコピーされたメモリを dump してるのかぁと想像し、実際にコードを見てみることにした。 rdb.c の rdbSaveBackground() の中で fork して書き出している。 fork した子供を看取るのは redis.c の serverCron() がずっと looop で動いていて、いろんな処理をしてる中の一つの仕事で rdb.c の backgroundSaveDoneHandler()。rdbSaveBackground() を実行するのも serverCron() の中。 ということで、save (dump) 処理でレスポンスが落ちるとしたらそれは save 中に更新が多くてメモリの Copy on write が沢山発生する場合なんだろうな。 次回は aof (AppendOnlyFile) を調べてみる。