appacheにおける同時制御パラメータpreforkの理解と調整


httpd_home/bin/このhttpd serverコンパイルに含まれるモジュールを確認します.
#httpd –l
結果は以下の通りです
Compiled in modules:
  core.c
  prefork.c
  http_core.c
  mod_so.c 
一つのapacheはlinuxの合併があまり高くないです.3 Kぐらいの形です.(実は処理のhttpの要求は300/sしかないかもしれません.)普通のサーバーでは、ある程度の問題が発生します.apacheは合併の制御に関して、主にpreforkとworkの二つの中の一つで制御します.httd-lを使って、現在使用されているMPMがprefork.cdであることを確定できます.それともWorkカー.c.はapacheのpreforkに関する構成です.以下は私が最適化したパラメータです.
<IfModule prefork.c>
このパラメータがあれば、apache 1のようにソースを修正する必要はありません.256顧客数の制限を変更します.聴講は一番前に置いてから有効になります.2000はこのパラメータの最大値です.
ServerLimit 2000
铅サーバ起動時に確立されるサブルーチンの数を指定します.preforkはデフォルトで5です.
StartServers 25
xi指定アイドルプロセスの最小数は、デフォルトでは5です.現在のアイドルプロセス数がMinSpareServersより少ない場合、Apacheは最大毎秒1つの速度で新しいサブプロセスを生成します.このパラメータはあまり大きくしないでください.
MinSpare Servers 25
ボスプロセスの最大数は、デフォルトでは10です.現在、MaxSpareServersを超える空きプロセスがあると、親プロセスは余分な子プロセスを殺すことになります.このパラメータはあまり大きくしないでください.このコマンドの値をMinSpare Serversよりも小さい場合、Appacheは自動的に「MinSpareServers+1」に変更します.
MaxSpare Servers 50
󑧙は、同一時間におけるクライアント最大アクセス要求の数(単一プロセス同時スレッド数)を規定し、デフォルトは256である.MaxClienntsの制限を超える任意の要求は待ち行列に入り、リンクが解放されると、キューの中の要求はサービスを受ける.この値を大きくするには、ServerLimitを同時に増加させる必要があります.
MaxCients 2000
󑧙各サブプロセスは、その生存期間内にサーボの最大要求数を許可し、デフォルトでは10000としています.MaxRequests PerChildに到達すると、サブプロセスは終了します.MaxRequests PerChildが「0」であれば、サブプロセスは永遠に終了しません.
MaxRequests PerChild 10000
<IfModule prefork.c>
ServerLimit 2000
StartServers 25
MinSpareServers 25
MaxSpareServers 50
MaxClients 2000
MaxRequestsPerChild 10000
</IfModule>
MaxRequests PerChildを非ゼロに設定することは、2つの利点があります.
1.メモリの漏洩を無限に防ぐことができ、メモリを使い果たします.
2.プロセスに有限寿命を与え、サーバーの負荷が軽減されると活動プロセスの数を減らすのに役立ちます.
作業方法:
個別のコントロールプロセス(親プロセス)は、要求を監督し、応答するために、サブプロセスを生成する責任があります.Apacheはいつもいくつかの予備の(spare)または暇なサブルーチンを維持して、まもなく到来する要求を迎えることを試みる.このようにクライアントは、サービスを受ける前にサブルーチンの発生を待つ必要がない.Unixシステムでは、親プロセスは一般的にrootとして実行され、80ポートを邦定するが、Apacheによって生成されたサブプロセスは通常、低特権のユーザで実行される.UserとGroupコマンドは、サブプロセスの低特権ユーザを設定するために使用されます.サブプロセスを実行するユーザは、サービス内容に対して読み取り権限を持たなければならないが、サービス内容以外の他のリソースには可能な限り少ない権限を持たなければならない.
上のいくつかの値に対して、必ず覚えなければならないのは大きければ大きいほどいいのではないです.これは何回かの試みとミスをしてから使うべき値を選ぶことができます.最も重要な値は、maxclientが十分に多くの作業プロセスを許可すると同時に、サーバの過剰な交換(フリーズ)を招くことはない.着信した要求が処理能力を超えてサーバをダウンさせると、少なくともその値を満たす要求がサービスを受け、他の要求がブロックされるとより良いです.
私たちは頻繁にhttpdプロセス数を調べます.
#ps -ef | grep httpd | wc -l
その結果、現在のApacheで処理できるいくつかの同時要求があります.この値はApacheが負荷状況に応じて自動的に調整されます.
Appacheの併発要求数とTCP接続状態を確認する:

#netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
上のこの文は自分の新浪の友達の張宴に来ます.
戻り結果の例:
LAST_ACK 5
SYN_RECV 30
ESTABLISHED 1597
FIN_WAIT1 51
FIN_WAIT2 504
TIME_WAIT 1057
そのうちのSYN_RECVは、処理を待っている要求数を表している.ESTABLISHEDは通常のデータ伝送状態を表します.TIME_WAITは処理が完了し、タイムアウトが完了するまでの要求数を示します.
状態:説明
CLOED:接続なしは活動または進行中です.
LISTEN:サーバーがコールを待っています.
SYN_RECV:接続要求が到着しました.確認待ちです.
SYN_SENT:アプリケーションが開始されました.接続を開きます.
ESTABLISHED:通常データ転送状態
FIN_WAIT 1:応用はもう完成したと言います.
FIN_WAIT 2:もう一方は釈放を承諾しました.
ITMED_WAIT:全グループが死ぬのを待つ
CLOSPING:両方を同時にクローズしようとします.
TIME_WAIT:もう一方はリリースを初期化しました.
ラスト.すべてのパケットが死ぬのを待つ
Linuxの下のwebbencchを使ってストレステストができます.
本論文のリンク:http://www.php-oa.com/2008/02/22/prefork.html