Ubuntu 22.04でスワップスペースを追加する方法

はじめに

アプリケーションのメモリ不足エラーに対処する方法の一つは、サーバーにいくつかのスワップ領域を追加することです。このガイドでは、Ubuntu 22.04サーバーにスワップファイルを追加する方法について説明します。

スワップとは?

スワップは、オペレーティングシステムがRAMに保持できなくなったデータを一時的に保存するために確保されたハードドライブのストレージの一部です。これにより、サーバーが作業メモリに保持できる情報量を増やすことができますが、いくつかの注意点があります。ハードドライブ上のスワップ領域は、RAMに十分なスペースがなくなったときに主に使用されます。RAMに保持されている情報よりもディスクに書き込まれる情報は著しく遅くなりますが、オペレーティングシステムは実行中のアプリケーションデータをメモリに保持し、古いデータにはスワップを使用することを好みます。全体として、システムのRAMが枯渇した場合のフォールバックとしてのスワップ領域の存在は、利用可能な非SSDストレージを持つシステムにおけるメモリ不足例外に対する良い安全装置となります。

ステップ1 – スワップ情報のシステムチェック

始める前に、システムにすでにいくつかのスワップ領域が利用可能かどうかを確認できます。複数のスワップファイルやスワップパーティションが存在する可能性がありますが、一般的には1つで十分です。

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

  1. sudo swapon --show

出力が返ってこない場合、現在システムにスワップ領域が利用できないことを意味します。

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

  1. free -h
Output
total used free shared buff/cache available Mem: 981Mi 122Mi 647Mi 0.0Ki 211Mi 714Mi Swap: 0B 0B 0B

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

ステップ2 – ハードドライブパーティション上の利用可能なスペースをチェック

スワップファイルを作成する前に、現在のディスク使用状況をチェックして十分なスペースがあるかどうかを確認します。次のように入力してください:

  1. df -h
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と同じ量またはその倍の量が良い出発点です。もう1つの良い指標は、4G以上のスワップがRAMのフォールバックとして使用する場合にはおそらく不要であるということです。

ステップ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: 981Mi 123Mi 644Mi 0.0Ki 213Mi 714Mi Swap: 1.0Gi 0B 1.0Gi

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

ステップ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パラメータは、システムがRAMからデータをスワップスペースに移動する頻度を設定します。これは、0から100の値で、パーセンテージを表します。

値がゼロに近い場合、カーネルはデータをディスクにスワップさせる必要がない限り行いません。スワップファイルとのやり取りは「高価」であり、RAMとのやり取りよりもはるかに長くかかるため、パフォーマンスの著しい低下を引き起こす可能性があります。システムにスワップをあまり頼らないように指示すると、一般にシステムがより高速になります。

値が100に近い場合、より多くのデータをスワップし、RAMスペースをより空きに保とうとします。アプリケーションのメモリプロファイルやサーバーの用途に応じて、これが適している場合もあります。

現在のswappiness値を確認するには、次のように入力します:

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

デスクトップの場合、swappiness設定を60にするのは悪くありません。サーバーの場合、0に近づけることをお勧めします。

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

例えば、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です。この設定は、システムが他のデータよりもinodeおよびdentry情報をどれだけキャッシュするかを構成します。

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

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

現在の設定では、システムがinode情報をキャッシュから削除する速度が速すぎます。これを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)に遭遇したり、必要なアプリケーションを使用できない場合は、最良の解決策は、アプリケーションの構成を最適化するか、サーバーをアップグレードすることです。

Source:
https://www.digitalocean.com/community/tutorials/how-to-add-swap-space-on-ubuntu-22-04