web-dev-qa-db-ja.com

高トラフィック用にプリフォークmpmを最適化する方法は?

Apacheプロセスに5GBのメモリを割り当てました。

各Apacheプロセスが平均42.5MBを消費するという事実に基づいて、サーバーに次のように設定しました(各プロセスが50MBのメモリを消費するかのように計算します)。

<IfModule mpm_prefork_module>
    StartServers          5
    MinSpareServers       5
    MaxSpareServers      10
    MaxClients          100
    MaxRequestsPerChild   0
</IfModule>

今質問のために:

  1. 設定するStartServersの量をどのように決定できますか?
  2. Worker mpm(PHPなど)を設定することはできませんが、負荷分散はトラフィックが多い場合の最善のオプションですか?
  3. Apacheプロセスメモリを減らすにはどうすればよいですか?私のウェブサイトはCDNを使用してユーザーにアセットを提供していますが、サーバーは最終的にHTMLのみを提供しています。

私はここで答えを読み、その質問をグーグルでたくさん検索しましたが、十分に具体的なものを見つけることができませんでした。

1
Shahar Galukman

注意:ほとんどのApacheプロセスは、そのメモリのほとんどをその親/兄弟と共有します。 Apacheプロセスから割り当てられたメモリの値を簡単に合計することはできません。できる最善のこと:多くのApacheプロセスを開始し、これによって割り当てられたメモリがどのように変更されるかを確認します。

1:StartServersの重要性は限られています。これは、最初に開始される子プロセスの数を意味します。 Min/MaxSpareServersははるかに重要です。

2:理解できません。負荷分散ソリューションについて何も言わなかったのです。大量のトラフィックを処理できるようにしたい場合は、静的ファイルの提供にワーカーApache(または他のタイプのhttpサーバー)を使用し、動的にプリフォークベース(mpm-itkをお勧めします)を使用するのが最善の選択肢でした。言語(おそらくphp用)。ワーカーは、動的要求をプリフォークベースのサーバーに転送する必要があります。この構造は、負荷分散されたクラスターソリューションに簡単に拡張することもできます。

3:MayRequestPerChild == 0は、プロセスが再起動されないことを意味します。したがって、それらに問題がある場合、それは修正されていないか、またはそれらがリークしている場合、これも解決されません。システムが安定していて、サーバー側でのみ完全なガベージコレクション言語を使用している場合は問題ありません(php そうではありませんそのうちの1つです!)、しかし、実際的な理由から、大きな整数値を使用する方が良いと思います(ほとんどの場合、100または500を使用します)。注意:単純な子プロセスの再起動は、100〜500の要求の処理と比較して実際にはコストがかかりません。