swap領域不足で荒ぶるFreeBSDへの対処法。
環境
- FreeBSD 14.2
背景
portmasterでglibのアップグレードをしようとしたら、ビルドの途中でsshが切断された。
コンソールを確認すると、次のようなメッセージが延々表示されている。
Apr 4 08:51:26 prime kernel: swap_pager: out of swap space
Apr 4 08:51:26 prime kernel: swp_pager_getswapspace(18): failed
Apr 4 08:51:26 prime kernel: swap_pager: out of swap space
Apr 4 08:51:26 prime kernel: swp_pager_getswapspace(4): failed
Apr 4 08:51:29 prime kernel: pid 23761 (rspamd-3.11.1), jid 0, uid 236, was killed: failed to reclaim memory
Apr 4 08:51:32 prime kernel: pid 10265 (rspamd-3.11.1), jid 0, uid 236, was killed: failed to prime memory
Apr 4 08:51:41 prime kernel: pid 30658 (rspamd-3.11.1), jid 0, uid 236, was killed: failed to reclaim memory
Apr 4 08:51:43 prime kernel: pid 27822 (rspamd-3.11.1), jid 0, uid 236, was killed: failed to reclaim memory
Apr 4 08:51:46 prime kernel: pid 30676 (rspamd-3.11.1), jid 0, uid 236, was killed: failed to reclaim memory
どうやらswap領域が不足しているらしい。
対処法
swap用のファイルを作成。
# sudo dd if=/dev/zero of=/usr/swap0 bs=1m count=2000
2000+0 records in
2000+0 records out
2097152000 bytes transferred in 9.915266 secs (211507385 bytes/sec)
ファイルのパーミッションを変更。
# sudo chmod 0600 /usr/swap0
swapファイルを有効にする。
# sudo mdconfig -a -t vnode -f /usr/swap0 -u 0 && sudo swapon /dev/md0
原因が不明だけど、次のようなエラーが出ることがある。
mdconfig: ioctl(/dev/mdctl): Device busy
この場合には、ps -ax
でデバイスを使用しているプロセスがないか確認した上で、次のコマンドを使って強制的に解法する。
# sudo mdconfig -d -o force -u 0
その上でもう一度mdconfigを実行すればよい。
swap領域が追加されていることを確認。
# swapinfo
Device 1K-blocks Used Avail Capacity
/dev/vtbd0p3 4194268 88416 4105852 2%
/dev/md0 2048000 0 2048000 0%
Total 6242268 88416 6153852 1%
追加したswap領域を有効にする。
# sudo swapon -aL
swap領域を追加しただけでは、次のエラーが出ることがある。
Apr 4 16:52:40 prime kernel: warning: total configured swap (3608567 pages)
exceeds maximum recommended amount (2008424 pages).
Apr 4 16:52:40 prime kernel: warning: increase kern.maxswzone or reduce amo
unt of swap.
気にしなくていいらしい。
/etc/rc.confに次の行を追加。
swapfile="/usr/swap0"
この設定によって、再起動しても追加したswap領域が有効になる。