swap不足の対処

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領域が有効になる。

参考

タイトルとURLをコピーしました