// Tutorial //

Ubuntu 20.04にスワップ領域を追加する方法

Published on November 16, 2020
Default avatar
By Brian Boucheron
Developer and author at DigitalOcean.
日本語
Ubuntu 20.04にスワップ領域を追加する方法

はじめに

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

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

スワップとは何ですか?

_スワップ_は、オペレーティングシステムが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の量と同じか2倍の量が、出発点として適しています。もう一つの経験則として、RAMのフォールバックとして使用するだけであれば、4Gを超えるスワップはおそらく不要です。

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

使用可能なハードドライブのスペースを確認したので、ファイルシステムにスワップファイルを作成できます。root(/)ディレクトリに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プロパティの調整

swappinessパラメーターは、システムがRAMからスワップ領域にデータをスワップする頻度を設定します。これは、パーセンテージを表す0~100の値です。

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

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

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

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

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

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

たとえば、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

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

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

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


Want to learn more? Join the DigitalOcean Community!

Join our DigitalOcean community of over a million developers for free! Get help and share knowledge in our Questions & Answers section, find tutorials and tools that will help you grow as a developer and scale your project or business, and subscribe to topics of interest.

Sign up
About the authors
Default avatar
Developer and author at DigitalOcean.

Still looking for an answer?

Was this helpful?
Leave a comment

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!