【问题标题】:how to increase timeout in tornado如何增加龙卷风的超时时间
【发布时间】:2012-08-08 00:33:09
【问题描述】:

我正在尝试龙卷风框架。但是我发现在压力测试(使用多机械)中,龙卷风经常在 30 秒后失败。我在多机械化中使用 10 个线程并运行 100 秒,大约 500 个请求/秒。 30秒后故障率约为15%。整个测试时间约为 100 秒。从统计中,我意识到,失败可能是由于 0.2 秒后超时。我搜索了几种增加网络超时的方法,但没有任何效果。

以下是我的龙卷风代码:

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

【问题讨论】:

  • 那么,您每秒发送 5,000 个请求?
  • 如果您需要每秒处理 5000 个请求,您将需要更多后端。加载时间超过 30 秒的页面比 404 更糟糕
  • 我的 Mac 上每秒大约有 500 个请求。 multi-mechanize 捕获的错误是 Socket.error。

标签: python tornado stress-testing


【解决方案1】:

要回答您关于如何更改tornado 超时的问题,您需要修改tornado 的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)。

但是,正如评论中所建议的,我认为您应该考虑分配负载。

【讨论】:

  • 我尝试了您的建议并增加了 httpserver 上的处理器。但它在 30 秒后仍然失败约 15%(每秒约 500 个请求)
  • 顺便说一句,我尝试使用 sock.listen(999999999999),似乎有助于将故障率降低到 5%。但是失败发生在 30 秒左右。之后不再发生故障。我不知道这背后发生了什么。
  • 我尝试使用 sock.listen(1000000),并将测试客户端代码更改为 requests.get("127.0.0.1:8000", timeout=50.0)。似乎有助于将故障率降低到 0%。
  • 错误信息。看来,故障依然存在。问题可能不是由于龙卷风的超时。可能是我的系统设置造成的。如果连接超过500请求/秒,一段时间后,错误“无法分配请求的地址”出来。我正在寻找系统配置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-15
  • 1970-01-01
  • 1970-01-01
  • 2016-02-11
  • 1970-01-01
相关资源
最近更新 更多