【问题标题】:uwsgi throws IO error caused by uwsgi_response_write_body_do broken pipeuwsgi 抛出由 uwsgi_response_write_body_do 损坏的管道引起的 IO 错误
【发布时间】:2013-07-04 11:23:46
【问题描述】:

我的应用程序是 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
蟒蛇:2.6
TCP 监听队列:1000

造成这种断管错误的原因是什么?

【问题讨论】:

    标签: python django uwsgi


    【解决方案1】:

    当 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(): Connection reset by peer [core/writer.c line 410] during POST /some/url/ (IP) IOError: write error -- 你解决了这个问题吗?
    • 我在 /var/logs/nginx/error.log 中发现 nginx 正在尝试创建临时文件,但由于权限被拒绝错误而失败。我关注derekneely.com/2009/06/… 解决了权限问题。
    • @VijayendraBapte 该链接不再有效。解决方案是什么?
    • 我也有这个错误,它出现在/var/log/nginx/error.log。此外,由于 nginx 导致的权限错误只能有限访问 uwsgi.socket(我使用 unix 套接字)。
    【解决方案2】:

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

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

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

    【讨论】:

    • 不,我的应用程序没有使用 gevent,我只是使用 gevent 进行测试。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2014-07-30
      • 2016-07-21
      • 1970-01-01
      • 2015-07-13
      • 2014-04-28
      • 2011-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多