web-dev-qa-db-ja.com

パフォーマンスを向上させるためにApachewsgiを使用してデプロイされたチューニングDjangoベースのサイト

私はApache + mod_wsgiを使用してDjangoアプリケーションを実行しています。Amazonec2に6つの中型ubuntuサーバーをセットアップしました。ここで、mongo用に2つ、DjangoとApache用に4つ) 、postgresqlにebsを使用し、すべてのApacheサーバーの周りにロードバランサーを構成すると、各サーバーに4 GBのRAMが搭載されますが、負荷が高いとシステムが遅くなり、topコマンドを使用すると、Apacheが7つのプロセスを使用し、約2.4GBのRAMを消費していることがわかりました。 。以下は、ApacheMPMプリフォークモジュールの設定です。

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

これはwsgiデーモンプロセス用です

WSGIDaemonProcess example user=abc group=abc processes=2 threads=25

次に、この記事に従ってMaxClientsを12に変更します http://fuscata.com/kb/set-maxclients-Apache-prefork しかし、Apacheエラーで「RequestHeaderReadTimeout」エラーが発生しますログ。パフォーマンスを向上させるためのApacheのチューニングを手伝ってください。

1
user969923

使用する構成は、実際には特定のPython Webアプリケーションの詳細によって異なります。適切な監視がないと、Apacheおよびmod_wsgiの構成を最適に調整することは非常に困難です。

これまで説明してきたことで、さまざまな潜在的な問題を見ることができます。

1つ目は、mod_wsgiデーモンモードの使用を目指しているということですが、そうですか?完全な構成を提供するわけではなく、WSGIDaemonProcessディレクティブだけでは、実際にデーモンモードを使用しているわけではありません。デーモンモードを適切に設定していない場合、Webアプリケーションはmod_wsgiデーモンモードプロセスではなくApache子ワーカープロセスで実行される可能性があるため、その構成では非常に迅速に大量のメモリを消費します。

デーモンモードを適切に使用していない場合の2番目の問題は、最小/最大設定によってプロセスチャーンが発生することです。これにより、トラフィック量が短い順序で上下するため、アプリケーションを定期的にリロードすることでCPU負荷が高くなります。

3つ目は、デーモンモードを適切に使用している場合でも、メモリとCPUを節約するために、Apacheチャイルドワーカープロセスでの実行からPythonを無効にしましたか?なぜプリフォークMPMを使用しているのですか? mod_wsgiデーモンモードを使用している場合ははるかに優れたワーカーMPM。

4つ目は、WebアプリケーションのCPUバウンドタスクとI/Oバウンドタスクのバランスによっては、2つのプロセスと25のスレッドが非常に悪い場合があることです。それぞれ5つのスレッドで3つのプロセスを使用する方が良い場合もありますが、アプリケーションの機能がわからない場合は、言うのが非常に難しく、監視が本当に必要です。

とにかく、私が見ることができるすべての潜在的な問題ではないので、私は続けることができましたが、あなたが何をすべきかを判断するための実際のパフォーマンスデータなしで本当に推測しています。

私があなたに提案できるのは、以下を読んだり見たりすることだけです。

いくつかの監視をインストールすることを検討してください。それでも何をすべきかわからない場合は、mod_wsgiメーリングリストを使用して、以下で説明されているようにヘルプを入手してください。

StackOverflowサイトは、TLDRの群衆にうろついている簡単な答えには問題ないかもしれませんが、2つの文で答えることができる簡単な答えがないため、このようなトピックについて適切に議論するための役に立たないフォーラムです。

3

セットアップは簡単ですが、同様の状況が発生し、processesディレクティブでより多くのWSGIDaemonProcessを使用することでパフォーマンスの問題を解決しました。

詳細については、「 Django through mod_wsgi? "の実行中にWSGIDaemonProcessで指定する必要があるプロセスの数」を参照してください。

0
Peterino