Apache 2.2 は最終的にすべてのメモリを使用します (ワーカー mpm)

Apache 2.2 は最終的にすべてのメモリを使用します (ワーカー mpm)

Apache 2.2 サーバーをチューニング中です (MySQL + Courier + Mongo + Postgre で共有)。サーバーはベアメタル (仮想化なし) で、2 つのクアッドコア Xeon (合計 16 コア) と 12GB ECC RAM (数日中に 24GB にアップグレード予定) を搭載しています。MySql の innodb_buffer は 2G に設定されており、問題なく動作しています。Mongo と Postgre は開発用のみでほとんど変更していません。

問題は、Apache が利用可能なメモリをすべて消費し、最終的にはすべてのスワップを使用する (そのため、メモリ使用量が増えるため、MySql がクラッシュする) ことです。私たちは、worker MPM と mod_security を備えた Apache 2.2 を使用しています。再起動するたびに、約 8G の空き RAM があります。

私はいくつかのことを理解しようとしています:

  • ワーカー サーバーで表示されるプロセスとの関係は何ですか top? 最大 10 個のプロセスが表示されると予想していました (ワーカー設定の ServerLimit として、メイン プロセスは考慮されません)。
  • RES メモリの量は、各スレッドに対して使用されますか、それとも各プロセスに対して使用されますか?
  • 以下の mod_status 出力には、長時間残っている READING リクエストが多数あります。ExtendedStatus を有効にして、そこに存在するクライアントを検出しようとしましたが、役立つ情報は見つかりませんでした。何か提案はありますか?
  • 実際のメモリ使用量では、400 の同時接続を処理するにはどのくらいの RAM が必要ですか? (mod ステータスでは 250 がすでに使い果たされていることが示されています)
  • MaxClients/ServerLimit を上げる代わりに ThreadsPerChild を上げるのはどうでしょうか?
<IfModuleワーカー.c>
スタートサーバー2
最大クライアント数 250
最小スペアスレッド数 25
最大スペアスレッド数 75
スレッド数/子 25
子あたりの最大リクエスト数 0
サーバー制限 10
</モジュール>

TOP には以下が表示されます (Apache のみ):

トップ - 16:30:21 46 日間稼働、23:12、ユーザー 2 人、負荷平均: 0.94、0.97、1.31
タスク: 合計 460、実行中 1、スリープ中 459、停止中 0、ゾンビ 0
CPU: 2.8%us、0.5%sy、0.0%ni、96.7%id、0.0%wa、0.0%hi、0.0%si、0.0%st
メモリ: 合計 12187448k、使用済み 10686748k、空き 1500700k、バッファ 67104k
スワップ: 合計 1048568k、使用済み 275904k、空き 772664k、キャッシュ済み 2371208k

  PID ユーザー PR NI 仮想リソース SHR S %CPU %MEM 時間+ コマンド
24252 wwwrun 20 0 2216m 161m 7484 S 20.2 1.4 0:09.25 httpd
24750 wwwrun 20 0 1264分 51分 6196秒 9.9 0.4 0:00.93 httpd
23996 wwwrun 20 0 2136m 279m 7292 S 6.0 2.4 0:16.76 httpd
23326 wwwrun 20 0 2216m 276m 7376 S 2.7 2.3 0:16.81 httpd
23582 wwwrun 20 0 2208分 293分 7132秒 2.3 2.5 0:27.30 httpd
23688 wwwrun 20 0 1904m 208m 7304 S 1.0 1.8 0:13.62 httpd
19507 wwwrun 20 0 2182m 229m 8096 S 0.7 1.9 0:18.65 httpd
23616 wwwrun 20 0 1908m 239m 7092 S 0.7 2.0 0:18.48 httpd
18304 wwwrun 20 0 2160m 334m 11m S 0.3 2.8 0:47.38 httpd
23637 wwwrun 20 0 1830m 231m 7556 S 0.3 1.9 0:20.56 httpd
24457 wwwrun 20 0 2196m 174m 6568 S 0.3 1.5 0:04.11 httpd
15694 wwwrun 20 0 2199m 295m 7504 S 0.0 2.5 0:20.54 httpd
15783 wwwrun 20 0 2172分 244分 10分 S 0.0 2.1 0:17.45 httpd
16577 wwwrun 20 0 2128m 354m 7436 S 0.0 3.0 0:28.21 httpd
18290 wwwrun 20 0 277分 9880 964秒 0.0 0.1 0:00.05 httpd
18379 wwwrun 20 0 2208m 211m 6864 S 0.0 1.8 0:08.57 httpd
18480 wwwrun 20 0 2096m 305m 7540 S 0.0 2.6 0:17.72 httpd
18791 wwwrun 20 0 1920m 251m 7244 S 0.0 2.1 0:20.24 httpd
19348 wwwrun 20 0 2060m 310m 7388 S 0.0 2.6 0:22.07 httpd
19619 wwwrun 20 0 2206m 235m 7340 S 0.0 2.0 0:15.30 httpd
19999 wwwrun 20 0 2178分 144分 7132秒 0.0 1.2 0:05.50 httpd
20697 wwwrun 20 0 2002m 193m 7276 S 0.0 1.6 0:08.12 httpd
20838 wwwrun 20 0 1890m 127m 7260 S 0.0 1.1 0:07.44 httpd
21407 wwwrun 20 0 1988m 290m 7708 S 0.0 2.4 0:39.33 httpd
22252 wwwrun 20 0 2216m 295m 7732 S 0.0 2.5 0:27.04 httpd
22723 wwwrun 20 0 2020m 187m 7444 S 0.0 1.6 0:39.80 httpd
22753 wwwrun 20 0 1850m 206m 7448 S 0.0 1.7 0:10.62 httpd
23174 wwwrun 20 0 1990m 229m 7332 S 0.0 1.9 0:07.71 httpd
23383 wwwrun 20 0 1504分 76分 6372秒 0.0 0.6 0:01.25 httpd
23720 wwwrun 20 0 1906m 225m 7080 S 0.0 1.9 0:20.12 httpd
24778 wwwrun 20 0 970分 30分 5604秒 0.0 0.3 0:00.80 httpd

最後に、mod_status の出力は次のようになります。

   サーバーバージョン: Apache/2.2.23 (Unix) mod_ssl/2.2.23 OpenSSL/1.0.0-fips ドメインサーバー PHP/5.3.24 (Suhosin-Patch 付き) mod_perl/2.0.5
          Perl/v5.10.1

   サーバー構築日: 2013年5月15日 10:17:30
     _________________________________________________________________________________________________________________________________________________

   現在の時刻: 2014 年 5 月 12 日月曜日 16:41:08 BRT
   再起動時間: 2014 年 5 月 12 日月曜日 15:36:37 BRT
   親サーバー世代: 1
   サーバー稼働時間: 1時間4分31秒
   総アクセス数: 36446 - 総トラフィック: 1.6 GB
   CPU 使用率: u213.3 s13.65 cu0 cs0 - 5.86% CPU 負荷
   9.42 リクエスト/秒 - 442.8 kB/秒 - 47.0 kB/リクエスト
   現在処理中のリクエストは 249 件、アイドル状態のワーカーは 0 件

WWRRKRKRRKRRRRWRWRWWWWRWCRR......................................
RWWWWRRRRRRKKRKRWRRRRRWWR......................................
わーい、わーいわーい......................................
わーい、わーい......................................
WRWRWCRKCWWWRWWRRWWCRWRWW......................................
わーい、わーい......................................
RWWKWRRWKRRRWRRRWWCRRRRRRRW......................................
ああ、ああああああ......................................
RRRRRRRK.WKRRWRWWKRRWRRKR............................................
KCRRRRWRWWKRWWWWRRKWRWRWRK......................................

アップデート1:

mod_security2 を無効にしたり、ワーカー設定をいじったりしてみましたが、最終的に Apache は 20G 近くの RAM を消費することになります (サーバーのクラッシュを防ぐために 13G のスワップファイルを追加しました)。

最後に、KeepAlive を無効にし、MaxRequestsPerChild を 100 に維持しました。これで、Apache は 2 ~ 3G を使用しており、ステータス出力が以下のとおり、リクエストがクリーンアップされています。

   現在の時刻: 2014 年 5 月 13 日火曜日 17:07:48 BRT
   再起動時間: 2014 年 5 月 13 日火曜日 16:49:14 BRT
   親サーバー世代: 0
   サーバー稼働時間: 18分33秒
   総アクセス数: 6637 - 総トラフィック: 133.2 MB
   CPU 使用率: u34.43 s3.05 cu0 cs0 - 3.37% CPU 負荷
   5.96 リクエスト/秒 - 122.5 kB/秒 - 20.5 kB/リクエスト
   現在処理中のリクエストは 14 件、アイドル状態のワーカーは 86 件

..................R................................................
__RR__R_R__RC_RWC___________________..............
R_WC__R___R_______________________________________..............
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................

答え1

KeepaliveTimeoutハングしている「読み取り」ワーカーを減らすのに役立ちます。

MPM は複数のスレッドを持つ複数のプロセスを使用して着信トラフィックを処理するため、ここで表示されているのは通常の Apache 操作です。

このデフォルトのチューニングは、ニーズにより適している可能性があります。

ServerLimit 12
StartServers 2
MaxClients 500
MinSpareThreads 25
MaxSpareThreads 50
ThreadsPerChild 50

これにより、合計 10 個のプロセスが生成され ( MaxClients/ ThreadsPerChild)、サーバーのメモリ フットプリントが大幅に削減されます。CPU の可用性により、より少ないプロセスでより多くのスレッドを実行できます。

これらの変数を変更するには、Apache を完全に停止してから再起動する必要があることに注意してください。

答え2

上部に表示されるプロセスとワーカー サーバーとの関係は何ですか? 最大 10 個のプロセスが表示されると予想していました (ワーカー設定の ServerLimit として - メイン プロセスは考慮しません)。

topこれは、worker MPM を実行している Apache サーバーの のようには見えません。私は 2 台のサーバーを実行しています。1 台は worker MPM で、もう 1 台は prefork MPM です。worker の場合、 はtopApache プロセスhttpd.workerを としてリストし、プロセスの数は、mod_status で確認できるアクティブなサーバー (ドットの行とドット以外のエントリ) の数と一致します。prefork の場合、プロセスは としてリストされhttpd、その数はアイドル状態またはアクティブなワーカー (各ドット以外のエントリ) の数とほぼ一致します。

したがって、この mod_status 出力は次のようになります。

..................R.............................................
..............._RR__R_R__RC_RWC__...............................
R_WC__R___R_....................................................
................................................................
................................................................
................................................................
................................................................
................................................................
................................................................
................................................................

topprefork を実行しているサーバーではおよそ 31 個のhttpdプロセスが表示され、topworker を実行しているサーバーでは 3 個のhttpd.workerプロセスが表示されます。

関連情報