Siburlog

SiblogだとSI BlogっぽいのでSiburlogとする

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検索で最優先になるよう細工すれば、並列ビルドが要求されても無視してシリアルにビルド出来る。結果として当該のコマンドは走りきることが出来た。