パーソナルツール
現在の場所: ホーム FreeBSDの設定 swap領域の追加

swap領域の追加

FreeBSDにて、swap領域を追加したい場合の追加方法です。

環境

今回の作業はFreeBSD6.1で行っています。

今回の経緯

家で運用している、メール兼ウイルスチェック兼スパムチェック兼プロキシサーバのログを 眺めていると、見慣れないログがいっぱい出ていました。

Jan 30 17:39:01 lib kernel: swap_pager_getswapspace(4): failed
Jan 30 17:39:01 lib kernel: swap_pager_getswapspace(5): failed
Jan 30 17:39:01 lib kernel: swap_pager_getswapspace(3): failed
Jan 30 17:39:01 lib kernel: swap_pager_getswapspace(3): failed
Jan 30 17:39:01 lib kernel: swap_pager_getswapspace(8): failed
Jan 30 17:39:01 lib kernel: swap_pager_getswapspace(3): failed

googleで調べてみると、なにやら「swap領域が足りないときに出る。」 ということで、早速システムの状況を確認してみました。

last pid: 58224;  load averages:  0.02,  0.18,  0.14   up 92+21:37:08  17:39:34
157 processes: 1 running, 156 sleeping
CPU states: 7.2% user, 0.0% nice, 3.3% system, 1.4% interrupt, 88.0% idle
Mem: 49M Active, 9592K Inact, 36M Wired, 6456K Cache, 20M Buf, 460K Free
Swap: 199M Total, 191M Used, 7964K Free, 96% Inuse, 28K Out PID USERNAME THR PRI NICE SIZE RES STATE TIME WCPU COMMAND 58224 root 1 96 0 2468K 1524K RUN 0:00 12.61% top 626 clamav 3 20 0 50436K 12248K kserel 316:22 0.00% clamd 82402 root 1 4 0 1408K 340K kqread 142:48 0.00% dovecot 68638 squid 1 96 0 11144K 1172K select 117:35 0.00% squid 667 root 1 96 0 23332K 1824K select 114:40 0.00% perl5.8.7 311 root 1 96 0 1292K 348K select 54:45 0.00% syslogd 39702 root 1 96 0 34028K 9756K select 20:20 0.00% perl5.8.7

うぁぁ、ほぼSwap領域使い果たしているし・・・

まぁ、色々なサービス動かしているのにメモリちょっとしか積んでないし、仕方が無いか。
本当はもっとスペックの良いノートPCが手に入れば良いんだけど、そんな予算はまったくありません。 応急処置として、手っ取り早くswap領域を追加することにします。:-P

swap領域の追加

新たにswap領域を追加するにあたり、swap用ファイルを使用しなくてはいけませんので、空いているディスクスペースを探します。

# df -h
Filesystem Size Used Avail Capacity Mounted on
/dev/ad0s1a 496M 60M 396M 13% /
devfs 1.0K 1.0K 0B 100% /dev
/dev/ad0s1e 496M 12K 456M 0% /tmp
/dev/ad0s1f 6.8G 3.6G 2.7G 57% /usr
/dev/ad0s1d 1.1G 78M 918M 8% /var
devfs 1.0K 1.0K 0B 100% /var/named/dev

うーん、どこもたいして空きはないのですが、とりあえず/tmpから100MBほど領域をもらうことにします。

          
swap用のファイルを作成

dd コマンドを使用して/tmpにswap用に100MBのswapfileというファイルを作成します。

# dd if=/dev/zero of=/tmp/swapfile bs=1m count=100
100+0 records in
100+0 records out
104857600 bytes transferred in 16.122019 secs (6503999 bytes/sec)

※swap用ファイルのサイズ指定については、ブロックサイズ1MB 「bs=1m」を100個「count=100」で100MBのファイルといった 感じで作成していますので、作りたい大きさに適当に変更してください。

ファイルの確認

無事出来上がっていること確認します。

lib# ls -la /tmp/
total 102494
drwxrwxrwt 7 root wheel 512 Feb 1 10:40 .
drwxr-xr-x 17 root wheel 512 Mar 13 2006 ..
drwxrwxrwt 2 root wheel 512 Oct 29 19:54 .ICE-unix
drwxrwxrwt 2 root wheel 512 Oct 29 19:54 .X11-unix
drwxrwxrwt 2 root wheel 512 Oct 29 19:54 .XIM-unix
drwxrwxrwt 2 root wheel 512 Oct 29 19:54 .font-unix
drwxrwxr-x 2 root operator 512 Mar 13 2006 .snap
-rw-r--r-- 1 root wheel 104857600 Feb 1 10:40 swapfile
swapファイル追加

作成したswap用ファイルをすぐにswapとして利用したい場合は、swaponコマンドを使用してswapとしてシステムに認識させます。

# mdconfig -a -t vnode -f /tmp/swapfile -u 3
# swapon /dev/md3
swap領域確認

pstatコマンドを使用して、swapとして認識されたことを確認します。

# pstat -s
Device 1K-blocks Used Avail Capacity
/dev/ad0s1b 203560 196304 203560 96%
/dev/md3 102400 0 102400 0%
Total 305960 196304 109656 64%

せっかくなのでswapの使用状況を確認してみますと・・・
とりあえずはまだ余裕があるので何とかなるでしょう。

# top
last pid: 81419; load averages: 0.00, 0.02, 0.00 up 94+14:42:49 10:45:15
157 processes: 1 running, 155 sleeping, 1 lock
CPU states: 18.5% user, 0.0% nice, 10.4% system, 1.5% interrupt, 69.6% idle
Mem: 47M Active, 6576K Inact, 40M Wired, 7296K Cache, 20M Buf, 460K Free
Swap: 299M Total, 190M Used, 109M Free, 63% Inuse, 924K In PID USERNAME THR PRI NICE SIZE RES STATE TIME WCPU COMMAND 80949 vscan 1 -20 0 44348K 10576K swread 0:32 6.38% perl5.8.7 81206 vscan 1 4 0 41476K 11780K sbwait 0:07 5.19% perl5.8.7 81416 postfix 1 96 0 1408K 936K select 0:00 0.61% cleanup 81417 postfix 1 96 0 1436K 1028K select 0:00 0.31% smtp 81413 postfix 1 96 0 1496K 1096K select 0:00 0.19% smtpd 81406 root 1 96 0 2540K 1592K RUN 0:01 0.11% top 81415 postfix 1 96 0 1372K 896K select 0:00 0.10% trivial-rewrite 626 clamav 3 96 0 50436K 6752K *Giant 324:26 0.00% clamd

これでとりあえずはswap領域の追加は出来たのですが、この方法は一時的に swapが追加されるだけなので、サーバを再起動させてもswapが追加されるように設定を行っていきます。

起動時にswapとして認識させる

OS起動時にswapファイルとして認識させるには/etc/rc.confの設定変更が必要となります。

# cp -p /etc/rc.conf /etc/rc.conf_yyyymmdd
# vi /etc/rc.conf
編集内容

rc.confにswapfile="swapファイルの場所"といった設定を追加します。

swapfile="/tmp/swapfile"
# pstat -s
Device 1K-blocks Used Avail Capacity
/dev/ad0s1b 203560 196304 203560 96%
/dev/md3 102400 0 102400 0%
Total 305960 196304 109656 64%
再起動

/etc/rc.confの設定が完了しましたら、サーバの再起動を実際に行ってswapファイルが追加されるかの 確認を行ってみます。

# reboot
swap領域確認

OSの再起動処理が完了しましたら、実際にswap領域が増えているか確認してみます。

# top
last pid: 667; load averages: 0.84, 0.64, 0.31 up 0+00:05:22 10:52:55
44 processes: 1 running, 42 sleeping, 1 waiting
CPU states: 55.4% user, 0.0% nice, 15.0% system, 2.7% interrupt, 26.9% idle
Mem: 58M Active, 14M Inact, 28M Wired, 240K Cache, 20M Buf, 460K Free
Swap: 299M Total, 63M Used, 235M Free, 21% Inuse, 1760K Out PID USERNAME THR PRI NICE SIZE RES STATE TIME WCPU COMMAND 613 vscan 1 76 0 24608K 23396K pfault 0:14 12.21% clamscan 614 vscan 1 76 0 23936K 22724K pfault 0:14 12.01% clamscan 666 root 1 76 0 4340K 3384K pfault 0:02 7.25% perl5.8.7 667 root 1 96 0 2292K 1192K RUN 0:00 2.11% top

念のためpstatコマンドでも確認してみます。

# pstat -s
Device 1K-blocks Used Avail Capacity
/dev/ad0s1b 203560 36212 203560 18%
/dev/md0 102400 36392 102400 36%
Total 305960 72604 233356 24%

無事swap領域が追加されました:-)
これで、急場をしのぐこととします、いつまで持つかわかりませんがねぇ

swapを一時的に追加する方法

上の手順中にも出てきたのですが、サーバの再起動をしないでswap領域を追加したい場合は 以下のような手順でswap領域を追加することが出来ます。

swapの一時追加
# dd if=/dev/zero of=/tmp/swapfile bs=1m count=100
100+0 records in
100+0 records out
104857600 bytes transferred in 16.122019 secs (6503999 bytes/sec)

# mdconfig -a -t vnode -f /tmp/swapfile -u 3
# swapon /dev/md3
swapの削除

追加したswap領域が要らなくなったら以下の手順で一時的に追加したswap領域を削除できます。

# swapoff /dev/md3
# mdconfig -d -u 3
# rm /tmp/swap/file