Подтвердить что ты не робот

Uwsgi выдает ошибку ввода-вывода, вызванную uwsgi_response_write_body_do сломанной трубой

Мое приложение - это настройка uwsgi + django. Я использую gevent для тестирования производительности и одновременно запускаю 1200 запросов. На этом этапе uwsgi вызовет ошибку ввода-вывода со следующим сообщением журнала:

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 Listen queue: 1000

В чем причина этой ошибки обрыва трубы?

4b9b3361

Ответ 1

Это может произойти, когда NGINX запустил запрос на uWSGI, но uWSGI занял слишком много времени, чтобы ответить, затем NGINX закрывает соединение с uWSGI. Когда uWSGI, наконец, закончит работу, он пытается вернуть ответ NGINX, но NGINX ранее закрыл соединение, поэтому uWSGI выдает ошибку ввода/вывода.

Таким образом, это может означать, что ваш процесс uWSGI занимает слишком много времени.

Update:

Режим uWSGI Harakiri может быть полезен для автоматического прекращения таких длительных процессов, если вы хотите: https://uwsgi-docs.readthedocs.io/en/latest/FAQ.html#what-is-harakiri-mode Возможно, вы не захотите это сделать, потому что процесс может заканчивать какой-то длинный запрос или что-то, что необходимо.

Ответ 2

Теперь я не рекомендую это без вашего рассмотрения вашей ситуации. Но вы можете превратить uwsgi_ignore_client_abort в "on". При включении nginx будет отключено прерывание соединения до тех пор, пока uwsgi не вернется. Почему я не рекомендую это полностью, потому что это означает, что соединение nginx теперь будет привязано до завершения запроса. Но на самом деле поток uwsgi не прерывался, поэтому прерывание связи nginx на раннем этапе на самом деле не набирает вас на мой взгляд.

Ответ 3

Эта ошибка означает, что клиент закрыл соединение, прежде чем uWSGI/Django отправит ответ. Обычно это вызвано таймаутом в интерфейсе браузера или веб-сервера.

Чтобы исправить это, вам нужно проверить правильность настройки. Посмотрите, чтобы все ваши части приложения (включая адаптеры баз данных) были дружелюбны к gevent. Если это не так, вы не получите преимуществ от gevent, и это может даже привести к снижению производительности.

В дополнение к этому вы должны убедиться, что ваш сервер базы данных способен управлять 1200 одновременными подключениями. Если нет, это может быть игнорирование попыток подключения.