ある日、デスクトップ用途で使用しているFreeBSDマシンで、いきなりデスクトップ環境がブラックアウトしました。
ログを見たところこんな感じ。

swap_pager_getswapspace(4): failed
swap_pager_getswapspace(3): failed
pid 1218 (mate-settings-daemo), uid 1001, was killed: out of swap space
pid 1228 (mate-panel), uid 1001, was killed: out of swap space
pid 1025 (clamd), uid 106, was killed: out of swap space
pid 1203 (Xorg), uid 0, was killed: out of swap space

swapが足りなくて無実のプロセスを血祭りにした証拠であります。
恐ろしい。怖い。

これは、ちょっと洒落にならんのじゃないかと思って、調べたのだが。
たとえば以下スレッドで議論が持ち上がってるようなんだけど、私の理解の限度を超えている。
http://lists.freebsd.org/pipermail/freebsd-current/2012-August/036080.html

よろしい。
理解は諦めた。
対症療法的ではあるが、swapを後から補う方法はあるので、ここに採録。
なお、このようにswapが枯渇するのはよっぽどのこと。
末尾の後日談を参照の事。

「後から」スワップを追加する方法

ここに書いてある通り。
http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/adding-swap-space.html

ddでファイルを作り、それをswapとしてマウントする、という仕組み。
物理ディスクに余裕があれば、好きな容量を追加できる。

現状確認

まず、現状確認。
swapinfoでできる。

$ swapinfo
Device          1K-blocks     Used    Avail Capacity
/dev/ada0s1b       524288    25960   498328     5%

500MBしか確保してなかった…。
古いマシンでOSアップグレードしながら使ってたからなあ。

物理ディスクを確認。
7.2GBあるので、いっちょう奢って2GB確保しよう。

$ df -h
Filesystem     Size    Used   Avail Capacity  Mounted on
/dev/ad4s1a     71G     58G    7.2G    89%    /
devfs          1.0k    1.0k      0B   100%    /dev

swapファイルの作成

ddでファイルを作る。
置き場所は物理ディスク上でも余裕のあるところにしよう。
以下の例では/var/cache下にファイルを作っている。
/var/cacheは/dev/ad4s1aの上に載っていて、上で確認した通り、容量も十分。

$ sudo dd if=/dev/zero of=/var/cache/swapfile bs=1m count=2048
パスワード:
2048+0 records in
2048+0 records out
2147483648 bytes transferred in 45.843033 secs (46844275 bytes/sec)

念のためファイルのサイズ確認。
2GBになっている。

$ du -sh /var/cache/swapfile
2.0G    /var/cache/swapfile

オーナ、グループ、パーミッションを設定。

$ sudo chmod 0600 /var/cache/swapfile
$ sudo chown root:wheel /var/cache/swapfile
$ ls -la /var/cache/swapfile
-rw-------  1 root  wheel  2147483648  2月 10 17:20 /var/cache/swapfile

準備完了。

swapファイルの追加

以下のようにすればswapが増える。

$ sudo mdconfig -a -t vnode -f /var/cache/swapfile -u 0 && sudo swapon /dev/md0

おお二段になった。

$ swapinfo
Device          1K-blocks     Used    Avail Capacity
/dev/ada0s1b       524288    25596   498692     5%
/dev/md0          2097152        0  2097152     0%
Total             2621440    25596  2595844     1%

/etc/rc.confの修正

/etc/rc.confに以下を追加して、再起動しても設定が残るように。

# add swapfile
# See:
# http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/adding-swap-space.html
swapfile="/var/cache/swapfile"

後日談

swapの枯渇は、後から追加したソフトウェアが原因だった。
ソフトウェアを更新したらswapの枯渇はなくなった。

以上