【Ruby】メモリに余裕があるはずなのにCannot allocate memory で落ちたらFork()を疑う

事象

  • Amazon Linux
  • RubyVM起動で、メモリ使用率が単体50%のプロセスを実行中、急遽「Cannot allocate memory」のエラーログが出力されて落ちる

追加調査してわかった事象

  • 過去、バッチ実行中、一瞬(1分弱?)だけRubyのプロセスがそれまで使用していたメモリ使用率2倍をマークしてすぐに落ち着く

Fork()の疑い

  • Ruby には Fork()関数が実装
  • 挙動は、Linuxカーネルのfork()に準じる

    • 今のプロセスを保有しているメモリごと複製して新プロセスを作成する
    • すぐに別処理に移った場合、該当のメモリはすぐに開放
  • OSのベースが 10%ほどメモリ占有 + もとのプロセスが50%占有 のところに、さらにプロセス複製で50%を確保しようとしたら不足で落ちた可能性

  • Railsなどの大御所はもちろん、マルチプロセスの常套手段として利用されている。

対策

  • マシンをスケールインする
  • プロセスのメモリ所要量を低減する