uwsgi throws IO error caused by uwsgi_response_write_body_do broken pipe

前端 未结 3 412
眼角桃花
眼角桃花 2020-12-16 09:57

My application is a uwsgi+django setup. I use gevent to do performance testing and run 1200 requests concurrently. At this point, uwsgi will throw an IO error with the fol

相关标签:
3条回答
  • 2020-12-16 10:18

    This error means that the client has closed the connection before uWSGI/Django sends the response. It is generally caused by a timeout in the browser or web server frontend.

    To fix it, you need to verify that your setup is correct. Look to see that all of your application's parts (including database adapters) are gevent-friendly. If they're not, you will get no advantage with gevent, and this could even lead to a decrease in performance.

    In addition to this, you need to make sure that your database server is able to manage 1200 concurrent connections. If not, it may be ignoring connection attempts.

    0 讨论(0)
  • 2020-12-16 10:25

    Now I am not recommending this without you considering your situation. But you could turn uwsgi_ignore_client_abort to "on". With this turned on nginx will keep the aborted connection open until uwsgi returns. Why I don't recommend this completely is because this means an nginx connection will now be tied up until the request finishes. But really the uwsgi thread wasn't being aborted, so aborting the nginx connection early isn't really gaining you much in my opinion.

    0 讨论(0)
  • 2020-12-16 10:38

    This can happen when NGINX started a request to uWSGI but uWSGI took too long to respond, then NGINX closes the connection to uWSGI. When uWSGI finally finishes, it tries to give it's response back to NGINX, but NGINX closed the connection earlier, so then uWSGI throws an I/O error.

    So this could mean that your uWSGI process is taking too long.

    Update:

    uWSGI's Harakiri mode could be useful to automatically terminate such long taking processes if you want to: https://uwsgi-docs.readthedocs.io/en/latest/FAQ.html#what-is-harakiri-mode You might not want to do this because a process might be finishing some long query or something which is necessary.

    0 讨论(0)
提交回复
热议问题