- 1. 概要
- 2. 追加前の状態
- 3. 領域追加
- 4. 確認
- 5. 削除
1. 概要
以前、やったことがあるんだけどな、すっかり忘れちゃいました。
今回は、忘れないうちにメモメモ。
現象は、実機で発生しました。
「top」で見ると、メモリはこのような状況です。
Mem: 718M Active, 1224M Inact, 509M Laundry, 805M Wired, 385M Buf, 588M Free
Swap: 4096M Total, 1463M Used, 2633M Free, 35% Inuse
実装メモリが、「4096MB」です。
「swap」は、「AUTO」で設定したところ「4096MB」割り当てられています。
以前は、「swap」サイズを実装の倍にするようにしていましたが、メモリサイズの容量が増えたためか、同サイズが割り当てられています。
一昔前であれば、これで十分だったのでしょうが、2021年9月2日現在、これでは、また足りないのです。
「portsupgrade」で大きなプログラムをアップグレードしようとしたりすると、「swap」領域が足りなくなっちゃったりするのです。
まぁ、特に「ghc」ですな。
「ghc」はアップグレードしないようにしているのですが、先日「rust」だったか「rust-cbindgen」をアップグレードしようとしたとき、ログに
Aug 30 11:09:29 ns kernel: pid 37083 (rustc), jid 0, uid 0, was killed: out of swap space
Aug 30 11:09:41 ns kernel: pid 37104 (rustc), jid 0, uid 0, was killed: out of swap space
Aug 30 11:09:54 ns kernel: pid 37000 (rustc), jid 0, uid 0, was killed: out of swap space
Aug 30 11:11:55 ns kernel: pid 37025 (httpd), jid 0, uid 80, was killed: out of swap space
Aug 30 11:12:29 ns kernel: pid 37146 (httpd), jid 0, uid 80, was killed: out of swap space
Aug 30 11:12:40 ns kernel: pid 37049 (httpd), jid 0, uid 80, was killed: out of swap space
Aug 30 11:12:40 ns kernel: swap_pager_getswapspace(32): failed
Aug 30 11:12:59 ns syslogd: last message repeated 966 times
Aug 30 11:12:59 ns kernel: pid 37150 (httpd), jid 0, uid 80, was killed: out of swap space
Aug 30 11:12:59 ns kernel: swap_pager_getswapspace(32): failed
Aug 30 11:13:03 ns syslogd: last message repeated 196 times
Aug 30 11:13:03 ns kernel: swap_pager_getswapspace(16): failed
Aug 30 11:13:03 ns kernel: swap_pager_getswapspace(32): failed
てなログが出て、サーバアプリケーションの「daemon」はこけるし、ほぼ動きが止まってしまって、再起動する羽目になっちゃいました。
とりあえず、「swap」領域の増やし方を思い出します。
本ページは、下記のサイトを参考にさせていただきました。
「FreeBSD 12.1 の初期設定」
他にも、情報を載せているサイトは、いくつかあったのですが、上記のサイトに書いてあるように、情報が古すぎる。
うまくいったように見えて、実際「top」等で見ると、思うように動作していないのです。
少なくとも「FreeBSD 13.0 RELEASE」でも使えるのは上記のサイトの方法です。
上記のサイトは、「FreeBSD 12.1 RELEASE」に関して書いてあるので、今んとこ(2021年9月2日)「FreeBSD 12.1 RELEASE」から「FreeBSD 13.0 RELEASE」までは使えそうです。
「FreeBSD 12.1 RELEASE」からどこまで遡れるかは、謎です。
2. 追加前の状態
まずは、実機の前に、「VirtualBox」上の仮想環境で試してみます。
「FreeBSD 13.0 RELEASE」のものです。
実機が「MBR」なもので、「zfs」を使用せずに、「MBR」でやってみます。
「zfs」だと今んとこ、うまく追加できないし、参考サイトは「zfs」でないもので
「top」で見ると
Mem: 10M Active, 1924K Inact, 104M Wired, 18M Buf, 3824M Free
Swap: 4096M Total, 4096M Free
「mount」コマンドでみてみると
/dev/ada0s1a on / (ufs, local, journaled soft-updates)
devfs on /dev (devfs)
てな状態になっておる。
「/etc/fstab」を見ると、こないですわ。
# Device Mountpoint FStype Options Dump Pass#
/dev/ada0s1a / ufs rw 1 1
/dev/ada0s1b none swap sw 0 0
「pstat」やら「swapinfo」を見てみます。
$ pstat -sh
Device Size Used Avail Capacity
/dev/ada0s1b 4.0G 0B 4.0G 0%
$ swapinfo -h
Device Size Used Avail Capacity
/dev/ada0s1b 4.0G 0B 4.0G 0%
なるほど、現在、「4GB」割り当てられています。
もう「8GB」の領域を割り当てますか。
3. 領域追加
もちろん、以下、「root」ユーザ権限で。
まず、ファイルの作成。
dd if=/dev/zero of=/usr/swap bs=1m count=8192
このようなログが出力されました。
8192+0 records in
8192+0 records out
8589934592 bytes transferred in 1.758733 secs (4884160684 bytes/sec)
パーミッションを変更します。
chmod 600 /usr/swap
作成されたファイルをみてみると
$ ls -lah /usr/swap
-rw------- 1 root wheel 8.0G 9月 2 17:38 /usr/swap
予定通りに作成されています。
「/etc/fstab」を編集します。
vi /etc/fstab
下記の1行を追加します。
md99 none swap sw,file=/usr/swap,late 0 0
「md99」は、重複する名前のものが他になければ、なんでもいいはずですが、面倒は避けたいので、参考サイトのまま・・・。
「swapon」というコマンドで追加するそうで・・・。
swapon -aL
少々の時間がかかるように書かれていますが、すぐに動作するようです。
このようなログが出力されました。
swapon: adding /dev/md99 as swap device
4. 確認
前項の設定が反映されているか、前々項と同じコマンドで確認してみます。
「top」
Mem: 10M Active, 1812K Inact, 105M Wired, 18M Buf, 3824M Free
Swap: 12G Total, 12G Free
「mount」
/dev/ada0s1a on / (ufs, local, journaled soft-updates)
devfs on /dev (devfs)
これ、追加したものは「mount」コマンドでは、見られないのですね。
「pstat」「swapinfo」
$ pstat -sh
Device Size Used Avail Capacity
/dev/ada0s1b 4.0G 0B 4.0G 0%
/dev/md99 8.0G 0B 8.0G 0%
Total 12G 0B 12G 0%
$ swapinfo -h
Device Size Used Avail Capacity
/dev/ada0s1b 4.0G 0B 4.0G 0%
/dev/md99 8.0G 0B 8.0G 0%
Total 12G 0B 12G 0%
何しろ、再起動せずとも有効化できるのがすごくいい。
もちろん、再起動後も有効化されているのも確認しました。
「zfs」であっても同様の方法で、領域を追加することができました。
5. 削除
「swap」ファイルの追加が一時的なものである場合(わたしは、デスクトップ環境へ、「vscode」をインストールする際、一時的に「swap」ファイルを追加しました)、追加したものを削除することがあります。
これ、慎重にやらないと、システムが起動できなくなります。
実際、わたしは、やっちまったもので、シングルユーザモードで起動して、キーボードレイアウトが異なるものだから、えらい目にあいました。
まず、追加した「swap」ファイルをはずします。
前項までのようにマウントしているとして
swapoff /dev/md99
とマウントしているファイルを指定してはずします。
ちなみに、「swap」として使用している状態であれば、上記のコマンドは失敗するそうです。
うまくはずせたら
vi /etc/fstab
追加していた下記の1行を削除します。
md99 none swap sw,file=/usr/swap,late 0 0
いったん再起動。
うまく起動できれば、ファイルを削除しても支障ありませんので・・・。
rm /usr/swap
|