0

tornadoフレームワークを試しています。しかし、ストレステスト(マルチメカニカルを使用)で30秒後に竜巻が頻繁に失敗することがわかりました。マルチメカニカルで10スレッドを使用し、100秒間、約500リクエスト/秒で実行します。そして、30秒後の故障率は約15%です。全体のテストは約100秒です。統計から、0.2秒後のタイムアウトが原因で障害が発生している可能性があることがわかりました。Webでタイムアウトを増やす方法をいくつか探しましたが、何も機能しません。

以下は私のトルネードコードです:

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    def get(self):
        self.write("Hello, world")
        self.finish()

application = tornado.web.Application([
    (r"/", MainHandler),
])

if __name__ == "__main__":
    application.listen(8000)
    tornado.ioloop.IOLoop.instance().start()

これが私のマルチ機械化テストスクリプトです:

import requests
import random
import time

class Transaction(object):
    def __init__(self):
        pass
    def run(self):
        r = requests.get('http://127.0.0.1:8000')
        output = r.raw.read()
        assert(r.status_code == 200)
        return output

if __name__ == '__main__':
    trans = Transaction()
    trans.run()
    print trans.custom_timers

以下は、multimech-runから受け取ったエラーメッセージです。

Traceback (most recent call last):
  File "././test_scripts/v_user.py", line 12, in run
    r = requests.get('http://127.0.0.1:8000')
  File "/Library/Python/2.7/site-packages/requests/api.py", line 54, in get
    return request('get', url, **kwargs)
  File "/Library/Python/2.7/site-packages/requests/safe_mode.py", line 37, in wrapped
    return function(method, url, **kwargs)
  File "/Library/Python/2.7/site-packages/requests/api.py", line 42, in request
    return s.request(method=method, url=url, **kwargs)
  File "/Library/Python/2.7/site-packages/requests/sessions.py", line 230, in request
    r.send(prefetch=prefetch)
  File "/Library/Python/2.7/site-packages/requests/models.py", line 603, in send
    timeout=self.timeout,
  File "/Library/Python/2.7/site-packages/requests/packages/urllib3/connectionpool.py", line 415, in urlopen
    body=body, headers=headers)
  File "/Library/Python/2.7/site-packages/requests/packages/urllib3/connectionpool.py", line 267, in _make_request
    conn.request(method, url, **httplib_request_kw)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 941, in request
    self._send_request(method, url, body, headers)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 975, in _send_request
    self.endheaders(body)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 937, in endheaders
    self._send_output(message_body)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 797, in _send_output
    self.send(msg)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 759, in send
    self.connect()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 740, in connect
        self.timeout, self.source_address)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 571, in create_connection
    raise err
error: [Errno 49] Can't assign requested address
4

1 に答える 1

0

トルネードのタイムアウトを変更する方法についての質問に答えるには、トルネードのbind_socket関数を変更してタイムアウトを設定する必要があります:http://www.tornadoweb.org/documentation/_modules/tornado/netutil.html

sock.setblocking(0)
sock.bind(sockaddr)
sock.listen(backlog)
sockets.append(sock)

最初の行をsock.setblocking(1)に変更します。ドキュメントによると: http: //docs.python.org/library/socket.html#socket.socket.settimeout

タイムアウトをNoneに設定すると、ソケット操作のタイムアウトが無効になります。s.settimeout(None)は、s.setblocking(1)と同等です。

ただし、コメントで示唆されているように、負荷の分散を検討する必要があると思います。

于 2012-08-08T06:16:52.320 に答える