web-dev-qa-db-ja.com

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

Apache 2.2サーバーを調整しています(MySQL + Courier + Mongo + Postgreと共有されています)。サーバーはベアメタル(仮想化なし)で、2つのクアッドコアXeon(合計16コア)と12GBのECC RAM(今後数日で24GBにアップグレード))。 MongoとPostgreは、開発のためだけにほとんど触れられていません。

問題は、Apacheが使用可能なすべてのメモリを消費し、最終的にすべてのスワップを使用することです(したがって、より多くのメモリを使用するため、MySqlがクラッシュします)。ワーカーMPMとmod_securityを備えたApache2.2があります。再起動するたびに、約8Gの空きRAMがあります。

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

  • topに示されているプロセスとワーカーサーバーとの関係は何ですか?私は最大で10個のプロセスを見ることを期待していました(ワーカー設定のServerLimitとして-メインプロセスを考慮していません)。
  • 各THREADまたは各PROCESSに使用されるRESメモリの量はありますか?
  • 以下のmod_statusの出力には、長期間そこにとどまるREADINGリクエストがたくさんあります。 ExtendedStatusを有効にして、そこにあるクライアントを検出しようとしましたが、有用な情報が見つかりませんでした-何か提案はありますか?
  • 実際のメモリ使用量で、400の同時接続を処理するために必要なRAMの量はどれくらいですか?(modステータスは250がすでに使い果たされていることを示しているため)
  • maxClients/ServerLimitを上げる代わりにThreadsPerChildを上げるのはどうですか?
 <IfModule worker.c> 
 StartServers 2 
 MaxClients 250 
 MinSpareThreads 25 
 MaxSpareThreads 75 
 ThreadsPerChild25 
 MaxRequestsPerChild 0 
 ServerLimit 10 
 </ IfModule> 

トップショー(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 
 Mem:合計12187448k、使用済み10686748k、空き1500700k、バッファ67104k 
スワップ:合計1048568k、使用済み275904k、空き772664k、キャッシュ2371208k 
 
 PIDユーザーPRNI VIRT RES SHR S%CPU% MEM TIME + COMMAND 
 24252 wwwrun 20 0 2216m 161m 7484 S 20.2 1.4 0:09.25 httpd 
 24750 wwwrun 20 0 1264m 51m 6196 S 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 2208m 293m 7132 S 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 2172m 244m 10m 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 277m 9880 964 S 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 2 178m 144m 7132 S 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 1504m 76m ​​6372 S 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 970m 30m 5604 S 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 Domain Server PHP/5.3.24 with Suhosin-Patch mod_Perl/2.0.5 
 Perl /v5.10.1

サーバー構築:2013年5月15日10:17:30 
 ______________________________________________________________________________________________________________________________ 
 
現在の時刻:5月12日月曜日- 2014 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.8kB/second-47.0 kB/request 
現在処理中の249リクエスト、0アイドルワーカー
 
 WWRRKRKRRKRRRRWRRWWWRWCRR................。 ..................... 
 RWWWRRWRRRRKKRKRWRRRRRWWR.....................。 ................ 
 WRWRCRRWRRWWRKRRWWRR WRWWW ....................................... 
 WRWKKWWWRWKRRWRCRRRWWRWWW..。 ................................... 
 WRWRWCRKCWWWRWWRRWWCRWRWW.......。 .............................. 
 WRWKRWRRKKRKRRRRCWWKWWWRW.............。 ......................... 
 RWWKWRRWKRRRWRRWWCRRRRRRW.................。 .................... 
 WWWRRWRKWWWKRWWWWRWWWKRRW......................。 ............... 
 RRRRRRRK.WKRRWRWWKRRWRRKR......................................。 ............ 
 KCRRRRWRWWKRWWWRRKWRWRWRK...............................。 ....... 

更新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.5kB /秒-20.5kB /リクエスト
現在処理中の14リクエスト、86アイドルワーカー
 
.....。 ........... R.....................................。 ....... 
 ________________ RR__R_R__RC_RWC ___________________.............. 
 R_WC__R ___ R _______________________________________.............. 
 ................................................ ................ 
...........................。 ................................... 
........。 ................................................。 .... 
.......................................。 ....................... 
 ...................... ..........。 .............................. 
.............。 ................................................. 
............................................。 .................. 
3
Daniel Costa

KeepaliveTimeoutは、ぶら下がっている「読み取り」ワーカーを減らすのに役立ちます。

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

このデフォルトのチューニングは、ニーズに合わせてうまく機能する場合があります。

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

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

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

2
Nathan C

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

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

したがって、このmod_statusの出力を考えると:

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

preforkを実行しているサーバーのtopは約31のhttpdプロセスを表示し、workerを実行しているサーバーのtopは3つのhttpd.workerプロセスを表示する必要があります。

2
Jeremy Harnois