序章

サーバーの応答性を高め、アプリケーションのメモリ不足エラーを防ぐ最も簡単な方法の1つは、スワップスペースを追加することです。 スワップは、オペレーティングシステムがメモリに保持できなくなったデータを一時的に保存できるストレージドライブ上の領域です。

これにより、サーバーが作業メモリーに保持できる情報の量を増やすことができますが、いくつかの注意点があります。 スワップからの読み取りとスワップへの書き込みはメモリを使用するよりも遅くなりますが、サーバーのメモリが不足している場合に備えて、優れたセーフティネットを提供できます。

スワップを使用しないと、メモリが不足したサーバーがアプリケーションを強制終了してメモリを解放し始めたり、クラッシュしたりする可能性があります。 これにより、保存されていないデータが失われたり、ダウンタイムが発生したりする可能性があります。 信頼性の高いデータアクセスを確保するために、一部のアプリケーションは機能するためにスワップを必要とします。

このガイドでは、CentOS7サーバーでスワップファイルを作成して有効にする方法について説明します。

ノート

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

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

前提条件

このガイドを開始する前に、最初に完了する必要のあるいくつかの手順があります。

sudo権限を持つroot以外のユーザーでCentOS7サーバーをインストールして構成する必要があります。 まだこれを行っていない場合は、 CentOS 7初期サーバーセットアップガイドの手順1〜4を実行して、このアカウントを作成できます。

root以外のユーザーを取得したら、それを使用してCentOSサーバーにSSHで接続し、スワップファイルのインストールを続行できます。

スワップ情報についてシステムを確認してください

始める前に、サーバーのストレージを調べて、すでに使用可能なスワップスペースがあるかどうかを確認する必要があります。 複数のスワップファイルまたはスワップパーティションを使用できますが、通常は1つで十分です。

汎用スワップユーティリティであるswaponを使用すると、システムにスワップが構成されているかどうかを確認できます。 -sフラグを使用すると、swaponはストレージデバイスでのスワップの使用状況と可用性の概要を表示します。

swapon -s

コマンドによって何も返されない場合、要約は空であり、スワップファイルは存在しません。

スワップスペースをチェックするもう1つの方法は、freeユーティリティを使用することです。これにより、システムの全体的なメモリ使用量が表示されます。 次のように入力すると、現在のメモリとスワップの使用量(メガバイト単位)を確認できます。

free -m
             total       used       free     shared    buffers     cached
Mem:          3953        315       3637          8         11        107
-/+ buffers/cache:        196       3756
Swap:            0          0       4095

ご覧のとおり、システム内の合計スワップスペースは0です。 これは、swaponで見たものと一致します。

使用可能なストレージスペースを確認してください

スワップ用のスペースを割り当てる一般的な方法は、タスク専用の別のパーティションを使用することです。 ただし、ハードウェアまたはソフトウェアの制約により、パーティションスキームの変更が常に可能であるとは限りません。 幸い、既存のパーティションに存在するスワップファイルを同じように簡単に作成できます。

これを行う前に、現在のドライブの使用状況を知っておく必要があります。 次のように入力すると、この情報を取得できます。

df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        59G  1.5G   55G   3% /
devtmpfs        2.0G     0  2.0G   0% /dev
tmpfs           2.0G     0  2.0G   0% /dev/shm
tmpfs           2.0G  8.3M  2.0G   1% /run
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup

注: -hフラグは、dhに人間にわかりやすい読み取り形式でドライブ情報を出力するように指示するだけです。 たとえば、パーティション内のメモリブロックの生の数を出力する代わりに、df -hは、スペースの使用量と可用性をM(メガバイトの場合)またはG(ギガバイトの場合)で示します。

最初の行でわかるように、ストレージパーティションには59ギガバイトが使用可能であるため、作業するためのかなりのスペースがあります。 これは新しい中規模のVPSインスタンスであるため、実際の使用法は大きく異なる可能性があることに注意してください。

スワップスペースの適切なサイズについては多くの意見がありますが、それは実際にはアプリケーションの要件と個人的な好みによって異なります。 一般に、システムのメモリ量と同じか2倍の量が出発点として適しています。

私のシステムには4ギガバイトのメモリがあり、それを2倍にすると、ストレージスペースから手放すよりも大きなチャンクが必要になるため、システムのメモリに合わせて4ギガバイトのスワップスペースを作成します。

スワップファイルを作成する

使用可能なストレージスペースがわかったので、ファイルシステム内にスワップファイルを作成することができます。 ルート(/)ディレクトリにswapfileというファイルを作成しますが、必要に応じて別の名前を付けることもできます。 ファイルは、スワップファイルに必要な容量を割り当てる必要があり、1つの連続したブロックに作成する必要があります。

これを行う最良の方法は、ddユーティリティを使用することです。 このコマンドは、4ギガバイトのファイルを作成します。

sudo dd if=/dev/zero of=/swapfile count=4096 bs=1MiB

sudo権限を承認するためのパスワードを入力すると、スワップファイルが作成されます。 これには少し時間がかかる場合があります。その後、プロンプトが返されます。 lsを使用すると、スワップ用に正しい容量のスペースが予約されていることを確認できます。

ls -lh /swapfile
-rw-r--r-- 1 root root 4.0G Oct 30 11:00 /swapfile

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

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

現在、ファイルは作成されていますが、システムはこれがスワップに使用されることになっていることを認識していません。 このファイルをスワップとしてフォーマットしてから有効にするようにシステムに指示する必要があります。

その前に、スワップファイルのアクセス許可を調整して、rootアカウント以外のユーザーが読み取れないようにする必要があります。 他のユーザーにこのファイルの読み取りまたは書き込みを許可すると、セキュリティ上の大きなリスクになります。 chmodを使用して権限をロックダウンできます。

sudo chmod 600 /swapfile

これにより、読み取りと書き込みの両方の権限がrootアカウントのみに制限されます。 ls -lhを再度使用すると、スワップファイルに正しいアクセス許可があることを確認できます。

ls -lh /swapfile
-rw------- 1 root root 4.0G Oct 30 11:00 /swapfile

スワップファイルの安全性が向上したので、次のように入力して、使用するスワップスペースを設定するようにシステムに指示できます。

sudo mkswap /swapfile
Setting up swapspace version 1, size = 4194300 KiB
no label, UUID=b99230bb-21af-47bc-8c37-de41129c39bf

これで、スワップファイルをスワップスペースとして使用する準備が整いました。 次のように入力して使用を開始できます。

sudo swapon /swapfile

手順が成功したことを確認するために、システムがスワップスペースを報告するかどうかを確認できます。

swapon -s
Filename				Type		Size	Used	Priority
/swapfile               file        4194300 0     -1

この出力は、新しいスワップファイルがあることを確認します。 freeユーティリティを再度使用して、調査結果を裏付けることができます。

free -m
             total       used       free     shared    buffers     cached
Mem:          3953        315       3637          8         11        107
-/+ buffers/cache:        196       3756
Swap:         4095          0       4095

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

スワップファイルを永続的にする

現在、スワップファイルは有効になっていますが、再起動しても、サーバーはファイルの使用を自動的に有効にしません。 これは、ファイルシステムとパーティションを管理するテーブルであるfstabファイルを変更することで変更できます。

テキストエディタでsudo権限を使用してファイルを編集します。

sudo nano /etc/fstab

ファイルの下部に、作成したスワップファイルを自動的に使用するようにオペレーティングシステムに指示する行を追加する必要があります。

/swapfile   swap    swap    sw  0   0

行の追加が終了したら、ファイルを保存して閉じることができます。 サーバーは起動のたびにこのファイルをチェックするため、スワップファイルは今後使用できるようになります。

スワップ設定を微調整します(オプション)

スワップを処理するときにシステムのパフォーマンスに影響を与えるように構成できるオプションがいくつかあります。 これらの構成はほとんどの場合オプションであり、行う変更はアプリケーションのニーズと個人的な好みによって異なります。

Swappiness

swappinessパラメータは、システムがメモリからスワップスペースにデータをスワップする頻度を決定します。 これは、スワップの使用をトリガーするメモリ使用量のパーセンテージを表す0〜100の値です。

値がゼロに近い場合、絶対に必要でない限り、システムはデータをドライブにスワップしません。 スワップファイルとのやり取りは、メモリとのやり取りよりもはるかに遅いという点で「高価」であり、この読み取りと書き込みの速度の違いにより、アプリケーションのパフォーマンスが大幅に低下する可能性があることを忘れないでください。 スワップにあまり依存しないようにシステムに指示すると、通常、システムが高速になります。

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

swappiness構成ファイルを読み取ると、現在のswappiness値を確認できます。

cat /proc/sys/vm/swappiness
30

CentOS 7のデフォルトのswappiness設定は30です。これは、ほとんどのデスクトップとローカルサーバーにとって適切な中間点です。 VPSシステムの場合、おそらく0に近づけたいと思います。

sysctlコマンドを使用して、swappinessを別の値に設定できます。 たとえば、swappinessを10に設定するには、次のように入力します。

sudo sysctl vm.swappiness=10
vm.swappiness = 10

この設定は、次の再起動まで保持されます。 再起動間も設定を維持するために、出力された行をsysctl構成ファイルに追加できます。

sudo nano /etc/sysctl.conf

ファイルの最後にswappiness設定を追加します。

vm.swappiness = 10

行の追加が終了したら、ファイルを保存して閉じることができます。 サーバーは、swappinessを各起動時に宣言した値に自動的に設定します。

キャッシュ圧力

変更する可能性のあるもう1つの関連する値は、vfs_cache_pressureです。 この設定は、特別なファイルシステムメタデータエントリの保存に影響します。 この情報を絶えず読み取って更新することは、一般に非常にコストがかかるため、システムのパフォーマンスにとって、この情報をキャッシュに長期間保存することは優れています。

procファイルシステムに再度クエリを実行すると、このキャッシュプレッシャーの現在の値を確認できます。

cat /proc/sys/vm/vfs_cache_pressure
100

現在構成されているため、システムはiノード情報をキャッシュから非常に迅速に削除します。 sysctlを使用して、これを50などのより保守的な設定に設定できます。

sudo sysctl vm.vfs_cache_pressure=50
vm.vfs_cache_pressure = 50

繰り返しますが、これは現在のセッションでのみ有効です。 swappiness設定で行ったように、構成ファイルに追加することで変更できます。

sudo nano /etc/sysctl.conf

下部に、新しい値を指定する行を追加します。

vm.vfs_cache_pressure = 50

行の追加が終了したら、ファイルを保存して閉じることができます。 サーバーは、各起動時に宣言した値にキャッシュ圧力を自動的に設定します。

結論

このガイドの手順に従うことで、メモリ使用量の観点からサーバーに余裕を持たせることができます。 スワップスペースは、いくつかの一般的な問題を回避するのに非常に役立ちます。

OOM(メモリ不足)エラーが発生した場合、またはシステムが必要なアプリケーションを使用できない場合、最善の解決策は、アプリケーション構成を最適化するか、サーバーをアップグレードすることです。 ただし、スワップスペースを構成すると、柔軟性が高まり、強力でないサーバーで時間を購入するのに役立ちます。