ある日、デスクトップ用途で使用している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の枯渇はなくなった。
以上