このチュートリアルの以前のバージョンは、 JustinEllingwoodによって作成されました。

序章

アプリケーションのメモリ不足エラーを防ぐ最も簡単な方法の1つは、サーバーにスワップスペースを追加することです。 このガイドでは、Ubuntu18.04サーバーにスワップファイルを追加する方法について説明します。

警告:従来の回転式ハードドライブを使用するシステムでは一般にスワップが推奨されますが、SSDでスワップを使用すると、時間の経過とともにハードウェアの劣化の問題が発生する可能性があります。 この考慮事項のため、DigitalOceanまたはSSDストレージを利用するその他のプロバイダーでスワップを有効にすることはお勧めしません。 そうすることは、あなたとあなたの隣人のための基礎となるハードウェアの信頼性に影響を与える可能性があります。 このガイドは、他の場所で回転ディスクシステムを使用している可能性のあるユーザー向けのリファレンスとして提供されています。

DigitalOceanでサーバーのパフォーマンスを向上させる必要がある場合は、Dropletをアップグレードすることをお勧めします。 これにより、一般的に良い結果が得られ、サービスに影響を与える可能性のあるハードウェアの問題に寄与する可能性が低くなります。

スワップとは何ですか?

Swap は、オペレーティングシステムがRAMに保持できなくなったデータを一時的に保存できる場所として指定されたハードドライブ上の領域です。 基本的に、これにより、サーバーが作業中の「メモリ」に保持できる情報の量を増やすことができますが、いくつかの注意点があります。 ハードドライブのスワップスペースは、主に、使用中のアプリケーションデータを保持するのに十分なスペースがRAMにない場合に使用されます。

ディスクに書き込まれる情報は、RAMに保持される情報よりも大幅に遅くなりますが、オペレーティングシステムは、アプリケーションデータをメモリに実行し続け、古いデータのスワップを使用することを好みます。 全体として、システムのRAMが使い果たされた場合のフォールバックとしてスワップスペースを用意することは、SSD以外のストレージが使用可能なシステムでのメモリ不足の例外に対する優れたセーフティネットになります。

ステップ1-システムのスワップ情報を確認する

始める前に、システムにすでに使用可能なスワップスペースがあるかどうかを確認できます。 複数のスワップファイルまたはスワップパーティションを持つことは可能ですが、通常は1つで十分です。

次のように入力すると、システムにスワップが構成されているかどうかを確認できます。

  1. sudo swapon --show

出力が返されない場合は、システムに現在使用可能なスワップスペースがないことを意味します。

freeユーティリティを使用して、アクティブなスワップがないことを確認できます。

  1. free -h
Output
total used free shared buff/cache available Mem: 985M 84M 222M 680K 678M 721M Swap: 0B 0B 0B

出力のSwap行に示されているように、システムでアクティブなスワップはありません。

ステップ2–ハードドライブパーティションの使用可能なスペースを確認する

スワップファイルを作成する前に、現在のディスク使用量をチェックして、十分なスペースがあることを確認します。 次のように入力してこれを行います。

  1. df -h
Output
Filesystem Size Used Avail Use% Mounted on udev 481M 0 481M 0% /dev tmpfs 99M 656K 98M 1% /run /dev/vda1 25G 1.4G 23G 6% / tmpfs 493M 0 493M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 493M 0 493M 0% /sys/fs/cgroup /dev/vda15 105M 3.4M 102M 4% /boot/efi tmpfs 99M 0 99M 0% /run/user/1000

この場合、Mounted on列に/が含まれているデバイスがディスクです。 この例では十分なスペースがあります(1.4Gのみを使用)。 使用法はおそらく異なります。

スワップスペースの適切なサイズについては多くの意見がありますが、それは実際には個人の好みやアプリケーションの要件によって異なります。 一般に、システムのRAMの量と同じか2倍の量が出発点として適しています。 もう1つの経験則は、RAMフォールバックとして使用している場合は、4Gを超えるスワップはおそらく不要であるということです。

ステップ3–スワップファイルの作成

使用可能なハードドライブの空き容量がわかったので、ファイルシステムにスワップファイルを作成できます。 ルート(/)ディレクトリにswapfileというスワップサイズのファイルを割り当てます。

スワップファイルを作成する最良の方法は、fallocateプログラムを使用することです。 このコマンドは、指定されたサイズのファイルを即座に作成します。

この例のサーバーには1GのRAMがあるため、このガイドでは1Gファイルを作成します。 独自のサーバーのニーズに合わせてこれを調整します。

  1. sudo fallocate -l 1G /swapfile

次のように入力すると、正しい容量のスペースが予約されていることを確認できます。

  1. ls -lh /swapfile
  1. -rw-r--r-- 1 root root 1.0G Apr 25 11:14 /swapfile

私たちのファイルは、適切な量のスペースを確保して作成されています。

ステップ4–スワップファイルを有効にする

正しいサイズのファイルが利用できるようになったので、これを実際にスワップスペースに変換する必要があります。

まず、 root 権限を持つユーザーのみがコンテンツを読み取ることができるように、ファイルのアクセス許可をロックダウンする必要があります。 これにより、通常のユーザーがファイルにアクセスできなくなり、セキュリティに重大な影響を及ぼします。

次のように入力して、rootのみがファイルにアクセスできるようにします。

  1. sudo chmod 600 /swapfile

次のように入力して、権限が変更されたことを確認します。

  1. ls -lh /swapfile
Output
-rw------- 1 root root 1.0G Apr 25 11:14 /swapfile

ご覧のとおり、rootユーザーのみが読み取りフラグと書き込みフラグを有効にしています。

次のように入力して、ファイルをスワップスペースとしてマークできます。

  1. sudo mkswap /swapfile
Output
Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes) no label, UUID=6e965805-2ab9-450f-aed6-577e74089dbf

ファイルにマークを付けたら、スワップファイルを有効にして、システムがそれを利用できるようにします。

  1. sudo swapon /swapfile

次のように入力して、スワップが使用可能であることを確認します。

  1. sudo swapon --show
Output
NAME TYPE SIZE USED PRIO /swapfile file 1024M 0B -2

freeユーティリティの出力を再度確認して、調査結果を裏付けることができます。

  1. free -h
Output
total used free shared buff/cache available Mem: 985M 84M 220M 680K 680M 722M Swap: 1.0G 0B 1.0G

スワップは正常にセットアップされ、オペレーティングシステムは必要に応じてスワップを使用し始めます。

ステップ5–スワップファイルを永続的にする

最近の変更により、現在のセッションのスワップファイルが有効になりました。 ただし、再起動すると、サーバーはスワップ設定を自動的に保持しません。 これを変更するには、スワップファイルを/etc/fstabファイルに追加します。

何か問題が発生した場合に備えて、/etc/fstabファイルをバックアップします。

  1. sudo cp /etc/fstab /etc/fstab.bak

次のように入力して、スワップファイル情報を/etc/fstabファイルの最後に追加します。

  1. echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

次に、スワップスペースを調整するために更新できるいくつかの設定を確認します。

ステップ6–スワップ設定の調整

スワップを処理するときにシステムのパフォーマンスに影響を与えるように構成できるオプションがいくつかあります。

Swappinessプロパティの調整

swappinessパラメーターは、システムがRAMからスワップスペースにデータをスワップする頻度を構成します。 これは、パーセンテージを表す0〜100の値です。

値がゼロに近い場合、どうしても必要な場合を除いて、カーネルはデータをディスクにスワップしません。 スワップファイルとのやり取りは、RAMとのやり取りよりもはるかに時間がかかり、パフォーマンスが大幅に低下する可能性があるという点で「高価」であることを忘れないでください。 スワップにあまり依存しないようにシステムに指示すると、通常、システムが高速になります。

100に近い値は、より多くのRAMスペースを解放するために、より多くのデータをスワップに入れようとします。 アプリケーションのメモリプロファイルまたはサーバーの使用目的によっては、これが優れている場合があります。

次のように入力すると、現在のswappiness値を確認できます。

  1. cat /proc/sys/vm/swappiness
Output
60

デスクトップの場合、60のswappiness設定は悪い値ではありません。 サーバーの場合は、サーバーを0に近づけることができます。

sysctlコマンドを使用して、swappinessを別の値に設定できます。

たとえば、swappinessを10に設定するには、次のように入力します。

  1. sudo sysctl vm.swappiness=10
Output
vm.swappiness = 10

この設定は、次の再起動まで保持されます。 /etc/sysctl.confファイルに次の行を追加することで、再起動時にこの値を自動的に設定できます。

  1. sudo nano /etc/sysctl.conf

下部に、次を追加できます。

/etc/sysctl.conf
vm.swappiness=10

終了したら、ファイルを保存して閉じます。

キャッシュ圧力設定の調整

変更する可能性のあるもう1つの関連する値は、vfs_cache_pressureです。 この設定は、システムがiノードおよびdentry情報を他のデータにキャッシュするために選択する量を構成します。

基本的に、これはファイルシステムに関するアクセスデータです。 これは通常、検索に非常にコストがかかり、頻繁に要求されるため、システムがキャッシュするのに最適です。 procファイルシステムを再度クエリすると、現在の値を確認できます。

  1. cat /proc/sys/vm/vfs_cache_pressure
Output
100

現在構成されているため、システムはiノード情報をキャッシュからすばやく削除します。 次のように入力することで、これを50などのより保守的な設定に設定できます。

  1. sudo sysctl vm.vfs_cache_pressure=50
Output
vm.vfs_cache_pressure = 50

繰り返しますが、これは現在のセッションでのみ有効です。 swappiness設定で行ったように、構成ファイルに追加することで、これを変更できます。

  1. sudo nano /etc/sysctl.conf

下部に、新しい値を指定する行を追加します。

/etc/sysctl.conf
vm.vfs_cache_pressure=50

終了したら、ファイルを保存して閉じます。

結論

このガイドの手順に従うと、メモリ不足の例外が発生する可能性がある場合に備えて、ある程度の余裕ができます。 スワップスペースは、これらの一般的な問題のいくつかを回避するのに非常に役立ちます。

OOM(メモリ不足)エラーが発生した場合、またはシステムが必要なアプリケーションを使用できない場合、最善の解決策は、アプリケーション構成を最適化するか、サーバーをアップグレードすることです。