uwsgi 报IO错误,原因是 uwsgi_response_write_body_do 出现了 broken pipe。

38

我的应用程序是一个uwsgi+django的架构。我使用gevent进行性能测试,同时运行1200个请求。在这一点上,uwsgi将抛出一个IO错误,并记录以下日志信息:

uwsgi_response_write_body_do(): Broken pipe [core/writer.c line 260]
IOError: write error

Django 1.4.0
uwsgi:1.9.13
python:2.6
TCP 监听队列:1000

这个“broken pipe”错误的原因是什么?

3个回答

50
这可能发生在NGINX向uWSGI发起请求但是uWSGI回应时间过长,导致NGINX关闭与uWSGI之间的连接。当uWSGI最终完成请求时,它尝试将响应发送回NGINX,但由于NGINX之前已经关闭了连接,所以uWSGI会抛出I/O错误。
因此,这可能意味着您的uWSGI进程执行时间过长。
更新: 如果您愿意的话,uWSGI的Harakiri模式可能非常有用,可以自动终止此类耗时较长的进程: https://uwsgi-docs.readthedocs.io/en/latest/FAQ.html#what-is-harakiri-mode 不过您可能并不想这样做,因为进程可能正在执行某些必要的、耗时较长的查询或其他操作。

3
我也遇到了类似的错误。在进行POST /some/url/请求时,出现uwsgi_response_write_body_do(): Connection reset by peer [core/writer.c line 410]的错误提示。(IP)出现了IOError: write error - 你解决了这个问题吗? - Vijayendra Bapte
我在/var/logs/nginx/error.log文件中发现nginx试图创建一个临时文件,但由于权限被拒绝而失败。我按照http://derekneely.com/2009/06/nginx-failed-13-permission-denied-while-reading-upstream/的方法来解决权限问题。 - Vijayendra Bapte
@VijayendraBapte 这个链接已经失效了。解决方案是什么? - raacer
我也遇到了这个错误,它出现在/var/log/nginx/error.log中。同时,由于nginx只有对uwsgi.socket(我使用unix sockets)的有限访问权限,也会出现权限错误。 - fl_

6
这个错误意味着客户端在uWSGI/Django发送响应之前关闭了连接。通常是由于浏览器或Web服务器前端的超时导致的。
要解决这个问题,您需要验证您的设置是否正确。检查所有应用程序部分(包括数据库适配器)是否都支持gevent。如果不支持,则无法获得gevent的优势,甚至可能导致性能下降。
此外,您需要确保您的数据库服务器能够管理1200并发连接。如果不能,它可能会忽略连接尝试。

不,我的应用程序并没有使用gevent,我只是用gevent来进行测试。 - linbo

3
现在我并不建议您在考虑自身情况之前采用这种方法。但是您可以将uwsgi_ignore_client_abort设置为“on”。启用此选项后,nginx将保持中止的连接直到uwsgi返回。我不完全推荐此方法的原因是这意味着一个nginx连接现在会一直保持直到请求完成。但实际上,uwsgi线程并没有被中止,所以我认为提前中止nginx连接并不能带来太多好处。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接