RAMが足りない
このサーバはさくらのVPSの1Gプランで稼動している。 1GB RAMのマシンでGentooを使うとどうなるかといえば、一部のパッケージをコンパイルするたびに怒涛のページングが発生する。
Gentoo界隈では「コンパイルジョブ並列数 × 2GB」のRAMが必要と言われている。
The
--jobs N
argument [...] Values forN
should be no more than 2GB of ram per processor core.
Calculate 2 GB RAM for every compile job !
User:Pietinger/Tutorials/Optimize compile times - Gentoo Wiki
健全とはいえないのだけど、盛大にページングしても数時間程度で終わるなら待てばいい、と思ってこれまでやってきた。
しかし、状況が変わった。 Node.jsが22になったころからコンパイルに10時間以上かかるようになってしまった。 これはさすがにどうにかしたい。
# ちなみに、Rustはこのスペックだと最早コンパイルできず、コンパイル済みパッケージが提供されているのでそれのお世話になっている。
RAMを増やそうと思ったらVPSをスケールアップするしかない。
2GB RAMのプランにスケールアップすると料金がほぼ倍になる。 まあ許容できる額ではあるのだけど、このスペックが必要になるのは月あたり高々数時間程度というのがひっかかる。 平時に2GBなんて有効活用できないので、費用対効果で考えるとすごく悪い。
さらにいえば2GBは最低ラインであって、2GBあればなんでもできるわけでもない。 もう一つ上の4GBにすると料金がさらに倍になり、そこまではさすがにちょっと払えない。
あと、一度上げてしまったらもう二度とこっち側に戻って来られなくなりそう、という不安もある。
クラウドで必要なときだけマッチョなインスタンスを立ち上げてdistcc、というのも考えたのだけど、チャレンジする気にはならなかった。 調べてみるとコンパイラのバージョンなど制約が意外に多く、単発で気軽に使い捨てるようなことはできそうにない。 環境の維持・運用にかかる負担で精神的に赤字になりそう。
他のアプローチとして、指定した一部のパッケージだけバイナリ版を使う仕組みがGentooにあれば助かるのだけど、見通しは立っていない模様。
There is currently no way to specify that the binary version of a particular package should be preferred to the source version. The functionality is planned, but there is no specific timeline for implementation at this stage. Refer to bug 463964 and bug 924772.
目下、現実に発生している問題は「コンパイルに時間がかかる」ことだけで、突き詰めればそこに実害はない。 将来予見されるのは「ページングしすぎてリソース制限を賜る」というリスクなのだけど、それが実際に発生するか/発生した場合にどのくらいの悪影響があるかはわからない。
結局、今回は現状を維持することに決めた。
ひとまずリソース制限を賜ったらすぐ気づけるようAPIで監視するようにした。 監視の動向次第では「インフラに変な負荷かけるのも悪いから‥‥」という新たな動機が生まれる、かもしれない。
昔読んだエッセイか何かに「食べるものがないなら歯を磨くと空腹感が紛れる」という主旨の一節があったのを思い出す。
後日談。
この件の発端だったNode.jsは結局、Portageで管理することを諦めて公式のStandalone Binaryを使わせてもらうことにした。 そもそもnpmでコマンドラインツールをいくつか使っている程度だったので、PATHを通すだけで特にトラブルもなく移行できた。
これだけでもうすっかり平和になってしまったので、スケールアップはとうぶん俎上に載らない。