向Tornado HTTP服务器POST时偶发requests.exceptions.ConnectionError如何解决
问题根因
该错误既不是requests也不是Tornado的缺陷,是Linux TCP协议栈默认参数限制导致的:
- 你调用
app.listen(8888)启动Tornado服务时,没有显式指定backlog参数,Tornado默认使用系统默认值128,这个参数定义了TCP连接等待服务端accept的队列长度 - 500个客户端同时发起TCP握手时,瞬间涌入的连接数远大于128,accept队列被打满,Linux内核会直接丢弃超出队列长度的连接请求,给客户端返回RST包,就会抛出
ConnectionResetError: [Errno 104] Connection reset by peer异常 - 你加随机休眠后,客户端握手请求被分散到1秒的时间窗口内,不会瞬间打满accept队列,所以异常消失
修复方案
- 最简单的修复方式是调大Tornado监听的backlog参数,将代码中
app.listen(8888)修改为app.listen(8888, backlog=1024),可适配你当前500并发的场景 - 高并发生产环境中,你已经实现的重试逻辑仍然建议保留,作为网络波动场景的兜底方案
- 如果你需要更高的并发承载能力,可以同步调整Linux内核参数
net.core.somaxconn、net.ipv4.tcp_max_syn_backlog,和Tornado的backlog参数匹配,避免内核层面限制队列长度
内容的提问来源于stack exchange,提问作者JohnMudd
相关产品推荐
相关产品推荐

