前書き
アプリケーションのメモリ不足エラーから保護する最も簡単な方法の1つは、サーバーにスワップスペースを追加することです。 このガイドでは、スワップファイルをDebian 8サーバーに追加する方法について説明します。
スワップとは何ですか?
_Swap_は、オペレーティングシステムがRAMに保持できなくなったデータを一時的に保存できる場所として指定されたハードドライブ上の領域です。 基本的に、これにより、サーバーが作業「メモリー」に保持できる情報量を増やすことができますが、いくつかの注意事項があります。 ハードドライブのスワップ領域は、主に、使用中のアプリケーションデータを保持するのに十分なRAM領域がなくなったときに使用されます。
ディスクに書き込まれる情報は、RAMに保持される情報よりもかなり遅くなりますが、オペレーティングシステムは、メモリ内でアプリケーションデータを実行し続け、古いデータにスワップを使用することを好みます。 全体的に、システムのRAMが枯渇した場合のフォールバックとしてスワップスペースを使用することは、SSD以外のストレージが利用可能なシステムでのメモリ不足の例外に対する優れた安全策となります。
手順1-システムのスワップ情報を確認する
開始する前に、システムに既に使用可能なスワップスペースがあるかどうかを確認できます。 複数のスワップファイルまたはスワップパーティションを作成することは可能ですが、通常は1つで十分です。
次のように入力して、システムにスワップが構成されているかどうかを確認できます。
sudo swapon --show
出力が返されない場合、これはシステムに現在利用可能なスワップ領域がないことを意味します。
`+ free +`ユーティリティを使用して、アクティブなスワップがないことを確認できます。
free -h
Output total used free shared buffers cached
Mem: 1.0G 331M 668M 4.3M 11M 276M
-/+ buffers/cache: 44M 955M
出力の* Swap *行で確認できるように、システムでアクティブなスワップはありません。
手順2-ハードドライブパーティションの空き領域を確認する
スワップファイルを作成する前に、現在のディスク使用量をチェックして、十分なスペースがあることを確認します。 これを行うには、次を入力します。
df -h
OutputFilesystem 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つの良い経験則は、4G以上のスワップは、RAMフォールバックとして使用している場合はおそらく不要であることです。
ステップ3 –スワップファイルの作成
ハードドライブの空き容量がわかったので、ファイルシステム内にスワップファイルを作成します。
ルート(/)ディレクトリに `+ swapfile +`というファイルを作成します。 ファイルは、スワップファイルに必要なスペースを割り当てる必要があります。 これを行うには、主に2つの方法があります。
伝統的なスローウェイ
伝統的に、 `+ dd +`コマンドを使用して、事前に割り当てられたスペースを持つファイルを作成していました。 この汎用ディスクユーティリティは、ある場所から別の場所に書き込みます。
これを使用して、要求された数だけゼロを吐き出す「+ / dev / zero +」にあるLinuxシステムの特別なデバイスからファイルにゼロを書き込むことができます。
ブロックサイズに「+ bs 」とブロック数に「 count +」を組み合わせて、ファイルサイズを指定します。 各パラメーターに割り当てるものは、ほぼ完全に任意です。 重要なのは、それらを乗算した結果がどうなるかということです。
たとえば、この例では、1ギガバイトのファイルを作成しようとしています。 これを行うには、1メガバイトのブロックサイズと1024のカウントを指定します。
sudo dd if=/dev/zero of=/swapfile bs=1M count=1024
Output1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 1.36622 s, 786 MB/s
ENTERを押す前にコマンドを確認してください。これは、 + of +
(出力ファイルを意味する)を間違った場所に向けるとデータを破壊する可能性があるためです。
次のように入力すると、1ギガバイトが割り当てられていることがわかります。
ls -lh /swapfile
Output-rw-r--r-- 1 root root May 30 15:07 /swapfile
上記のコマンドを完了した場合、数秒かかることがあります。 この小さなスワップファイルではわずか1.3秒ですが、低速のハードドライブ上の大きなファイルでは大幅に増加する可能性があります。
ファイルをより速く作成する方法を学びたい場合は、 `+ sudo rm / swapfile +`を使用してファイルswapfileを削除し、以下に従ってください:
より速い方法
同じファイルを手早く取得する方法は、 `+ fallocate `プログラムを使用することです。 このコマンドは最新のファイルシステムでのみ機能するため、たとえば、「 ext3 +」システムを使用している場合、このオプションは使用できません。
`+ fallocate +`コマンドは、実際にダミーコンテンツを書き込むことなく、事前に割り当てられたサイズのファイルを即座に作成します。
次のように入力して、1ギガバイトのファイルを作成できます。
sudo fallocate -l 1G /swapfile
プロンプトはすぐに返されます。 次のように入力することで、正しい量のスペースが予約されたことを確認できます。
ls -lh /swapfile
Output-rw-r--r-- 1 root root May 30 15:07 /swapfile
ご覧のとおり、ファイルは正しい量のスペースを確保して作成されています。
ステップ4 –スワップファイルの有効化
正しいサイズのファイルが使用可能になったので、実際にこれをスワップスペースに変換する必要があります。
最初に、* root *権限を持つユーザーのみがコンテンツを読み取れるように、ファイルのアクセス許可をロックダウンする必要があります。 これにより、通常のユーザーがファイルにアクセスできなくなり、セキュリティに重大な影響が生じます。
次のように入力して、* root *のみがファイルにアクセスできるようにします。
sudo chmod 600 /swapfile
次を入力して、アクセス許可の変更を確認します。
ls -lh /swapfile
Output 1 root root 1.0G May 29 17:34 /swapfile
ご覧のとおり、* root *ユーザーのみが読み取りおよび書き込みフラグを有効にしています。
次のように入力して、ファイルをスワップスペースとしてマークできます。
sudo mkswap /swapfile
OutputSetting up swapspace version 1, size = 1048572 KiB
no label, UUID=757ee0b7-db04-46bd-aafb-adf6954ea077
ファイルにマークを付けたら、スワップファイルを有効にして、システムがそれを利用できるようにします。
sudo swapon /swapfile
次のように入力して、スワップが使用可能であることを確認します。
sudo swapon --show
OutputNAME TYPE SIZE USED PRIO
/swapfile file 1024M 0B -1
結果を確認するために、 `+ free +`ユーティリティの出力を再度確認できます。
free -h
Output total used free shared buffers cached
Mem: 1.0G 925M 74M 4.3M 13M 848M
-/+ buffers/cache: 63M 936M
スワップは正常にセットアップされ、オペレーティングシステムは必要に応じて使用を開始します。
ステップ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の値です。
値がゼロに近い場合、カーネルはどうしても必要な場合を除き、ディスクにデータをスワップしません。 スワップファイルとのやり取りは、RAMとのやり取りよりも時間がかかり、パフォーマンスが大幅に低下する可能性があるという点で、「高価」です。 一般に、スワップにあまり依存しないようにシステムに指示すると、システムが高速になります。
100に近い値は、より多くのRAMスペースを空けるために、より多くのデータをスワップに入れようとします。 アプリケーションのメモリプロファイルまたはサーバーの使用目的に応じて、これは場合によってはより良い可能性があります。
次のように入力することにより、現在の交換可能性の値を確認できます。
cat /proc/sys/vm/swappiness
Output60
デスクトップの場合、60のswappiness設定は悪い値ではありません。 サーバーの場合、0に近づけることができます。
`+ sysctl +`コマンドを使用して、swappinessを別の値に設定できます。
たとえば、swappinessを10に設定するには、次のように入力します。
sudo sysctl vm.swappiness=10
Outputvm.swappiness = 10
この設定は、次の再起動まで持続します。 `+ / etc / sysctl.conf +`ファイルに次の行を追加することで、再起動時にこの値を自動的に設定できます。
sudo nano /etc/sysctl.conf
下部で、次を追加できます。
/etc/sysctl.conf
vm.swappiness=10
完了したら、ファイルを保存して閉じます。
キャッシュプレッシャー設定の調整
変更が必要な別の関連する値は、 `+ vfs_cache_pressure +`です。 この設定は、システムが_inode_および_dentry_情報を他のデータにキャッシュすることを選択する量を構成します。
基本的に、これはファイルシステムに関するアクセスデータです。 通常、これは検索に非常にコストがかかり、非常に頻繁にリクエストされるため、システムがキャッシュするのは素晴らしいことです。 現在の値は、 `+ proc +`ファイルシステムを再度クエリすることで確認できます。
cat /proc/sys/vm/vfs_cache_pressure
Output100
現在設定されているため、システムはキャッシュからiノード情報をすぐに削除します。 次のように入力して、これを50などのより保守的な設定に設定できます。
sudo sysctl vm.vfs_cache_pressure=50
Outputvm.vfs_cache_pressure = 50
繰り返しますが、これは現在のセッションでのみ有効です。 swappiness設定で行ったように、設定ファイルに追加することで変更できます。
sudo nano /etc/sysctl.conf
下部に、新しい値を指定する行を追加します。
/etc/sysctl.conf
vm.vfs_cache_pressure=50
完了したら、ファイルを保存して閉じます。
結論
このガイドの手順に従うと、そうしないとメモリ不足の例外が発生する可能性がある場合に、ある程度余裕ができます。 スワップスペースは、これらの一般的な問題のいくつかを回避するのに非常に役立ちます。
OOM(メモリ不足)エラーが発生した場合、またはシステムが必要なアプリケーションを使用できない場合は、アプリケーション構成を最適化するか、サーバーをアップグレードすることが最善の解決策です。