ServerLimit、MaxClients、MaxRequestsPerChildディレクティブの最適値


29

トラフィックが多いサイトでは、ユーザーが生成した動的コンテンツを大量に実行しています。

サーバーは専用サーバーで、合計4つのIntel(R)Xeon(R)CPU X3210 @ 2.13GHzプロセッサーを搭載しています。サーバーに4GBのRAMがあり、MySQLデータベースが別のサーバーで実行されることを考慮して、ServerLimitおよびMaxClients apacheのディレクティブの最適値を知る必要があります。パネルは、CentOSを使用したDirectAdminです。

以下は私の現在のディレクティブですが、5,000人以上のユーザーがいるピーク時に重要なラグに気づきます-ページが高速に生成されるように見えるため(ページ生成時間カウンターを実装しているため)、これは完全にMySQLの障害ではありませんが、ページが応答を開始し、ブラウザに送信されるまでの接続遅延。

<IfModule prefork.c>
    StartServers     800
    MinSpareServers   20
    MaxSpareServers   60
    ServerLimit      900
    MaxClients       900
    MaxRequestsPerChild  2000
</IfModule>
Timeout 90
KeepAlive On
KeepAliveTimeout 5

topコマンドを使用してサーバーを監視すると、CPU使用率がピーク時に20%〜30%を超えることはありません。また、MySQLサーバーの使用率は30〜50%であり、遅いクエリの修正に常に取り組んでいますが、それは別の問題です。静的なページもピーク時にロードするのに時間がかかるため、DBのボトルネックではないことを知っています。

これらの値を最適化するためのヒントは大歓迎です。

回答:


24

MaxClientsが高すぎます。Apacheプロセスの現在のサイズはどのくらいですか?それに900を掛けます。4GBを超えていますか?その場合、マシンはおそらくスワップ状態になっています。通常、ボックス内のMaxClients = 2x vCPU(grep -c processor / proc / cpuinfo)で開始します。この場合、約8になります。その後、MaxClients x apacheプロセスのサイズが4GBを超えないようにしてください。

クライアントの接続タイプに応じて、そこからMaxClientsを起動できます。(ダイヤルアップユーザーはスプーンを使用する必要があります。など)ただし、スワッピングの状況に陥らないようにしてください。

次に、最小、最大、および開始サーバーをMaxClientsに設定します。専用サーバー環境でそれらを異ならせる必要はありません。

次に、abでテストを行います(ガチョウのメモとして)。


なんらかの理由で、プロセスサイズを誤って決定したように見えます...現在、RESIDENT SIZE apacheプロセスの範囲は10〜15MBであることが一番上のコマンドに表示されています。共有ライブラリがこの数に含まれているため、「実際の」サイズはその半分であるとどこかで読みました。これを考慮して、各7 MBサイズの570プロセスに対応できると計算する必要がありますが、これは正しいと思いますか?
andreszs

計算に15 MBを使用してから、メトリックのチェックを開始することをお勧めします:#httpプロセスとメモリ使用量。これにより、MaxClientsの数についてより良いアイデアが得られます
hdanniel 09

1
私はそれを400に下げましたが、ピーク時間の前でさえ、結果は期待とは逆の効果がありました。元の値より低い値はタイムアウトと長い遅延を生じます。実際、今では1500クライアントに増やしており、メモリ使用量は3 GBで、平均CPU使用量は8%です。もちろん、SQLサーバーの負荷が増えているので、その中で作業する必要があります。
andreszs

これが私のhtopコマンド、1500のApacheプロセスと100近くのシステムプロセスです。RAM使用量の75%でこれ。a.imagehost.org/0011/htop.png数式 を再検討する必要がありますか?;)
andreszs 09

1
これが、独自の環境でテストを行う必要がある理由です。Apacheの前にhttpアクセラレータがありますので、モバイルユーザーをスプーンで食べさせません。アプリケーションも非常に軽いようです。負荷をDBに移動した場合、これらのApacheプロセスの多くが、mysql接続を待機して待機するのではなく、実際にデータを提供していることがわかります。次に、DBに許可されている接続の数を尋ねるのはどれですか その数はMaxClientsを超えていますか?5,000の同時接続がありますか?もしそうなら、あなたは前のperlbalのようなものを調べたいかもしれません。
toppledwagon

5

Apacheプロセスの平均サイズを取得する必要があります。この数とRAMの合計サイズを使用して、MaxClientsディレクティブを計算できます。これを覚えておいてください:「ウェブサーバーは決してスワップする必要はありません」(Apacheパフォーマンスチューニング

topまたはhtopを使用した監視は問題ありませんが、gangliaやmuninなどの監視ツールを使用して、サーバーのすべての統計(CPU、RAM、ディスクI / O、Apacheリクエスト、MySQLスロークエリなど)をより適切に表示する必要があります考えられるボトルネックを見つけます。


今のところ、topコマンドとhtopコマンドしかありませんが、とにかくすべての情報を理解することはできません。これは昨日のピーク時間のアクティビティです。スワッピングはありません。私が間違っているかどうか教えてください:タスク:合計1043、2実行中、1041スリープ、0停止、0ゾンビCPU:13.8%us、1.8%sy、0.0%ni、82.1%id、0.8%wa、 0.0%hi、1.5%si、0.0%stメモリ:合計4138360k、使用3961276k、空き177084k、バッファ75016kスワップ:合計2031608k、使用1484k、空き2030124k、キャッシュ
1836600k

はい、サーバーはスワップしていません。私は実際のメトリックスを好みますが、必要に応じて、abまたはhttperfなどのストレスツールを使用して、サーバーが処理できる量を確認できます。テストでは、MaxClientsの面倒を見て、(15MBの仮定に基づいて)低い数値から始めます。
hdanniel 09

4

Apacheのベンチマーク(ab)ツールで遊んでみることをお勧めします。トラフィックフローに合わせて値をいじって、平均ロード時間などに関する応答のタイプを確認できます。その時点で、話している設定をいじって、それらを最適化することができます。abを使用して、各パフォーマンス調整の最適なパフォーマンスを把握できるはずです。

あなたの設定について話すのは本当に賢明ではありませんが、これらの設定でRAMを大量に消費しているように聞こえるので、RAMも考慮する必要があります。それはデータなしの単なる推測に過ぎませんが。htopを使用すると、リソースを視覚的に確認できます。

また、あなたの負荷平均はたくさん言うことができます。20-30%CPUのコアの合計量よりも使用量がはるかに多いとは思いませんが、サーバーが実際に動作していることを示すもう1つの指標です。


問題は、サーバー管理の経験が足りないため、settignsをいじって結果を監視することです。abツールを正直に使用したことはありません。また、値を変更するにはHTTDPを再起動する必要がありますが、これによりユーザーに不便が生じるため、これを回避することを好みます。別のユーザーにメッセージを送信していて、「送信」をクリックした後、サーバー接続の問題が発生したとします。CPU使用率については、以前のコメントからの情報を参照してください。ピーク時の15%を超えません。昨日6000人のオンラインユーザーがいたことを考えると、これはかなり許容できると思います。
andreszs

実稼働環境でこれを行うことは絶対に望まないでしょう。別のサーバー(同じハードウェアではないにしても非常に似ている)でテストする場合は、トラフィックの最も少ない時間にこれを行うことをお勧めします。abは非常に使いやすいですが、toppledwagonがMaxClientsの計算について良い指示を与えたと私は確信しています。スワップスペースの使用を停止すると、明確な改善が見られます。チェックhttpd.apache.org/docs/2.0/programs/ab.htmlcyberciti.biz/tips/...を ABのために
ガチョウ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.