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 の場合、 はtop
Apache プロセスhttpd.worker
を としてリストし、プロセスの数は、mod_status で確認できるアクティブなサーバー (ドットの行とドット以外のエントリ) の数と一致します。prefork の場合、プロセスは としてリストされhttpd
、その数はアイドル状態またはアクティブなワーカー (各ドット以外のエントリ) の数とほぼ一致します。
したがって、この mod_status 出力は次のようになります。
..................R.............................................
..............._RR__R_R__RC_RWC__...............................
R_WC__R___R_....................................................
................................................................
................................................................
................................................................
................................................................
................................................................
................................................................
................................................................
top
prefork を実行しているサーバーではおよそ 31 個のhttpd
プロセスが表示され、top
worker を実行しているサーバーでは 3 個のhttpd.worker
プロセスが表示されます。