memo

2016-02-14

容量があふれたら自動でディスクに書き出すようになる tmpfs が欲しい

ビルド用の一時ディレクトリを tmpfs にして、読み書きはメモリ上でやってもらいたいのだけど、 そうしていると GByte 単位で容量を食う一部の巨大なソフトウェアのビルドで容量があふれて、エラーになることがある。

で、そういう時には自動でディスクを使うようにフォールバックする仕組みを用意できないかなぁと考えていたのだけど、 mergerfs を使えばできそうな気がしたので、やってみた。

mergerfs とは

FUSE ベースの union filesystem.

aufs や overlayfs などの様な、複数のディレクトリを束ねてひとつのディレクトリに見せる系のファイルシステム。 aufs と比べて、設定項目の多さと使いやすさが利点とのこと。

作戦

  • tmpfs と通常のファイルシステムを mergerfs で重ねて使用する。

  • mergerfs の設定で tmpfs を優先的に使用するようにする。 (tmpfs がいっぱいになったら通常のファイルシステムの方に書き出されるようにする。)

やってみる

/var/tmp/paludis/build がビルド用一時ディレクトリとする。

  1. mergerfs で使う、 tmpfs と通常のファイルシステム (ディレクトリ) を用意する。

       # mkdir /var/tmp/paludis/{.tmp,.build}
       # mount -t tmpfs -o size=1G none /var/tmp/paludis/.tmp
    
  2. mergerfs を mount する

       # mount -t fuse.mergerfs \
           -o defaults,allow_other,category.create=fwfs,minfreespace=32M,moveonenospc=true \
           /var/tmp/paludis/.tmp:/var/tmp/paludis/.build \
           /var/tmp/paludis/build/
    
    • category.create=fwfs を設定し、最初に見つかったディレクトリ (この場合は tmpfs の方) に 空き容量があれば優先的に使われるようにする。 (lfs, 空き容量が少ない方を優先する設定でも良いかもしれない。)

    • デフォルトだと最低空き容量が 4G になっているのだけど、それだと容量 1G の tmpfs が全く使用されなくなってしまうので、 テキトウに小さな値に設定しておく。

結果

  • 期待通り、容量残り 32M までは tmpfs の方に書き込み、それ以降は通常のファイルシステムの方に書き込むような動作をしていた。

  • トータルで数 GBytes 程度の容量を食う firefox のビルドを試してみたが、正常に終了した。 (少なくともそのように見える。)

  • ディスク読み書き中の mergerfs プロセスの CPU 使用率は 〜50% 程度。

思ったより CPU 食ってるけど、とりあえず動いているようなので、もうしばらく運用してみることにする。