メンテナンス・トラブルシュート - ディスク・ファイル・メモリ - swap ファイル追加

 クラウディア
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
ハイスピードプランTSUKUMOネットショップ【usus ウズウズ】メンズミレット