間もなく本番環境で Django/Tastypie を実行していますが、組み込みの開発サーバーを使用する場合と比べて、Apache を使用する場合にかなりのオーバーヘッドがあることに気付きました。Apache は非常に遅いです。
ab を使用した非科学的な帯域幅テストは次のとおりです。
アパッチ:
$ ab -n 100 -c 50 https://www.mydomain.com/api/v1/clock/?format=json
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking www.mydomain.com (be patient).....done
Server Software: Apache/2.2.22
Server Hostname: www.mydomain.com
Server Port: 443
SSL/TLS Protocol: TLSv1/SSLv3,AES256-SHA,2048,256
Document Path: /api/v1/clock/?format=json
Document Length: 295 bytes
Concurrency Level: 50
Time taken for tests: 1.313 seconds
Complete requests: 100
Failed requests: 0
Write errors: 0
Non-2xx responses: 100
Total transferred: 49800 bytes
HTML transferred: 29500 bytes
Requests per second: 76.15 [#/sec] (mean)
Time per request: 656.634 [ms] (mean)
Time per request: 13.133 [ms] (mean, across all concurrent requests)
Transfer rate: 37.03 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 15 283 162.5 282 590
Processing: 55 324 148.4 306 622
Waiting: 55 319 150.2 305 621
Total: 110 607 138.8 619 712
Percentage of the requests served within a certain time (ms)
50% 619
66% 691
75% 692
80% 701
90% 709
95% 709
98% 711
99% 712
100% 712 (longest request)
開発サーバー (manage.py runserver):
$ ab -n 100 -c 50 http://127.0.0.1:8000/api/v1/clock/?format=json
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient).....done
Server Software: WSGIServer/0.1
Server Hostname: 127.0.0.1
Server Port: 8000
Document Path: /api/v1/clock/?format=json
Document Length: 381 bytes
Concurrency Level: 50
Time taken for tests: 0.701 seconds
Complete requests: 100
Failed requests: 0
Write errors: 0
Total transferred: 54500 bytes
HTML transferred: 38100 bytes
Requests per second: 142.59 [#/sec] (mean)
Time per request: 350.656 [ms] (mean)
Time per request: 7.013 [ms] (mean, across all concurrent requests)
Transfer rate: 75.89 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 1.9 0 7
Processing: 43 73 47.0 63 365
Waiting: 31 70 47.0 61 365
Total: 50 74 47.0 64 365
Percentage of the requests served within a certain time (ms)
50% 64
66% 67
75% 69
80% 71
90% 77
95% 101
98% 276
99% 365
100% 365 (longest request)
ご覧のとおり、負荷が小さい場合、開発サーバーは約 10 倍高速です。負荷が高くても、2 倍のリクエストを処理しています。
この問題を解決するために、Apache に基本的な変更を加えました。私が要求している「クロック」は、1 つの直接的なデータベース コールを使用する非常に基本的なスクリプトであるため、ジョインやその他の処理にファンキーなものはありません。Tastypie を使用しているため、出力はテキスト/json のままです。開発サーバーを使用したリクエストは大幅に高速であるため、何かが正しくないようです。
これが私のApache設定です。デーモン モードでワーカー MPM にセットアップされます。
KeepAlive Off
<IfModule mpm_worker_module>
StartServers 25
MinSpareThreads 25
MaxSpareThreads 300
ThreadLimit 64
ThreadsPerChild 25
MaxClients 300
MaxRequestsPerChild 0
</IfModule>
WSGIRestrictEmbedded On
仮想ホストの追加:
WSGIDaemonProcess www.mydomain.com processes=4 threads=1
WSGIProcessGroup www.mydomain.com
WSGIScriptAlias / /var/www/domain/wsgi.py process-group=www.mydomain.com application-group=%{GLOBAL}
WSGIPassAuthorization On
Python/Tastypie の設定:
Debug = False
USE_I18N = False
USE_X_FORWARDED_HOST = True
負荷分散された AWS ミディアム インスタンスで実行されており、このサーバーは images/css/js などの静的ファイルを提供していません。IOPS/x-large インスタンスでこれを上げてみましたが、変化はありませんでした。データベースは Amazon RDS 上にあります。しかし、開発サーバーを実行しているときはすべて同じであり、ホスティング環境が問題ではないことがわかります.
どんな助けでも大歓迎です!! 現時点では、高負荷についてはあまり心配していません。これは JSON ベースの API であるため、すべてのリクエストはテキストであり、非常に小さいものです。高レベルの小さなリクエストからの応答時間が最も心配です。
ありがとう!マーク
編集:
DNSをlocalhostにマッピングして、Apacheで新しいabテストを行いました。これは基本的に、127.0.0.1 にマッピングすることと同じです。これにより、はるかに優れた結果が得られます。
$ ab -n 100 -c 50 http://www.mydomain.com/api/v1/clock/?format=json
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking www.mydomain.com (be patient).....done
Server Software: Apache/2.2.22
Server Hostname: www.mydomain.com
Server Port: 80
Document Path: /api/v1/clock/?format=json
Document Length: 381 bytes
Concurrency Level: 50
Time taken for tests: 0.666 seconds
Complete requests: 100
Failed requests: 0
Write errors: 0
Total transferred: 55900 bytes
HTML transferred: 38100 bytes
Requests per second: 150.22 [#/sec] (mean)
Time per request: 332.841 [ms] (mean)
Time per request: 6.657 [ms] (mean, across all concurrent requests)
Transfer rate: 82.01 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 3 3.0 2 6
Processing: 38 258 92.6 308 357
Waiting: 33 254 92.9 303 354
Total: 44 261 90.6 310 363
Percentage of the requests served within a certain time (ms)
50% 310
66% 321
75% 323
80% 327
90% 336
95% 344
98% 362
99% 363
100% 363 (longest request)
そのため、最初のテストは外部ロード バランサーを介して行われました。これらの数値は問題ありませんが、テストの最初の 50% では、平均 310 ミリ秒の応答時間です。これらは、リアルタイムの外部テストに匹敵するようです。ただし、django dev サーバーの最初の 50% のテストでは、Apache サーバーの方がはるかに優れたスケーリングを行っているにもかかわらず、平均 64 ミリ秒かかります。Apache を微調整して、最初のリクエストをより速く処理できる範囲に収まるようにするための提案はありますか? サーバーを追加して水平方向にスケーリングすることは気にしませんが、リクエスト時間は私にとってすべてを意味します。