A previous version of this tutorial was written by Justin Ellingwood
Introduction
アプリケーションでのメモリ不足のエラーを防ぐ最も簡単な方法の1つは、サーバーにいくつかのスワップ領域を追加することです。 このガイドでは、Ubuntu 18.04 サーバーにスワップ ファイルを追加する方法を説明します。
警告。 スワップは、一般に、従来の回転ハードディスクを利用するシステムに推奨されますが、SSD でスワップを使用すると、時間の経過とともにハードウェアの劣化の問題が発生する可能性があります。 この考慮のため、DigitalOceanまたはSSDストレージを利用する他のプロバイダでswapを有効にすることはお勧めしません。 そうすることで、あなたとあなたの隣人のための基礎となるハードウェアの信頼性に影響を与える可能性があります。 このガイドは、他の場所で回転ディスクシステムを持っているかもしれないユーザーのための参考として提供されています。
DigitalOcean上のサーバーのパフォーマンスを向上させる必要がある場合、我々はあなたのドロップレットをアップグレードすることをお勧めします。 これは、一般的に良い結果につながり、サービスに影響を与える可能性のあるハードウェアの問題に貢献する可能性を減少させます。
スワップとは何ですか?
スワップとは、オペレーティングシステムがRAMに保持できなくなったデータを一時的に格納できる場所として指定されているハードドライブ上の領域です。 基本的に、これは、サーバーがその作業「メモリ」に保持できる情報量を増やす能力を提供しますが、いくつかの注意点があります。 ハード ドライブ上のスワップ領域は、主に、使用中のアプリケーション データを保持するのに十分な領域が RAM になくなったときに使用されます。
ディスクに書き込まれた情報は RAM に保持された情報よりもかなり遅くなりますが、オペレーティング システムは実行中のアプリケーション データをメモリに保持し、古いデータにはスワップを使用することを選択します。 全体として、システムの RAM が枯渇した場合の予備としてスワップ領域を持つことは、SSD 以外のストレージが利用可能なシステムにおいて、メモリ不足の例外に対する良いセーフティ ネットとなり得ます。
Step 1 – システムにスワップ情報をチェックする
始める前に、システムにすでに利用できるスワップ領域があるかチェックできます。
システムに設定されたスワップがあるかどうかは、次のように入力することで確認できます:
- sudo swapon --show
何も出力されない場合、システムには現在利用可能なスワップ領域がないことを意味します。
free
ユーティリティを使用して、アクティブなスワップがないことを確認できます。
- free -h
Output total used free shared buff/cache availableMem: 985M 84M 222M 680K 678M 721MSwap: 0B 0B 0B
出力のスワップ行にあるように、システム上でスワップはアクティブではありません。
ステップ 2 – ハードドライブ パーティションの空き容量をチェック
スワップファイルを作成する前に、現在のディスク使用量をチェックして、十分な空き容量を確保することにします。
- df -h
OutputFilesystem Size Used Avail Use% Mounted onudev 481M 0 481M 0% /devtmpfs 99M 656K 98M 1% /run/dev/vda1 25G 1.4G 23G 6% /tmpfs 493M 0 493M 0% /dev/shmtmpfs 5.0M 0 5.0M 0% /run/locktmpfs 493M 0 493M 0% /sys/fs/cgroup/dev/vda15 105M 3.4M 102M 4% /boot/efitmpfs 99M 0 99M 0% /run/user/1000
Mounted on
列に /
があるデバイスが、この場合のディスクです。 この例では、十分な空き容量があります(使用量はわずか1.4G)。 スワップスペースの適切なサイズについては多くの意見がありますが、実際には個人の好みとアプリケーションの要件に依存します。 一般に、システム上の RAM の量と同じか 2 倍の量が、良い出発点となります。 もう 1 つの経験則は、スワップを RAM のフォールバックとして使用する場合、4G を超えるスワップはおそらく不要であるということです。 ルート (/) ディレクトリに 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
正しい容量が確保されたファイルが作成されています。
Step 4 – スワップファイルを有効にする
正しいサイズのファイルが利用可能になったので、これを実際にスワップスペースにする必要があります。
まず、ファイルの権限をロックして、ルート権限を持つユーザーのみが内容を読み取れるようにする必要があります。
Make the file only access to root by typing:
- sudo chmod 600 /swapfile
Verify the permissions change by typing:
- ls -lh /swapfile
Output -rw------- 1 root root 1.0G Apr 25 11:14 /swapfile
ご覧のように、ルート ユーザーだけが読み取りおよび書き込みフラグを有効にしています。
- sudo mkswap /swapfile
OutputSetting up swapspace version 1, size = 1024 MiB (1073737728 bytes)no label, UUID=6e965805-2ab9-450f-aed6-577e74089dbf
ファイルをマークした後、スワップファイルを有効にして、システムがスワップを利用できるようにします。
- sudo swapon --show
OutputNAME TYPE SIZE USED PRIO/swapfile file 1024M 0B -2
free
ユーティリティの出力を再度確認し、発見を裏付けることができます。
Step 5 – Swap File Permanent
Our recent changes have enabled the swap file for the current session. しかし、再起動すると、サーバーはスワップ設定を自動的に保持しません。
/etc/fstab
ファイルにスワップファイルを追加することにより、これを変更できます。
- sudo cp /etc/fstab /etc/fstab.bak
何か問題が発生したときのために /etc/fstab
ファイルをバックアップします。
Step 6 – スワップ設定の調整
スワップを扱う際に、システムのパフォーマンスに影響を与える設定可能なオプションがいくつかあります。
Adjusting the Swappiness Property
swappiness
パラメーターは、システムが RAM からスワップ領域へデータをスワップする頻度を設定できます。 これは 0 から 100 までの値で、パーセンテージを表します。
ゼロに近い値では、カーネルは絶対に必要な場合を除き、データをディスクにスワップしません。 スワップ・ファイルとのやりとりは、RAM とのやりとりよりもずっと時間がかかるという意味で「高価」であり、パフォーマンスの大幅な低下を引き起こす可能性があることを覚えておいてください。 スワップにあまり依存しないようにシステムに指示することで、一般的にシステムを高速化できます。
100 に近い値は、より多くの RAM スペースを空けるためにスワップに多くのデータを配置しようとします。 アプリケーションのメモリプロファイルやサーバーの用途によっては、この方が良い場合もあります。
- cat /proc/sys/vm/swappiness
Output60
次のように入力すると、現在の swappiness 値を確認できます。
たとえば、swappiness を 10 に設定するには、次のように入力します:
- sudo sysctl vm.swappiness=10
Outputvm.swappiness = 10
この設定は、次の再起動まで維持されます。 再起動時にこの値を自動的に設定するには、/etc/sysctl.conf
ファイルに次の行を追加します:
- sudo nano /etc/sysctl.conf
下部に、:
vm.swappiness=10
終了したら保存してファイルを閉じます。
Cache Pressure Setting
変更したいかもしれない別の関連値は vfs_cache_pressure
です。 この設定は、システムが他のデータよりも inode および dentry 情報をどのくらいキャッシュするかを設定します。
基本的に、これはファイルシステムに関するアクセスデータです。 これは一般的に検索に非常にコストがかかり、非常に頻繁に要求されるため、システムにとってキャッシュすることは素晴らしいことです。 proc
ファイルシステムに再度問い合わせることで、現在の値を確認できます:
- cat /proc/sys/vm/vfs_cache_pressure
Output100
現在の設定だと、システムがキャッシュから inode 情報を削除するスピードが速すぎるようです。
- sudo sysctl vm.vfs_cache_pressure=50
Outputvm.vfs_cache_pressure = 50
と入力すれば、これを 50 のようなより保守的な設定にすることができます。 swappiness 設定と同様に、設定ファイルに追加することで変更できます:
- sudo nano /etc/sysctl.conf
最後に、新しい値を指定する行を追加します:
vm.vfs_cache_pressure=50
終了したら、ファイルを保存して閉じます。
Conclusion
このガイドのステップに従うと、そうしないとメモリ不足の例外につながるようなケースで、いくらか余裕が生まれます。 スワップ領域は、これらの一般的な問題のいくつかを回避するのに非常に役立ちます。
OOM (out of memory) エラーに遭遇した場合、またはシステムが必要なアプリケーションを使用できない場合、最善の解決策は、アプリケーション構成を最適化するか、サーバーをアップグレードすることです。