2017-10-09 102 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) 

我試圖用sanic開發的REST API

這裏是我的結論編寫REST API的Python中:

我試着標杆這個使用運行wrk有50個線程GET API 30s測試。 擁有4GB內存的機器使用AWS EC2 t2.medium和2 CPU 命令使用

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.它應該是零。
  2. 平均延遲,這是〜550ms(太多)

在POST請求的情況下,這是非常非常糟糕的,其中我試圖加載keras模型,並做了預測。

這是代碼寫入問題嗎?

OR

這是中信高科的限制?

我應該嘗試其他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並設置workers到CPU的數量在您的實例(2 t2.med):

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

感謝輸入,性能似乎已經改善了一下,這裏的基準測試的比較'https:// jpst.it/166oe',但我認爲還有很多事情可以做,以改善延遲和不。的每秒請求數。一些額外的輸入將對我有很大的幫助。 – x0v