前書き

サーバーの応答性を高め、アプリケーションのメモリ不足エラーから保護する最も簡単な方法の1つは、スワップスペースを追加することです。 このガイドでは、Ubuntu 16.04サーバーにスワップファイルを追加する方法について説明します。

警告

スワップとは何ですか?

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

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

システムのスワップ情報を確認します

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

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

sudo swapon --show

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

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

free -h
Output              total        used        free      shared  buff/cache   available
Mem:           488M         36M        104M        652K        348M        426M

出力の「スワップ」行で確認できるように、システム上でアクティブなスワップはありません。

ハードドライブパーティションの空き容量を確認する

スワップ用のスペースを割り当てる最も一般的な方法は、タスク専用の個別のパーティションを使用することです。 ただし、パーティションスキームの変更は常に可能とは限りません。 既存のパーティションに存在するスワップファイルを簡単に作成できます。

これを行う前に、次のように入力して現在のディスク使用量を確認する必要があります。

df -h
OutputFilesystem      Size  Used Avail Use% Mounted on
udev            238M     0  238M   0% /dev
tmpfs            49M  624K   49M   2% /run

tmpfs           245M     0  245M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           245M     0  245M   0% /sys/fs/cgroup
tmpfs            49M     0   49M   0% /run/user/1001

この場合、「+ / dev +」の下のデバイスがディスクです。 この例では十分なスペースがあります(1.1Gのみを使用)。 使用方法はおそらく異なるでしょう。

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

スワップファイルを作成する

ハードドライブの空き容量がわかったので、ファイルシステム内にスワップファイルを作成します。 ルート(/)ディレクトリに `+ swapfile +`と呼ばれるスワップサイズのファイルを作成します。

スワップファイルを作成する最良の方法は、 `+ fallocate +`プログラムを使用することです。 このコマンドは、事前に割り当てられたサイズのファイルを即座に作成します。

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

sudo fallocate -l  /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 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   -1

結果を確認するために、 `+ free +`ユーティリティの出力を再度確認できます。

free -h
Output              total        used        free      shared  buff/cache   available
Mem:           488M         37M         96M        652K        354M        425M

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

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

最近の変更により、現在のセッションのスワップファイルが有効になりました。 ただし、再起動すると、サーバーはスワップ設定を自動的に保持しません。 これを変更するには、スワップファイルを `+ / 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プロパティの調整

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