web-dev-qa-db-fra.com

uwsgi jette IO erreur provoquée par le tuyau cassé uwsgi_response_write_body_do

Mon application est une configuration uwsgi + Django. J'utilise gevent pour tester les performances et exécuter 1200 demandes simultanément. À ce stade, uwsgi émettra une erreur IO avec le message de journal suivant:

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
File d’écoute TCP: 1000

Quelle est la cause de cette erreur de tuyau cassé? 

26
linbo

Cela peut arriver lorsque NGINX a lancé une demande à uWSGI mais que cela a pris trop de temps pour y répondre, puis que NGINX a fermé la connexion à uWSGI. Quand uWSGI a finalement fini, il essaie de renvoyer sa réponse à NGINX, mais NGINX a déjà fermé la connexion plus tôt. UWSGI génère alors une erreur d'entrée-sortie.

Cela pourrait donc signifier que votre processus uWSGI prend trop de temps.

Mettre à jour:

le mode Harakiri de uWSGI peut être utile pour mettre fin automatiquement à de tels processus de prise si vous souhaitez: https://uwsgi-docs.readthedocs.io/en/latest/FAQ.html#what-is-harakiri-mode Vous ne voudrez peut-être pas faire cela car un processus est en train de terminer une requête longue ou quelque chose qui est nécessaire.

36
gitaarik

Cette erreur signifie que le client a fermé la connexion avant que uWSGI/Django envoie la réponse. Cela est généralement dû à un dépassement du délai d'attente du navigateur ou de l'interface du serveur Web.

Pour résoudre ce problème, vous devez vérifier que votre configuration est correcte. Regardez pour voir que toutes les parties de votre application (y compris les adaptateurs de base de données) sont compatibles avec l'environnement. Dans le cas contraire, vous n’obtiendrez aucun avantage avec gevent, ce qui pourrait même entraîner une baisse des performances.

En plus de cela, vous devez vous assurer que votre serveur de base de données est capable de gérer 1200 connexions simultanées. Sinon, il se peut que vous ignoriez les tentatives de connexion.

2
roberto

Maintenant, je ne le recommande pas sans que vous considériez votre situation. Mais vous pouvez activer uwsgi_ignore_client_abort en "on". Avec cette option activée, nginx gardera la connexion abandonnée ouverte jusqu'au retour de uwsgi. La raison pour laquelle je ne le recommande pas complètement est que cela signifie qu'une connexion nginx sera désormais liée jusqu'à la fin de la demande. Mais, en réalité, le thread uwsgi n’a pas été abandonné. Abandonner tôt la connexion nginx ne vous rapporte donc pas grand-chose à mon avis.

1
byoungb