2

間もなく本番環境で 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 を微調整して、最初のリクエストをより速く処理できる範囲に収まるようにするための提案はありますか? サーバーを追加して水平方向にスケーリングすることは気にしませんが、リクエスト時間は私にとってすべてを意味します。

4

2 に答える 2