gemビルド中にOOMが走ってしまうのでこう対処した
経緯
td-agent2を自分でビルドしようとしている。
READMEに書いてある通りに下記コマンドを実行すると、途中でOOMが発生して何度やっても失敗してしまう状況になった。
$ bundle install --binstubs
これは必要なgemを端からビルドしてインストールしていくコマンドなのだが、gemによってはRubyコードに加えてC/C++などで書かれたライブラリを内部的に備えたものもある。インストール時にそれらのライブラリがビルドされるのだが、ビルド方法は各gem作者が決める。大抵はMakefileを書いてそれを叩くやり方だろう。
今回問題になったのはridleyというgemで、こいつはインストール時に"make -j 5"によってライブラリをビルドする。私が使っているGCE g1-smallのメモリ量では、この5並列ビルドに耐えられずOOMになる運命らしかった。何度やっても失敗した。
対処法
makeのコマンドオプションのうち、"-j <数字>"を削除してから、本物のmakeを呼び出すラッパスクリプトを作った。自分はシェルスクリプトあまり得意ではないのでエレガントなコードとは言い難いだろうけども。
このスクリプトをmakeという名前にして、PATH検索で最優先になるよう細工すれば、並列ビルドが要求されても無視してシリアルにビルド出来る。結果として当該のコマンドは走りきることが出来た。