1

Python ( Flask Restless ) で記述されたデータベースに対して API を実行しており、 Flask Documentationに従って apache2 と mod_wsgi を使用してサービスを提供しています。

アプリは、Auto-scaling グループ内の AWS EC2 インスタンスでホストされています。現在、以下を備えた m3.medium インスタンスでホストしています。

  • 1 vCPU
  • 3.75ギガバイトのRAM

私たちが抱えている定期的な問題は、メモリエラーです。Apache はインスタンスで使用可能なすべてのメモリを使い果たし、障害を引き起こします[critical memory allocation]。Apache に関するこの問題は十分に文書化されています。

docs およびその他の SO の質問では、apache プロセスの平均サイズを見つけて制限MaxRequestWorkers(別名MaxClients) することで過剰なメモリ使用を防ぐことができると説明されていますが、ほとんどのドキュメントでは利用可能なメモリよりも多くのワーカーを開始できないようになっています。最初にApacheが使用するRAMを減らす方法を示します。

次のコマンドを使用して、平均プロセス サイズを取得しています。

sudo ps -ylC apache2 | awk '{x += $8;y += 1} END {print "Apache Memory Usage (MB): "x/1024; print "Average Process Size (MB): "x/((y-1)*1024)}'

これは現在 ~130Mb ですが、これは不当に大きい数値ですか?

sudo free -m~3000Mb の空きメモリがあるため、メモリを使いすぎる前に 3000/130 = ~20 のワーカーを持つことができます。

過剰なメモリ使用を防ぐためにワーカーの数を制限することはできますが、これを行うと、1 分あたり最大 100 のリクエストがドロップされ、504 エラーが返されます。これは私のシナリオでは受け入れられません。

明らかに、サーバーの RAM の量を増やすか、各 Apache プロセスが消費するメモリの量を減らすという 2 つのオプションがあります。

Apache から不要なモジュールを既に削除しましたが、各 apache2 プロセスのメモリ フットプリントを削減するために他に何ができるかわかりません。13GB の RAM を必要とする 50 ~ 100 個のワーカーを実行したいのですが、これは過剰に思えますか?

WebApp は、約 30,000 のインターネット接続製品のシステムを管理するために使用されます。ほとんどの要求は、システムへの接続をログに記録するか、データの json 配列をユーザーに返すことです。

私の Apache2.conf ファイルは次のとおりです。

Timeout 120
KeepAlive on
MaxKeepAliveRequests 100
KeepAliveTimeout 5
ThreadsPerChild 20
MaxRequestWorkers 100
ServerLimit 100
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
HostnameLookups Off
LogLevel warn
IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf
Include ports.conf
AccessFileName .htaccess
IncludeOptional conf-enabled/*.conf
IncludeOptional sites-enabled/*.conf

アプリに 13 GB 以上の RAM を搭載したサーバーが必要だとは思わず、MaxRequestWorkers の数を減らしたくない場合、システムが約 100 件の reqs/分

4

0 に答える 0