Tornado AsyncHTTPClient在中等负载下请求超时

时间:2014-02-05 16:04:51

标签: performance http asynchronous timeout tornado

我正在运行一个简单的Web应用程序,它为每个请求使用一些Web服务,我发现我们的服务器有时会超时(合成599错误)的请求,即使其他服务是响应的在任何时候(我都证实了这一点)。

这些是我得到的错误消息:

HTTP 599: Connection timed out after 7005 milliseconds

(连接时超时)

HTTP 599: Operation timed out after 5049 milliseconds with 0 out of -1 bytes received

(在接收数据之前超时)

HTTP 599: Operation timed out after 10005 milliseconds with 11197 out of 13047 bytes received

(部分转移数据超时)

我已经能够在两个不同的环境中重现这一点,在Amazon EC2 mini实例和我的Macbook Pro(i7)中。在EC2实例中,超时开始发生,只有2个并发客户端发出请求,Macbook支持8个并发客户端,然后它也开始显示超时。

我已经尝试了一些更新Tornado版本(如果我记得很清楚的话,2.2,2.3.1,2.4.1和3.1.1),将基础AsyncHTTPClient实现从默认的简单实现更改为基于pycurl的版本增加异步客户端的数量(到200),但错误仍在发生。

我不确定我可能做错了什么,因为这看起来不像Tornado应该提供的承诺的可扩展性......

任何提示?

更新

仅仅是为了记录,我们在异步回调中使用memcache,但是库本身并不是异步的。我将其替换为:https://github.com/dpnova/tornado-memcache/

这是我认为最大的问题,虽然我们仍然不时得到599。

1 个答案:

答案 0 :(得分:1)

听起来你的代码可能会在某处阻塞事件循环(整数秒 - 你有没有调用time.sleep()?)。尝试使用IOLoop.set_blocking_log_threshold查找阻止事件循环的位置。