はじめに

アプリケーションのメモリ不足エラーを防ぐ方法の一つは、サーバーにスワップ領域を追加することです。このガイドでは、Ubuntu 20.04サーバーにスワップファイルを追加する方法を扱います。

[warning]

警告:通常、従来の回転ハードドライブを使用したシステムではスワップが推奨されますが、SSDにスワップを配置すると時間の経過とともにハードウェアの劣化の問題が発生する可能性があります。このため、the cloud providerまたはSSDストレージを使用するその他のプロバイダーでスワップを有効にすることはお勧めしません。

スワップとは何ですか?

ubuntu illustration for: スワップとは何ですか?

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

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

ステップ1 – システムのスワップ情報を確認

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

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

				
					
sudo swapon --show

				
			

出力が返されない場合、システムに現在使用可能なスワップ領域がないということです。

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

				
					
free -h

				
			
				
					
[secondary_label Output]

 total used free shared buff/cache available

Mem: 981Mi 122Mi 647Mi 0.0Ki 211Mi 714Mi

<^>Swap: 0B 0B 0B<^>

				
			

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

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

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

				
					
df -h

				
			
				
					
[secondary_label Output]

Filesystem 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を超えるスワップはおそらく不要です。

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

使用可能なハードドライブのスペースを確認したので、ファイルシステムにスワップファイルを作成できます。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

				
			

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

ステップ4 – スワップファイルの有効化

適切なサイズのファイルが使用可能となったので、実際にこれをスワップ領域に変換する必要があります。

まず、root権限を持つユーザーのみが内容を読み取ることができるように、ファイルのアクセス許可をロックする必要があります。これにより通常のユーザーがファイルにアクセスできなくなるため、セキュリティにとって重要な意味を持ちます。

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

				
					
sudo chmod 600 /swapfile

				
			

次のように入力して、アクセス権限の変更を確認します。

				
					
ls -lh /swapfile

				
			
				
					
[secondary_label Output]

<^>-rw-------<^> 1 root root 1.0G Apr 25 11:14 /swapfile

				
			

ご覧のとおり、読み取りおよび書き込みフラグが有効になっているのはrootユーザーのみです。

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

				
					
sudo mkswap /swapfile

				
			
				
					
[secondary_label Output]

Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)

no label, UUID=6e965805-2ab9-450f-aed6-577e74089dbf

				
			

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

				
					
sudo swapon /swapfile

				
			

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

				
					
sudo swapon --show

				
			
				
					
[secondary_label Output]

NAME TYPE SIZE USED PRIO

/swapfile file 1024M 0B -2

				
			

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

				
					
free -h

				
			
				
					
[secondary_label Output]

 total used free shared buff/cache available

Mem: 981Mi 123Mi 644Mi 0.0Ki 213Mi 714Mi

<^>Swap: 1.0Gi 0B 1.0Gi<^>

				
			

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

ステップ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の値です。

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

値が100に近い場合は、RAMの空き容量をより確保するために、より多くのデータをスワップしようとします。アプリケーションのメモリプロファイルまたはサーバーの使用目的によっては、この方が良い場合もあります。

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

				
					
cat /proc/sys/vm/swappiness

				
			
				
					
[secondary_label Output]

60

				
			

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

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

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

				
					
sudo sysctl vm.swappiness=10

				
			
				
					
[secondary_label Output]

vm.swappiness = 10

				
			

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

				
					
sudo nano /etc/sysctl.conf

				
			

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

				
					
[label /etc/sysctl.conf]

vm.swappiness=10

				
			

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

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

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

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

				
					
cat /proc/sys/vm/vfs_cache_pressure

				
			
				
					
[secondary_label Output]

100

				
			

現在設定されているため、システムはinode情報をキャッシュからすぐに削除します。次のように入力して、これを50などのより保守的な値に設定できます。

				
					
sudo sysctl vm.vfs_cache_pressure=50

				
			
				
					
[secondary_label Output]

vm.vfs_cache_pressure = 50

				
			

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

				
					
sudo nano /etc/sysctl.conf

				
			

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

				
					
[label /etc/sysctl.conf]

vm.vfs_cache_pressure=50

				
			

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

まとめ

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

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