別記事で書こうと思っているのですが、この夏休みに四国一周してきました。その時の標識です。詳細は後程。。。
小さなシステムでちょっと大きなことを行おうとすると、SWAP が足りないといって怒られることがあります。例えば、小さなメモリとスワップの、単に OS が走っているだけのようなサーバで、ソフトウェアの更新を行うために portupgrade などを行った時に、不運にも rust や cmake-core がアップデートされるようなときによく怒られたりします。通常の状態でメモリの負荷はほぼ無い状態なので、わざわざデバイスを追加して恒久的にスワップを拡張はしたくありません。VMware 環境なら100歩譲ってありかもしれませんが、物理マシンではありえない話です。そんな時にどうするかというとファイルシステム上に仮想的にディスクを作り出して、それを一時的にスワップに適用することを行います。例えば、こんな感じです。
exhausting swap area
portupgrade を実行し終わった時に、アップデートできなかったポーツがあるといわれました。実際にはポーツツリーにバグがあって本当にコンパイルできなかったことも、ないことはなかったのですが、私の知る限りほとんどの場合はメモリ不足が原因であったと記憶しています。dmesg を見てみると、相当お怒りになっておられます。当然私が使っている実験用の小さなシステムでのお話です。プロダクションシステムでは十分余裕のある設計にしてください 🙂
スワップはというと、たったの1GBしかありません。
実メモリも1GBしかありません。
temporary swap area on file systems
このような場合に、ファイルシステム上に仮想的にディスクを作り出して、それをスワップとして割り当てます。手順的には、こんな感じです。/dev/zero からバッファ10Mと指定して、200回ファイルに書き込みます。この組み合わせは、バッファ100Mに20回の書き込みでもいいですし、バッファ1GBで2回の書き込みでもいいです。バッファが大きいほど早くなります。ただし、大きなバッファサイズはメモリを圧迫しますので、ものには適当という言葉があるように、大きくしすぎは遅くなります。これで空っぽの2GBのファイルが /tmp に出来上がります。当然 root 以外に読み書きできてほしくありませんので、適当にパーミッションを変えます。
次に出てくるのが mdconfig です。詳細は man mdconfig でご覧になれると思いますが、メモリディスクの取り扱いができるコマンドです。先ほど作った /tmp/swp ファイルを vnode タイプとしてメモリディスクに割り当てます。
ユニット番号 0 を指定したので、/dev/md0 ができているはずです。ls で確認します。
swapon
大丈夫のようであれば swapon コマンドで領域全てをスワップとして割り当てます。そして、pstat コマンドで確認します。この場合ですと、元の1GB と追加した 2GB の、合計 3GB のスワップになったことが確認できました。
この状態で先ほど失敗したコンパイルを portupgrade で行ってみると、失敗していた部分が成功に変わっており、全てのポーツのアップデートが完了しました。
reboot
この方法の良いところは、単純に再起動することで、手動で割り当てたスワップのことをきれいに忘れてくれることです。一時ファイルは /tmp に作りましたし、起動時に /tmp 内を消すようにしているし、/etc/fstab はいじっていませんし、メモリディスクは再起動で全てを忘れてくれます。今回は 13.2-RELEASE-p5 かリリースされたということなので、新しいカーネルは含まれていなかったのですが、久しぶりなので再起動しておきます。因みに FreeBSD 14.0-RELEASE も近々のはずです。ハローワーク関係が落ち着いていたら 13 -> 14 のアップデートも行ってみたいと思います。
今回は一時的にスワップを割り当てたいときにどうするかという短いお話でした。ここしばらく FreeBSD のことを書こうとしても心ここにあらずの状態です。それは随所に現れています 🙂
以下広告
コメント