2017-10-09 5 views
0
from sanic import Sanic 
from sanic import response 


app = Sanic(__name__) 

@app.route('/v1/ok', methods=['GET']) 
async def post_handler(request): 
    return response.text("hey all good") 

if __name__ == '__main__': 
     app.run(host="0.0.0.0", port=8001, debug=True) 

を使用してREST APIを開発することは、私の結論です:は、私がここで<a href="https://github.com/channelcat/sanic" rel="nofollow noreferrer">sanic</a></p> <p>を使用してPythonでREST APIを記述しようとしていますパイソン(Sanic)

私が実行している50個のスレッドでwrkを使用して、このGET APIをベンチマーク試してみました30秒テスト。 4ギガバイトのRAMと2 CPU コマンドを持ってい マシン使用AWS EC2のt2.mediumが

wrk -t50 -c4000 -d30s http://XXX.XX.XXX.XXX:8001/v1/ok

ベンチマーク結果

Running 30s test @ http://XXX.XX.XXX.XXX:8001/v1/ok 
50 threads and 4000 connections 
    Thread Stats Avg  Stdev  Max +/- Stdev 
    Latency 559.30ms 117.86ms 1.99s 94.47% 
    Req/Sec 41.92  44.33 361.00  86.14% 
    53260 requests in 30.10s, 6.70MB read 
    Socket errors: connect 1493, read 15631, write 0, timeout 4 
Requests/sec: 1769.21 
Transfer/sec: 228.06KB 

を使用私の疑問は、どのように私は

に向上させることができ、ということです
  1. タイムアウトした要求の数。現在は4です。ゼロでなければなりません。私はkerasモデルをロードし、予測を行うためにしようとしていますここで(あまり)〜550ms POSTリクエストの場合

ある

  • 平均待ち時間は、それは、非常に非常に悪いです。

    コードの書き方に問題はありますか?

    OR

    これはSanicの制限ですか?

    別のRESTフレームワークを試す必要がありますか?

    P.S:フラスコでの私の経験は、待ち時間とタイムアウトした要求の点でさらに悪いです。

    import sys 
    import os 
    import json 
    import pandas 
    import numpy 
    import optparse 
    from keras.models import Sequential, load_model 
    from keras.preprocessing import sequence 
    from keras.preprocessing.text import Tokenizer 
    from collections import OrderedDict 
    from sanic import Sanic 
    from sanic import response 
    import time 
    
    app = Sanic(__name__) 
    
    @app.route('/v1/mal/prediction', methods=['POST']) 
    async def post_handler(request): 
        csv_file = 'alerts.csv' 
        log_entry = request.json 
        dataframe = pandas.read_csv(csv_file, engine='python', quotechar='|', header=None) 
        dataset = dataframe.values 
        X = dataset[:,0] 
        for index, item in enumerate(X): 
         reqJson = json.loads(item, object_pairs_hook=OrderedDict) 
         del reqJson['timestamp'] 
         del reqJson['headers'] 
         del reqJson['source'] 
         del reqJson['route'] 
         del reqJson['responsePayload'] 
         X[index] = json.dumps(reqJson, separators=(',', ':')) 
    
        tokenizer = Tokenizer(filters='\t\n', char_level=True) 
        tokenizer.fit_on_texts(X) 
        seq = tokenizer.texts_to_sequences([log_entry]) 
        max_log_length = 1024 
        log_entry_processed = sequence.pad_sequences(seq, maxlen=max_log_length) 
        model = load_model('model.h5') 
        model.load_weights('weights.h5') 
        model.compile(loss = 'binary_crossentropy', optimizer = 'adam', metrics = ['accuracy']) 
        prediction = model.predict(log_entry_processed) 
        return response.text(prediction[0]) 
    
    if __name__ == '__main__': 
         app.run(host="0.0.0.0", port=8000, debug=True) 
    

    API応答時間を改善し、タイムアウトしたリクエストを減らすためのより良い方法を提案してください。

  • 答えて

    1

    無効にdebugとは、インスタンス(t2.med 2)でCPUの数にworkersを設定:入力のための

    app.run(host="0.0.0.0", port=8001, workers=2) 
    
    +0

    おかげで、パフォーマンスがここでベンチマークテストの比較ですが、少し改善しているように見えました'https:// jpst.it/166oe'でも、待ち時間を改善するためにまだ多くのことができると思います。 1秒あたりのリクエスト数。あなたの入力に加えて、私には大きな助けになるでしょう。 – x0v

    関連する問題

     関連する問題