web-dev-qa-db-ja.com

同時実行性を最大化するためにApacheの「ワーカー」を構成する方法

これが良い質問であり、同様の状況にいる誰にとっても役立つことを願っています。私は最近、会社の非常に上級のLinux管理者から引き継いだので、初めてコンテンツを顧客に提供するために新しいサーバーをセットアップする必要がありました。私の前任者は、出発時に他のものがより優先されていたため、この問題に関する限られた文書を残しました。私は持っていたドキュメントに加えて、以前のサーバーからの構成とすべてをセットアップするための多くのオンライン資料を広範囲にわたって参照しました。

私が構築しているサーバーの「スタック」は、CentOS 7、Apache 2.4.6、MariaDB 5.X、JSP /サーブレットを提供するTomcat 7です。本番用の以前のインストールでは、CentOS 5、古いバージョンのApacheとMySQL、およびTomcat 5.Xを使用していました。

Apacheはフロントエンドであり、AJPを使用してTomcatバックエンドに接続します。ほとんどのトラフィックはHTTPSです。

サーバーは、Gen 9 HPサーバーだと思います。RAID1アレイに32GB RAMとSSDが搭載されています。正常に動作した後、ユーザーにサービスを提供する能力を最大化することに関心があります。同時に、私は数百人のユーザーが急増することは珍しいことではないことを期待しています。そのために、私はスタックのどの時点でもボトルネックを防止するように努めました。 Apacheに移りますが、自分が何をすべきかを理解するのはより困難です。

「ワーカー」には3つの異なるタイプがあり、これらを最適化する3つの主要な問題があります。
1。 3つのオプション、prefork、mpm_worker、mpm_eventがあります。私はそれらをどのように使用するかについての一般的な理解を持っていますが、それらを構成する方法を本当に理解していません。
2。以前のサーバーのApacheとは異なり、StartServers、ServerLimit、MaxRequestsPerChildなどのオプションは/etc/httpd/conf/httpd.confにリストされていません。手動で上書きする必要があるデフォルト設定はありますか? 「前回手動で追加された」以外に、設定が古いhttpd.confにあり、新しい設定ではないという理由はありますか?

私はこれを参照しています。古いhttpd.confでは、新しい構成ファイルのどこにも同じようなものは見られません。仕様のみです。

// MPMをpreforkします
// StartServers:開始するサーバープロセスの数
// MinSpareServers:予備にしておくサーバープロセスの最小数
// MaxSpareServers:予備として保持されるサーバープロセスの最大数
// ServerLimit:サーバーの存続期間中のMaxClientsの最大値
// MaxClients:起動を許可されたサーバープロセスの最大数
// MaxRequestsPerChild:サーバープロセスが処理するリクエストの最大数

StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000

//ワーカーMPM
// StartServers:開始するサーバープロセスの初期数
// MaxClients:同時クライアント接続の最大数
// MinSpareThreads:予備として保持されるワーカースレッドの最小数
// MaxSpareThreads:予備として保持されるワーカースレッドの最大数
// ThreadsPerChild:各サーバープロセスのワーカースレッドの定数数
// MaxRequestsPerChild:サーバープロセスが処理するリクエストの最大数

StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0

ハッシュ記号はテキストを見出しとして表示するため、ハッシュ記号を//に置き換えてhttpd.confのコメントを示していることに注意してください。

新しいサーバーでの問題を逆にすると、古いワーカーでどのワーカーが使用されているのかわかりません。preforkとmpm_workerの両方の設定がありますが、実際に使用すべき仕様を見つけることはできません。

  1. 少し調整した後、必要に応じてmpm_workerでサーバーを起動できます(最初にphp.confファイルを無効にする必要があります)が、すべてを制御するモジュールがスレッドセーフかどうかはわかりません(仮想ホストのモジュール、openssl、mod_proxy_ajp)。 mod_proxy_ajpは、私が使用している唯一の意味で異常なものです。

サーバーはまだ稼働していないので、現在の多数のクライアントの平均メモリ使用量を取得して、最大クライアントの「完全な」数を判断するためのオプションはありません。さらに、完璧な数、ちょうど適切な数。

だれでもhttp 500タイプのエラーを目にすることなく、およそ400人程度が特定の時間にサーバーを使用できることを確認したい場合、Apacheにどの設定を使用すればよいですか?

よろしくお願いします。これが余計なことではないことを願います。

6
Sean W.

ここには多くの可能な質問があるようですが、「応答」については少し構造化されていません。いくつか回答させていただけませんか。

  • 使用されているマルチプロセッシングモジュール(MPM)を特定します。

    「最も簡単な」方法は、現在実行中のモジュールをダンプし、mpmモジュールを選択して、何が実行されているかを確認することです。 2つの方法は次のとおりです。

    # apachectl -M | grep mpm
    mpm_worker_module (shared)
    # httpd -V | grep MPM
    Server MPM:     worker
    
  • 使用中のMPMを変更する

    CentOS7では、これは/etc/httpd/conf.modules.d/00-mpm.confという名前の設定ファイルで制御されるようになりました。これは短いファイルであり、いつでも1つのLoadModuleのみコメントを解除する必要があります。

    LoadModule mpm_worker_module modules/mod_mpm_worker.so

    目的のMPMをアクティブにするには、変更後にサービスの再起動が必要です。

  • 必要な構成値を設定します

    モジュールの構成ディレクティブの多くには、指定されていない場合のデフォルトがあります。 StartServers using workerを使用すると、デフォルトで3になり、prefork = 5を使用する場合、詳細はこちらをご覧ください: https://httpd.Apache.org/docs/current /mod/mpm_common.html#startservers 。既存のファイルを編集するのではなく、上書きを含む新しいファイルを作成することをお勧めします。

    /etc/httpd/conf.modules.d/10-worker.confのようなもの:

    <IfModule mpm_worker_module>
        ServerLimit             250
        StartServers             10
        MinSpareThreads          75
        MaxSpareThreads         250
        ThreadLimit              64
        ThreadsPerChild          32
        MaxClients             8000
        MaxRequestsPerChild   10000
    </IfModule>
    

何でもそうですが、正確な数値の調整は、ワークロードとアプリケーションでテストすることになります。absiegeなどのツールが役立ちます。

10
Mike Fiedler