アプリケーションのメモリ不足エラーを防ぐ方法の一つは、サーバーにスワップ領域を追加することです。このガイドでは、Ubuntu 20.04サーバーにスワップファイルを追加する方法を扱います。
**警告:**通常、従来の回転ハードドライブを使用したシステムではスワップが推奨されますが、SSDにスワップを配置すると時間の経過とともにハードウェアの劣化の問題が発生する可能性があります。このため、DigitalOceanまたはSSDストレージを使用するその他のプロバイダーでスワップを有効にすることはお勧めしません。
_スワップ_は、オペレーティングシステムがRAMに保持できなくなったデータを一時的に保存するために確保されているハードドライブストレージの一部です。これにより、サーバーが作業メモリに保持できる情報量を増やすことができますが、いくつかの注意点があります。ハードドライブのスワップ領域は、主に、使用中のアプリケーションデータを保持するためにRAMに十分な領域がなくなった場合に使用されます。
ディスクに書き込まれる情報は、RAMに保持される情報よりも大幅に遅くなりますが、オペレーティングシステムは、メモリ内でアプリケーションデータを実行し続け、古いデータにスワップを使用する傾向があります。一般的に、システムのRAMが枯渇した場合のフォールバックとしてスワップ領域を確保することは、SSD以外のストレージが利用可能なシステムでのメモリ不足の例外に対する優れたセーフティネットになります。
始める前に、システムにすでに使用可能なスワップ領域があるかどうかを確認します。複数のスワップファイルまたはスワップパーティションを作成することは可能ですが、通常は1つで十分です。
次のように入力すると、システムにスワップが設定されているかどうかを確認できます。
- sudo swapon --show
出力が返されない場合、システムに現在使用可能なスワップ領域がないということです。
free
ユーティリティを使用して、アクティブなスワップがないことを確認できます。
- free -h
Output total used free shared buff/cache available
Mem: 981Mi 122Mi 647Mi 0.0Ki 211Mi 714Mi
Swap: 0B 0B 0B
出力のSwap行で確認できるように、システム上でアクティブなスワップはありません。
スワップファイルを作成する前に、現在のディスク使用量をチェックして、十分なスペースがあることを確認します。次のように入力して、確認します。
- df -h
OutputFilesystem Size Used Avail Use% Mounted on
udev 474M 0 474M 0% /dev
tmpfs 99M 932K 98M 1% /run
/dev/vda1 25G 1.4G 23G 7% /
tmpfs 491M 0 491M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 491M 0 491M 0% /sys/fs/cgroup
/dev/vda15 105M 3.9M 101M 4% /boot/efi
/dev/loop0 55M 55M 0 100% /snap/core18/1705
/dev/loop1 69M 69M 0 100% /snap/lxd/14804
/dev/loop2 28M 28M 0 100% /snap/snapd/7264
tmpfs 99M 0 99M 0% /run/user/1000
この場合、Mounted on
列に/
が表示されているデバイスがディスクです。この例では、十分なスペースがあります(1.4Gのみを使用)。使用量はそれぞれ異なるでしょう。
スワップ領域の適切なサイズについては様々な意見がありますが、実際は各ユーザーの設定とアプリケーション要件に依存します。一般的に、システムのRAMの量と同じか2倍の量が、出発点として適しています。もう一つの経験則として、RAMのフォールバックとして使用するだけであれば、4Gを超えるスワップはおそらく不要です。
使用可能なハードドライブのスペースを確認したので、ファイルシステムにスワップファイルを作成できます。root(/
)ディレクトリにswapfile
という必要なサイズのファイルを割り当てます。
スワップファイルを作成する最良の方法は、fallocate
プログラムを使用することです。このコマンドは、指定したサイズのファイルを即座に作成します。
この例ではサーバーに1GのRAMを搭載しているため、このガイドでは1Gのファイルを作成します。独自のサーバーのニーズに合わせてこれを調整します。
- sudo fallocate -l 1G /swapfile
次のように入力して、正しい容量のスペースが確保されたことを確認できます。
- ls -lh /swapfile
- -rw-r--r-- 1 root root 1.0G Apr 25 11:14 /swapfile
ファイルは、適切な容量のスペースを確保して作成されました。
適切なサイズのファイルが使用可能となったので、実際にこれをスワップ領域に変換する必要があります。
まず、root権限を持つユーザーのみが内容を読み取ることができるように、ファイルのアクセス許可をロックする必要があります。これにより通常のユーザーがファイルにアクセスできなくなるため、セキュリティにとって重要な意味を持ちます。
次のように入力して、rootのみがアクセス できるようにします。
- sudo chmod 600 /swapfile
次のように入力して、アクセス権限の変更を確認します。
- ls -lh /swapfile
Output-rw------- 1 root root 1.0G Apr 25 11:14 /swapfile
ご覧のとおり、読み取りおよび書き込みフラグが有効になっているのはrootユーザーのみです。
次のように入力して、ファイルをスワップ領域としてマークできます。
- sudo mkswap /swapfile
OutputSetting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
no label, UUID=6e965805-2ab9-450f-aed6-577e74089dbf
ファイルをマークした後、スワップファイルを有効にして、システムが使用できるようにします。
- sudo swapon /swapfile
次のように入力して、スワップが使用可能であることを確認します。
- sudo swapon --show
OutputNAME TYPE SIZE USED PRIO
/swapfile file 1024M 0B -2
free
ユーティリティの出力を再度確認して、結果を確証することができます。
- free -h
Output total used free shared buff/cache available
Mem: 981Mi 123Mi 644Mi 0.0Ki 213Mi 714Mi
Swap: 1.0Gi 0B 1.0Gi
スワップは正常にセットアップされ、オペレーティングシステムは必要に応じて使用を開始します。
先の変更により、現在のセッションのスワップファイルが有効になりました。しかし、再起動すると、サーバーはスワップ設定を自動的に保持しません。これを変更するには、スワップファイルを/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
次に、スワップ領域を調整するために更新できるいくつかの設定を確認します。
スワップを処理するときにシステムのパフォーマンスに影響を与えるいくつかのオプションを設定できます。
swappiness
パラメーターは、システムがRAMからスワップ領域にデータをスワップする頻度を設定します。これは、パーセンテージを表す0~100の値です。
値が0に近い場合、カーネルは絶対に必要な場合を除いて、データをディスクにスワップしません。スワップファイルとのやり取りは、RAMとのやり取りよりもはるかに時間がかかり、パフォーマンスが大幅に低下する可能性があるという点で、「コストがかかる」ことを忘れないでください。スワップにあまり依存しないようにシステムに指示すると、通常、システムの動作が高速になります。
値が100に近い場合は、RAMの空き容量をより確保するために、より多くのデータをスワップしようとします。アプリケーションのメモリプロファイルまたはサーバーの使用目的によっては、この方が良い場合もあります。
次のように入力して、現在のswappiness値を確認できます。
- cat /proc/sys/vm/swappiness
Output60
デスクトップの場合、swappinessの設定を60にすることは不適切な値ではありません。サーバーの場合は、値を0に近づけると良いでしょう。
sysctl
コマンドを使用して、swappinessを別の値に設定できます。
たとえば、swappinessを10に設定するには、次のように入力します。
- sudo sysctl vm.swappiness=10
Outputvm.swappiness = 10
この設定は、次の再起動まで保持されます。/etc/sysctl.conf
ファイルに次の行を追加して、再起動時にこの値を自動的に設定できます。
- sudo nano /etc/sysctl.conf
下部で、次の行を追加できます。
vm.swappiness=10
完了したら、ファイルを保存して閉じます。
変更する可能性があるもう一つの関連値は、vfs_cache_pressure
です。これは、システムが他のデータ上の_inode_および_dentry_の情報をキャッシュするために選択する量を設定します。
基本的に、これはファイルシステムに関するアクセスデータです。通常、これは検索に非常にコストがかかり、頻繁にリクエストされるため、システムがキャッシュするのに最適です。 proc
ファイルシステムを再度クエリすることで、現在の値を確認できます。
- cat /proc/sys/vm/vfs_cache_pressure
Output100
現在設定されているため、システムはinode情報をキャッシュからすぐに削除します。次のように入力して、これを50などのより保守的な値に設定できます。
- sudo sysctl vm.vfs_cache_pressure=50
Outputvm.vfs_cache_pressure = 50
繰り返しますが、これは現在のセッションでのみ有効です。swappiness設定で行ったように、設定ファイルに追加することで変更できます。
- sudo nano /etc/sysctl.conf
下部に、新しい値を指定する行を追加します。
vm.vfs_cache_pressure=50
完了したら、ファイルを保存して閉じます。
このガイドの手順に従うと、メモリ不足の例外が発生する可能性がある場合に備えて、ある程度の余裕ができます。スワップ領域は、これらの一般的な問題のいくつかを回避するのに非常に役立ちます。
OOM(メモリ不足)エラーが発生した場合、またはシステムが必要なアプリケーションを使用できない場合は、アプリケーション構成を最適化するか、サーバーをアップグレードすることが最善の解決策です。
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!