お名前ドットコムVPSへ移行への道7-メモリ不足対策

※ 当サイトではアフィリエイト広告を利用しています。リンクは広告リンクも含みます。

この記事は約8分で読めます。
広告

お名前.com VPS にこれまでに
owasp/modsecurity-crs:nginxとWordPressのDockerイメージをインストールして、
WordPressを表示できるようにしてある。
しかし先に進むにつれ動作しなくなることがありVPSの再起動を繰り返した。
どうも原因はメモリ不足でSwapを使うことで再起動する必要はなくなった。

あくまでも私は、こうやってみたということで動作やセキュリティの保証はできません。

環境
パソコン Windows11
VPS OS Ubuntu 20.04.3 LTS、 Dockerを使用
こちらの続きです。

広告

Swapを使ってみる

Swapとは?私の認識を書くと。
プログラムは実行するとプロセスとなりメモリに格納される。
CPUはメモリにあるプロセスに従って処理を行う。
プロセスで1回限りで終了するものは、処理が終わればメモリから消える。
また、ずっと処理し続けるものもある。
プログラムをどんどん起動してプロセスを増やしていくとメモリがパンパンになる。
この状態をOOM(Out Of Memory)といって、
それ以上処理を続行できない状態。
そんなときメモリの領域をファイルという形でディスクに持つことで
疑似的に広げておけばメモリがパンパンになるのを避けられる。
そのための仕組みだと思います。
プロセスは絶えず動いているわけではないので寝ているときは
多分、ここに追い出されているのではないかと推察します。
参考:Ubuntu 20.04にスワップ領域を追加する方法 | DigitalOcean
WSL2/Ubuntu/Raspberry Piでのメモリ不足を解消する (zenn.dev)
【Linux】freeコマンドの内容を図解化してわかりやすく説明します

それではswapの設定をしていきます。
まずシステムのスワップ情報を確認
free -h
              total        used        free      shared  buff/cache
 available
Mem:          964Mi       623Mi        79Mi        35Mi       261Mi
     153Mi
Swap:            0B          0B          0B  ←使っていない。

現在のディスク使用量をチェックして、十分なスペースがあることを確認
df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            466M     0  466M   0% /dev
tmpfs            97M  1.3M   96M   2% /run
/dev/vda1        78G  7.6G   70G  10% / ←ここの欄でディスク容量確認。
tmpfs           483M     0  483M   0% /dev/shm

参考サイトに「一般的に、システムのRAMの量と同じか2倍の量が、出発点として適しています。もう一つの経験則として、RAMのフォールバックとして使用するだけであれば、4Gを超えるスワップはおそらく不要です。」と書いてあるのでシステムのRAMの量は1G(VPS仕様のメモリの欄のことだと仮定)なので2Gにした。

Swap領域2G確保のコマンド

sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

確認
free -h
              total        used        free      shared  buff/cache   available
Mem:          964Mi       624Mi        84Mi        35Mi       255Mi       151Mi
Swap:         2.0Gi          0B       2.0Gi ←2Gになった。

スワップファイルの永続化
再起動すると、サーバーはスワップ設定を自動的に保持しません。これを変更するには、スワップファイルを/etc/fstabファイルに追加します。

何か問題が生じた場合に備えて、/etc/fstabファイルをバックアップします。
sudo cp /etc/fstab /etc/fstab.bak
次のように入力して、スワップファイル情報を/etc/fstabファイルの最後に追加します。
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
目次へ

効果確認

owasp/modsecurity-crs:nginxとWordPressのDjango動かしてVsコード2つ開いても動作している。
今までだと再起動が必要だった。freeで見ても0.7Gは超えないぐらいで安定してる。
今までは0.7G超えたら増えるばかりで動かなくなっていった。

メモリ使用量
free
              total        used        free      shared  buff/cache   available
Mem:         987920      673244       73456       34812      241220      123132
Swap:       2097148      398848     1698300 ←Swapが使われている。使ってなかったら単純計算で0.67+3.9で1G超えているので、動かなくなって再起動が必要だったろう。

この状態でディスク使用量をチェック
df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            466M     0  466M   0% /dev
tmpfs            97M  1.4M   96M   2% /run
/dev/vda1        78G  9.6G   68G  13% / ←Swapする前は7.6Gだったので2G増えてる。
tmpfs           483M     0  483M   0% /dev/shm

スワップ設定の調整

参考:Ubuntu 20.04にスワップ領域を追加する方法 | DigitalOcean
スワップの動作を決めるパラメータがあるらしいので検討。
目次へ

Swappinessプロパティの調整

swappinessパラメーターは、システムがRAMからスワップ領域にデータをスワップする頻度を設定します。これは、パーセンテージを表す0~100の値です。値が0に近い場合、カーネルは絶対に必要な場合を除いて、データをディスクにスワップしません。スワップファイルとのやり取りは、RAMとのやり取りよりもはるかに時間がかかり、パフォーマンスが大幅に低下する可能性があるという点で、「コストがかかる」ことを忘れないでください。スワップにあまり依存しないようにシステムに指示すると、通常、システムの動作が高速になります。値が100に近い場合は、RAMの空き容量をより確保するために、より多くのデータをスワップしようとします。アプリケーションのメモリプロファイルまたはサーバーの使用目的によっては、この方が良い場合もあります。

デスクトップの場合、swappinessの設定を60にすることは不適切な値ではありません。サーバーの場合は、値を0に近づけると良いでしょう。

Ubuntu 20.04にスワップ領域を追加する方法 | DigitalOcean

ということなのでサーバーは0に近い方がいいといっても
今回の場合、Swapなしの状態と同等の0に近づけるわけにはいかない。
処理スピードが遅くなっても停止するよりかはいいので、この辺で様子見。
安定しているなら数字を下げ、不安定なら上げてみようと思う。
現在のswappiness値を確認

cat /proc/sys/vm/swappiness
60

キャッシュプレッシャー設定の調整

「システムが他のデータ上の_inode_および_dentry_の情報をキャッシュするために選択する量を設定します。」参考:Ubuntu 20.04にスワップ領域を追加する方法 | DigitalOcean
indoleはディスク上のファイル名と場所を結びつけるデータでディスク上にあるため
アクセスに時間が、かかるのでアクセスした値はメモリに残しておくという意味だと思います。
しかし、この設定値に関しては意味がよくわかりません。

現在の値を確認。100より大きい値でもいいようですが、よく分からないのでこのまま。

cat /proc/sys/vm/vfs_cache_pressure
100

スナップショットを使ってみる

メモリ不足とは関係ないが、ある程度、めどがついたのでやってみます。
「スナップショットとは、任意の時点でディスクのイメージを保存しておき、
後からそのときの状態に復元できる機能です。」
ということだがスナップショットをとった時点に何もかも復活するわけではなさそうです。
この辺は「ディスクのイメージを保存」が何を意味するのか分かりません。
まずVPS(KVM)サーバーコントロールパネルでシャットダウンをクリックします。
やり方はスナップショットを取得する – レンタルサーバー ご利用ガイド (onamae-server.com)
終わったら
取得されたスナップショットの詳細のタイムスタンプが今日の日付の〇をクリックすると
ロールバックや削除する画面が出ます。
VPS(KVM)サーバーコントロールパネルでサーバーを起動しておきます。
シャットダウンしたのでコンテナが停止してるのがあるので調べてstartさせる。
Djangoは中に入ってrunserverする。こちら↓に再起動でやることが書いてあります。

ディスク使用量の変化
df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        78G  9.7G   68G  13% /
↓スナップショットをしても変わってない?
/dev/vda1        78G  9.7G   68G  13% /
試しにすぐにロールバックしてみたが、特に変化はなかった。

所感

今まで、再起動を何度もやったが、これで再起動せずに安定しそうです。
ただ調子に乗って、いろいろ同時に動かすと停止はしなくても動作が重くなると思われます。
目次へ
イチゲをOFUSEで応援する(御質問でもOKです)Vプリカでのお支払いがおすすめです。
MENTAやってます(ichige)

コメント