34

我的应用程序是 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

这个断管错误的原因是什么?

4

3 回答 3

46

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

于 2013-12-11T17:46:06.547 回答
5

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

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

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

于 2013-07-07T05:39:05.993 回答
2

现在,如果您不考虑您的情况,我不建议您这样做。但是您可以将uwsgi_ignore_client_abort 设置为“on”。开启此功能后,nginx 将保持中止的连接打开,直到 uwsgi 返回。为什么我不完全推荐这个是因为这意味着一个 nginx 连接现在将被绑定,直到请求完成。但实际上 uwsgi 线程并没有被中止,所以在我看来,尽早中止 nginx 连接并没有真正让你受益。

于 2016-09-29T22:07:11.023 回答