uwsgi抛出uwsgi_response_write_body_do破坏管道导致的IO错误

lin*_*nbo 27 python django uwsgi

我的应用程序是uwsgi + django设置.我使用gevent进行性能测试并同时运行1200个请求.此时,uwsgi将使用以下日志消息抛出IO错误:

uwsgi_response_write_body_do(): Broken pipe [core/writer.c line 260]
IOError: write error
Run Code Online (Sandbox Code Playgroud)

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

这种管道损坏错误的原因是什么?

git*_*rik 38

当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 您可能不想这样做是因为进程可能正在完成一些长查询或必要的事情.

  • 我也遇到了类似的错误.2014年5月31日星期六01:29:36 - uwsgi_response_write_body_do():在POST/some/url /(IP)期间由peer [core/writer.c line 410]重置连接IOError:写错误 - 你解决了这个问题吗? (3认同)

rob*_*rto 5

这个错误意味着客户端在 uWSGI/Django 发送响应之前已经关闭了连接。它通常是由浏览器或 Web 服务器前端的超时引起的。

要修复它,您需要验证您的设置是否正确。看看你的应用程序的所有部分(包括数据库适配器)都是 gevent 友好的。如果不是,您将无法使用 gevent,这甚至可能导致性能下降。

除此之外,您需要确保您的数据库服务器能够管理 1200 个并发连接。如果没有,它可能会忽略连接尝试。