序章

アプリケーションのメモリ不足エラーを防ぐ最も簡単な方法の1つは、サーバーにスワップスペースを追加することです。 このガイドでは、Debian8サーバーにスワップファイルを追加する方法について説明します。

警告:従来の回転式ハードドライブを使用するシステムでは一般にスワップが推奨されますが、SSDでスワップを使用すると、時間の経過とともにハードウェアの劣化の問題が発生する可能性があります。 この考慮事項のため、DigitalOceanまたはSSDストレージを利用するその他のプロバイダーでスワップを有効にすることはお勧めしません。 そうすることは、あなたとあなたの隣人のための基礎となるハードウェアの信頼性に影響を与える可能性があります。 このガイドは、他の場所で回転ディスクシステムを使用している可能性のあるユーザー向けのリファレンスとして提供されています。

DigitalOceanでサーバーのパフォーマンスを向上させる必要がある場合は、Dropletをアップグレードすることをお勧めします。 これにより、一般的に良い結果が得られ、サービスに影響を与える可能性のあるハードウェアの問題に寄与する可能性が低くなります。

スワップとは何ですか?

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

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

ステップ1-システムのスワップ情報を確認する

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

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

  1. sudo swapon --show

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

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

  1. free -h
Output
total used free shared buffers cached Mem: 1.0G 331M 668M 4.3M 11M 276M -/+ buffers/cache: 44M 955M Swap: 0B 0B 0B

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

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

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

  1. df -h
Output
Filesystem Size Used Avail Use% Mounted on /dev/vda1 25G 946M 23G 4% / udev 10M 0 10M 0% /dev tmpfs 201M 4.3M 196M 3% /run tmpfs 501M 0 501M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 501M 0 501M 0% /sys/fs/cgroup tmpfs 101M 0 101M 0% /run/user/1001

この場合、Mounted on列に/が含まれているデバイスがディスクです。 この例では、十分なスペースがあります(946Mのみが使用されています)。 使用法はおそらく異なります。

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

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

使用可能なハードドライブの空き容量がわかったので、ファイルシステム内にスワップファイルを作成します。

ルート(/)ディレクトリにswapfileというファイルを作成します。 ファイルは、スワップファイルに必要な容量を割り当てる必要があります。 これを行うには、主に2つの方法があります。

伝統的なスローウェイ

従来は、ddコマンドを使用して、事前に割り当てられたスペースを持つファイルを作成していました。 この用途の広いディスクユーティリティは、ある場所から別の場所に書き込みます。

これを使用して、/dev/zeroにあるLinuxシステムの特別なデバイスからファイルにゼロを書き込むことができます。このデバイスは、要求された数のゼロを吐き出します。

ブロックサイズはbs、ブロック数はcountを組み合わせて、ファイルサイズを指定します。 各パラメータに割り当てるものは、ほぼ完全に任意です。 重要なのは、それらを掛け合わせた結果がどうなるかということです。

たとえば、この例では、1ギガバイトのファイルを作成しようとしています。 これを行うには、1メガバイトのブロックサイズと1024のカウントを指定します。

  1. sudo dd if=/dev/zero of=/swapfile bs=1M count=1024
Output
1024+0 records in 1024+0 records out 1073741824 bytes (1.1 GB) copied, 1.36622 s, 786 MB/s

of(出力ファイルを表す)を間違った場所に向けるとデータが破壊される可能性があるため、Enterキーを押す前にコマンドを確認してください。

次のように入力すると、1ギガバイトが割り当てられていることがわかります。

  1. ls -lh /swapfile
Output
-rw-r--r-- 1 root root 1.0G May 30 15:07 /swapfile

上記のコマンドを完了した場合、数秒かかったことに気付くかもしれません。 この小さなスワップファイルの場合はわずか1.3秒ですが、低速のハードドライブ上の大きなファイルの場合は大幅に増加する可能性があります。

ファイルをより速く作成する方法を学びたい場合は、sudo rm /swapfileを使用してファイルスワップファイルを削除してから、以下に従ってください。

より速い方法

同じファイルを取得するより簡単な方法は、fallocateプログラムを使用することです。 このコマンドは最新のファイルシステムでのみ機能するため、たとえばext3システムを使用している場合、このオプションは使用できません。

fallocateコマンドは、実際にダミーの内容を書き込むことなく、事前に割り当てられたサイズのファイルを即座に作成します。

次のように入力して、1ギガバイトのファイルを作成できます。

sudo fallocate -l 1G /swapfile

プロンプトはほぼすぐに返されます。 次のように入力すると、正しい容量のスペースが予約されていることを確認できます。

  1. ls -lh /swapfile
Output
-rw-r--r-- 1 root root 1.0G May 30 15:07 /swapfile

ご覧のとおり、ファイルは適切な量のスペースを確保して作成されています。

ステップ4–スワップファイルを有効にする

正しいサイズのファイルが利用できるようになったので、これを実際にスワップスペースに変換する必要があります。

まず、 root 権限を持つユーザーのみがコンテンツを読み取ることができるように、ファイルのアクセス許可をロックダウンする必要があります。 これにより、通常のユーザーがファイルにアクセスできなくなり、セキュリティに重大な影響を及ぼします。

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

  1. sudo chmod 600 /swapfile

次のように入力して、権限が変更されたことを確認します。

  1. ls -lh /swapfile
Output
-rw------- 1 root root 1.0G May 29 17:34 /swapfile

ご覧のとおり、rootユーザーのみが読み取りフラグと書き込みフラグを有効にしています。

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

  1. sudo mkswap /swapfile
Output
Setting up swapspace version 1, size = 1048572 KiB no label, UUID=757ee0b7-db04-46bd-aafb-adf6954ea077

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

  1. sudo swapon /swapfile

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

  1. sudo swapon --show
Output
NAME TYPE SIZE USED PRIO /swapfile file 1024M 0B -1

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

  1. free -h
Output
total used free shared buffers cached Mem: 1.0G 925M 74M 4.3M 13M 848M -/+ buffers/cache: 63M 936M Swap: 1.0G 0B 1.0G

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

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

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

100に近い値は、より多くのRAMスペースを解放するために、より多くのデータをスワップに入れようとします。 アプリケーションのメモリプロファイルまたはサーバーの使用目的によっては、これが優れている場合があります。

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

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

デスクトップの場合、60のswappiness設定は悪い値ではありません。 サーバーの場合は、サーバーを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

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

キャッシュ圧力設定の調整

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

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

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

現在構成されているため、システムはiノード情報をキャッシュからすばやく削除します。 次のように入力することで、これを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(メモリ不足)エラーが発生した場合、またはシステムが必要なアプリケーションを使用できない場合、最善の解決策は、アプリケーション構成を最適化するか、サーバーをアップグレードすることです。