apache prefork から worker に移行し、mod_wsgi をデーモン モードで実行し始めました。ここまでは順調ですね。私はまだ最大負荷を経験していませんが、サーバーはより一貫しているように見え、mod_wsgi 応答を待つランダム リクエストが 2 分かかることはありません。メモリ フットプリントは 3.5G から 1G になりました。これは素晴らしいです。6G の RAM を搭載した単一の VPS で実行しています。このサーバーでは、1G の RAM を割り当てた memcache のインスタンスとともに、1 つの Django アプリが実行されています。別の MySql サーバーがあります。
私たちのアプリケーションはかさばり、確実に最適化できます。現在、NewRelic を使用して、実行速度の遅いページのトラブルシューティングを行っています。私は mod_wsgi/apache の最適化について多くのことを読みましたが、他の皆さんと同じように、まだいくつか質問が残っています。
私たちのアプリケーション ページの平均読み込み時間は 650 ~ 750 ミリ秒です。私たちのページの多くは 200 ミリ秒の範囲にありますが、読み込みに 2 ~ 5 秒以上かかる犬もいます。通常のロード時間中は 1 秒あたり約 15 ~ 20 リクエスト、ピーク時は 30 ~ 40 リクエスト / 秒で、30 ~ 60 分かかる場合があります。
これが私のApache構成で、worker mpmを実行しています。
StartServers 10
MaxClients 400
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
デフォルト (StatServers=2 および MaxClients=150) から始めましたが、負荷が最小の場合、サイトの速度が大幅に低下しました。リクエストが入ってからサーバーを起動するのに長い時間がかかったと思います。メディアの 90% を s3 から提供しています。残りの 10% は、https ページの Apache を介して提供されるか、誰かがローカル サーバーを遅延してポイントします。公称負荷では、15 個のワーカー プロセスが作成されるので、おそらく StartServers=15 に設定する必要があると思います。この構成では、15 個のワーカー プロセスが実行されており (これは NewRelic で確認できます)、それぞれ 25 個のスレッドがあります (確認方法がわからないので、400/15 と推測します)。
私の apache/mod_wsgi ディレクティブは次のようになります。
<VirtualHost *:80>
# Some stuff
WSGIDaemonProcess app1 user=http group=http processes=10 threads=20
WSGIProcessGroup app1
WSGIApplicationGroup app1
WSGIScriptAlias / /path/to/django.wsgi
WSGIImportScript /path/to/django.wsgi process-group=app1 application-group=app1
# Some more stuff
</VirtualHost>
<VirtualHost *:443>
# Some stuff
WSGIDaemonProcess app1-ssl user=http group=http processes=2 threads=20
WSGIProcessGroup app1-ssl
WSGIApplicationGroup app1-ssl
WSGIScriptAlias / /path/to/django.wsgi
WSGIImportScript /path/to/django.wsgi process-group=app1-ssl application-group=app1-ssl
# Some more stuff
</VirtualHost>
私のサイトの ssl 側に別の WSGIDaemonProcess/WSGIProcessGroup を持つことは、まったく正しくありません。私はここで何かを台無しにしたと100%確信しています。ただし、より重要な点として、mod_wsgi が Apache からの要求を処理するために 200+40 のスレッドを割り当て、160 のスレッドを (ssl または s3 を指していない怠惰によって) 配信する必要があるメディアを処理するために残しました。
上記のアプリケーションの負荷を考慮して、サイトのパフォーマンスを改善する方法を提案できる人はいますか? ssl/mod_wsgi ディレクティブを適切に処理していますか? グラハムはどこ?;)