我的应用程序是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
这种管道损坏错误的原因是什么?
答案 0 :(得分:37)
当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 您可能不希望这样做,因为进程可能正在完成一些长查询或某些必要的事情。答案 1 :(得分:2)
此错误表示客户端在uWSGI / Django发送响应之前已关闭连接。这通常是由浏览器或Web服务器前端的超时引起的。
要解决此问题,您需要验证您的设置是否正确。查看所有应用程序的所有部分(包括数据库适配器)都是gevent友好的。如果他们不是,你将无法获得gevent的优势,这甚至可能导致性能下降。
除此之外,您还需要确保数据库服务器能够管理1200个并发连接。如果不是,则可能忽略连接尝试。
答案 2 :(得分:1)
现在,如果不考虑你的情况,我不建议这样做。但是你可以将uwsgi_ignore_client_abort转换为" on"。启用此功能后,nginx将保持中止连接打开,直到uwsgi返回。为什么我不完全推荐这个是因为这意味着nginx连接现在将被绑定直到请求完成。但是真的uwsgi线程并没有被中止,所以在我看来,早期中断nginx连接并不能让你获得更多。