Walter が、Apache ウェブサーバーの
メモリ割り当てをチューニングする
方法を説明します

walter_move_ec2

Amazon Elastic Compute Cloud (Amazon EC2) Linux インスタンスで実行中の Apache ウェブサーバーが、インスタンスでのメモリ負荷により、断続的に応答しなくなります。これを解決するにはどうすればよいですか?

Apache ウェブサーバーを実行しているインスタンスでメモリ負荷が発生する最も一般的な理由には、アプリケーションのメモリリークと、スワップを発生させる非効率的な Apache 設定の 2 つがあります。

通常、「oom-killer」や「フォークプロセスに失敗」などのシステムログメッセージ、その他のメモリ不足に関するメッセージは、EC2 インスタンス用のメモリがなくなっていることを意味します。 

システムログメッセージの表示

システムログメッセージは、ターミナルセッションまたは Amazon EC2 コンソールから表示できます。

ターミナルセッションからシステムログメッセージを表示するには、EC2 インスタンスへのターミナルセッションを確立します。EC2 インスタンスのシステムログメッセージは、次のいずれかの場所で表示できます。

Linux Distro システムログの場所
Debian または Ubuntu /var/log/syslog
CentOS または RHEL /var/log/messages
systemd を使用するシステム journalctl

コンソールからシステムログを表示するには、Amazon EC2 コンソールを開き、EC2 インスタンスを選択します。[Actions (アクション)] メニューから、[Instance Settings (インスタンスの設定)]、[Get System Log (システムログの取得)] の順に選択します。

メモリリークの検出

1.    EC2 インスタンスに対するターミナルセッションを開始します。接続できない場合は、インスタンスの再起動が必要になることがあります。

2.    ターミナルセッションから、top コマンドを実行して、EC2 インスタンス上のメモリ常駐プロセスのリストを表示します。

3.    メモリ使用量の割合で降順にリストをソートします。rpm ベースのインスタンスでソートするには、Shift + O を押してから、n を押します。他の Linux ディストリビューションでは、該当するオプションを選択してメモリ使用量でプロセスをソートします。

4.    Apache プロセスに対して返される %MEM 値の列を調べ、平均値を計算します。

5.    1 つ以上の Apache プロセスの %MEM 値が他の Apache プロセスの %MEM の値に比べて異常に大きい場合は、メモリリークがあると考えられます。メモリリークの原因は、サーバーで実行中のウェブアプリケーションである可能性があります。

6.    EC2 インスタンスの httpd.conf ファイルを編集し、MaxConnectionsPerChild 設定変数のデフォルト値を 4000 から 1000 に変更します。MaxConnectionsPerChild (Apache 2.3.9 以降) は MaxRequestsPerChild と呼ばれていたことに注意してください。古い名前は引き続きサポートされています。

この変更により、メモリリークの原因を特定して対処できるまで、EC2 インスタンスへのメモリ負荷が軽減されます。

7.    ターミナルセッションから以下の service コマンドを実行して、ウェブサーバーを再起動します。

service httpd graceful

スワップの可能性を減らす

MaxRequestWorkers および ServerLimit 設定変数を設定することにより、スポーンされるプロセスの数に制限をかけることができます。MaxRequestWorkers は、Apache 2.3.13 以前は MaxClients と呼ばれていたことに注意してください。古い名前は引き続きサポートされています。

ユーザーに対応するプロセスの数を制限すると、サーバーは RAM の不足によりスワップすることがなくなります。制限値は、Apache に割り当てるメモリの合計パーセントを、Apache プロセスの通常の平均メモリ使用量で割ることで計算されます。

1.    以下のように設定変数 MaxRequestWorkers (または MaxClients) および ServerLimit の制限値を計算します。

EC2 インスタンスの RAM が 4 GB を超える場合:

Apache プロセスの平均 %MEM 値で 90% を割ります。たとえば、平均 %MEM 値が 0.8% だとすると、90% を 0.8% で割ります。

0.9 / 0.008 = 112.5

結果を最も近い整数に切り下げます。その場合、制限値は 112 になります。

EC2 インスタンスの RAM が 4 GB 以下である場合:

Apache プロセスの平均 %MEM 値で 80% を割ります。たとえば、平均 %MEM 値が 0.8% である場合、80% を 0.8% で割ると、結果は 100 となります。

注意: これらの値は、インスタンスが専用のウェブサーバーであると想定して計算されています。サーバーで他のアプリケーションをホストしている場合は、この計算を行う前に、90% または 80% のいずれかから、これらのアプリケーションで使用されている合計メモリ使用量の割合を引きます。RAM が 4 GB 以下のインスタンスで、Apache に加えて他のアプリケーションを実行している場合は、パフォーマンスが低下することがあります。

2.    EC2 インスタンスの httpd.conf ファイルを編集し、MaxClients (または MaxRequestWorkers) と ServerLimit 設定変数を更新して、変更を保存します。例:

MaxClients  112 
ServerLimit 112

3.    ターミナルセッションから以下の service コマンドを実行して、ウェブサーバーを再起動します。

service httpd graceful

このページは役に立ちましたか? はい | いいえ

AWS サポート ナレッジ センターに戻る

サポートが必要ですか? AWS サポートセンターをご覧ください。

公開日: 2016 年 01 月 07 日

更新日: 2019 年 01 月 04 日