web-dev-qa-db-ja.com

Apacheのメモリスパイク、考えられる原因は?

先週の金曜日(2011年10月7日)、httpd.workerプロセスを通常の10〜15Mのメモリから10G +(ギガバイト)に1〜2分で拡張し始めました。これにより、サーバーがスワッピングなどを開始するときに明らかに停止します。サーバーを再度実行するには、サーバーを再起動する必要があります。時間内にそれを捕まえれば、問題のあるhttpd.workerを殺すことができ、当分の間すべてが順調です。

システム

  • RHEL 5.5
  • Apache httpd-2.2.3-45.el5_6.2.x86_64.rpm(最近のバイト範囲フィルターの脆弱性を防ぐためにパッチが適用されています)
  • Apache MPMワーカーの使用(プリフォークではない)
  • mod_jk 1.2.28
  • mod_rewrite
  • OpenSSL(最新のRed Hatバージョン)
  • Tomcat/JBoss Web 2.1(JBoss 5.1.0)
  • 専用サーバー(非共有)、それぞれに12ギガのRAM

症状

  • 通常の負荷では、突然1つのhttpd.workerプロセスが予約メモリ内で10Mから数ギグに増加します。 -9プロセスを強制終了する必要があります。そうしないと、サーバーが停止します。
  • 複数のhttpd.workerプロセスがほぼ同時に発生することがあります
  • 問題のあるプロセスが強制終了されると、すべてが再び正常になります(数分)。
  • 約起こっています。先週の金曜日から8〜12時間ごと、明確なパターンはありません。
  • それにつながるリクエストトラフィックのスパイクはありません
  • Access_logとerror_logに奇数のトラフィック/エラーはありません

その他の注意事項

  • 通常の負荷は、各サーバーで1秒あたり最大5〜10リクエストであり、クレイジーではありません。
  • (これが開始された後)MaxRequestsPerChildを250に設定し、ワーカーは適切に循環されています。問題が単一または少数のリクエストセットに起因することを意味します
  • 過去2週間、アプリケーション/システム構成の変更はありません。
  • それは持続的な問題ではないので(数分で消えます)、
  • バイト範囲フィルターの脆弱性とまったく同じように聞こえますが、パッチを適用してテストしました( https://issues.Apache.org/bugzilla/show_bug.cgi?id=51714
    • サーバー障害(および他の場所)に関するいくつかの投稿を読みましたが、単一のワークプロセスがメモリで制御不能になることを説明する投稿は見つかりませんでした

質問

  • 個々のhttpd.workerプロセスのメモリがこのように制御不能になる原因は何ですか?または、通常の量(構成では10m〜15m)を超えるものもありますか?
  • これをトラブルシューティングするための提案はありますか? top、server-status、jkstatus、cactiによる監視を監視し、monitをインストールして、mod_jkロギングを実行しています。

Apache/mod_jk/Tomcat(JbossWeb)構成

Httpd.confから...

<IfModule worker.c> 
StartServers         2 
MaxClients         500 
MinSpareThreads     25 
MaxSpareThreads    150
ThreadsPerChild     50 
MaxRequestsPerChild  250 
</IfModule>

Mod_jkのworker.propertiesから..

# Define Node1 worker.node1.port=8009
worker.node1.Host=127.0.0.1 worker.node1.type=ajp13
worker.node1.lbfactor=1 worker.node1.connection_pool_timeout=60
worker.node1.connection_pool_size=35 worker.node1.connect_timeout=5000
worker.node1.prepost_timeout=5000

Tomcatのserver.xmlから...

<Connector protocol="AJP/1.3" port="8009"
address="${jboss.bind.address}" redirectPort="8443" maxThreads="350"
connectionTimeout="60000" enableLookups="false"/>

任意の入力をいただければ幸いです!

2
Rich Taylor

この問題を公式に見つけて修正しました。これは、mod_rewriteルールの単なるループでした。それは何ヶ月も続いていましたが、問題を引き起こした特定のURLに誰もヒットしていませんでした。つまり、これは、単一のhttpd.workerプロセスがメモリ消費によって制御不能になる可能性があるいくつかの例の少なくとも1つです。

2
Rich Taylor