このチュートリアルの以前のバージョンはhttps://www.digitalocean.com/community/users/jellingwood[Justin Ellingwood]によって作成されました
前書き
アプリケーションのメモリ不足エラーから保護する最も簡単な方法の1つは、サーバーにスワップスペースを追加することです。 このガイドでは、Ubuntu 18.04サーバーにスワップファイルを追加する方法について説明します。
スワップとは何ですか?
_Swap_は、オペレーティングシステムがRAMに保持できなくなったデータを一時的に保存できる場所として指定されたハードドライブ上の領域です。 基本的に、これにより、サーバーが作業「メモリー」に保持できる情報量を増やすことができますが、いくつかの注意事項があります。 ハードドライブのスワップ領域は、主に、使用中のアプリケーションデータを保持するのに十分なRAM領域がなくなったときに使用されます。
ディスクに書き込まれる情報は、RAMに保持される情報よりもかなり遅くなりますが、オペレーティングシステムは、メモリ内でアプリケーションデータを実行し続け、古いデータにスワップを使用することを好みます。 全体的に、システムのRAMが枯渇した場合のフォールバックとしてスワップスペースを使用することは、SSD以外のストレージが利用可能なシステムでのメモリ不足の例外に対する優れた安全策となります。
手順1-システムのスワップ情報を確認する
開始する前に、システムに既に使用可能なスワップスペースがあるかどうかを確認できます。 複数のスワップファイルまたはスワップパーティションを作成することは可能ですが、通常は1つで十分です。
次のように入力して、システムにスワップが構成されているかどうかを確認できます。
sudo swapon --show
出力が返されない場合、これはシステムに現在利用可能なスワップ領域がないことを意味します。
`+ free +`ユーティリティを使用して、アクティブなスワップがないことを確認できます。
free -h
Output total used free shared buff/cache available
Mem: 985M 84M 222M 680K 678M 721M
出力の* Swap *行で確認できるように、システムでアクティブなスワップはありません。
手順2-ハードドライブパーティションの空き領域を確認する
スワップファイルを作成する前に、現在のディスク使用量をチェックして、十分なスペースがあることを確認します。 これを行うには、次を入力します。
df -h
OutputFilesystem Size Used Avail Use% Mounted on
udev 481M 0 481M 0% /dev
tmpfs 99M 656K 98M 1% /run
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つの良い経験則は、4G以上のスワップは、RAMフォールバックとして使用している場合はおそらく不要であることです。
ステップ3 –スワップファイルの作成
ハードドライブの空き容量がわかったので、ファイルシステムにスワップファイルを作成できます。 ルート(/)ディレクトリに、「+ swapfile +」と呼ばれるスワップサイズのファイルを割り当てます。
スワップファイルを作成する最良の方法は、 `+ fallocate +`プログラムを使用することです。 このコマンドは、指定されたサイズのファイルを即座に作成します。
この例のサーバーには1GのRAMがあるため、このガイドでは1Gファイルを作成します。 独自のサーバーのニーズに合わせてこれを調整します。
sudo fallocate -l /swapfile
次のように入力することで、正しい量のスペースが予約されたことを確認できます。
ls -lh /swapfile
-rw-r--r-- 1 root root 1.0G Apr 25 11:14 /swapfile
ファイルは、適切な量のスペースを確保して作成されています。
ステップ4 –スワップファイルの有効化
正しいサイズのファイルが使用可能になったので、実際にこれをスワップスペースに変換する必要があります。
最初に、* root *権限を持つユーザーのみがコンテンツを読み取れるように、ファイルのアクセス許可をロックダウンする必要があります。 これにより、通常のユーザーがファイルにアクセスできなくなり、セキュリティに重大な影響が生じます。
次のように入力して、* root *のみがファイルにアクセスできるようにします。
sudo chmod 600 /swapfile
次を入力して、アクセス許可の変更を確認します。
ls -lh /swapfile
Output 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: 985M 84M 220M 680K 680M 722M
スワップは正常にセットアップされ、オペレーティングシステムは必要に応じて使用を開始します。
ステップ5 –スワップファイルを永続的にする
最近の変更により、現在のセッションのスワップファイルが有効になりました。 ただし、再起動すると、サーバーはスワップ設定を自動的に保持しません。 これを変更するには、スワップファイルを `+ / 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
次に、更新してスワップスペースを調整できる設定を確認します。
ステップ6 –スワップ設定の調整
スワップを処理するときにシステムのパフォーマンスに影響を与えるいくつかのオプションを設定できます。
Swappinessプロパティの調整
`+ swappiness +`パラメータは、システムがRAMからスワップスペースにデータをスワップする頻度を設定します。 これは、パーセンテージを表す0〜100の値です。
値がゼロに近い場合、カーネルはどうしても必要な場合を除き、ディスクにデータをスワップしません。 スワップファイルとのやり取りは、RAMとのやり取りよりも時間がかかり、パフォーマンスが大幅に低下する可能性があるという点で、「高価」です。 一般に、スワップにあまり依存しないようにシステムに指示すると、システムが高速になります。
100に近い値は、より多くのRAMスペースを空けるために、より多くのデータをスワップに入れようとします。 アプリケーションのメモリプロファイルまたはサーバーの使用目的に応じて、これは場合によってはより良い可能性があります。
次のように入力することにより、現在の交換可能性の値を確認できます。
cat /proc/sys/vm/swappiness
Output60
デスクトップの場合、60のswappiness設定は悪い値ではありません。 サーバーの場合、0に近づけることができます。
`+ sysctl +`コマンドを使用して、swappinessを別の値に設定できます。
たとえば、swappinessを10に設定するには、次のように入力します。
sudo sysctl vm.swappiness=10
Outputvm.swappiness = 10
この設定は、次の再起動まで持続します。 `+ / etc / sysctl.conf +`ファイルに次の行を追加することで、再起動時にこの値を自動的に設定できます。
sudo nano /etc/sysctl.conf
下部で、次を追加できます。
/etc/sysctl.conf
vm.swappiness=10
完了したら、ファイルを保存して閉じます。
キャッシュプレッシャー設定の調整
変更が必要な別の関連する値は、 `+ vfs_cache_pressure +`です。 この設定は、システムが_inode_および_dentry_情報を他のデータにキャッシュすることを選択する量を構成します。
基本的に、これはファイルシステムに関するアクセスデータです。 通常、これは検索に非常にコストがかかり、非常に頻繁にリクエストされるため、システムがキャッシュするのは素晴らしいことです。 現在の値は、 `+ proc +`ファイルシステムを再度クエリすることで確認できます。
cat /proc/sys/vm/vfs_cache_pressure
Output100
現在設定されているため、システムはキャッシュからiノード情報をすぐに削除します。 次のように入力して、これを50などのより保守的な設定に設定できます。
sudo sysctl vm.vfs_cache_pressure=50
Outputvm.vfs_cache_pressure = 50
繰り返しますが、これは現在のセッションでのみ有効です。 swappiness設定で行ったように、設定ファイルに追加することで変更できます。
sudo nano /etc/sysctl.conf
下部に、新しい値を指定する行を追加します。
/etc/sysctl.conf
vm.vfs_cache_pressure=50
完了したら、ファイルを保存して閉じます。
結論
このガイドの手順に従うと、そうしないとメモリ不足の例外が発生する可能性がある場合に、ある程度余裕ができます。 スワップスペースは、これらの一般的な問題のいくつかを回避するのに非常に役立ちます。
OOM(メモリ不足)エラーが発生した場合、またはシステムが必要なアプリケーションを使用できない場合は、アプリケーション構成を最適化するか、サーバーをアップグレードすることが最善の解決策です。