uWSGI вызывает OSError: ошибка записи во время большого запроса

мое приложение использует nginx, с uWSGI на стороне сервера. Когда я делаю большой запрос (с временем отклика > 4s), появляется следующее:

SIGPIPE: writing to a closed pipe/socket/fd (probably the client
    disconnected) on request _URL_ (ip XX.XX.XX.XX) !!!

uwsgi_response_writev_headers_and_body_do(): Broken pipe
    [core/writer.c line 287] during GET _URL_ (XX.XX.XX.XX)

OSError: write error

кажется, что uWSGI пытается писать в потоке, но этот поток уже закрыт. Когда я проверяю журнал nginx (ошибка.log):

upstream prematurely closed connection while reading response
    header from upstream ...

конечно, мой клиент (клиент REST или браузер) получает ошибку 502.

Я всегда получаю эту ошибку после ~4s.

тем не менее, я не знаю, как предотвратить эту проблему. Я попытался установить некоторые параметры в конфигурационном файле nginx:

location my_api_url {
    [...]
    uwsgi_buffer_size 32k;
    uwsgi_buffers 8 32k;
    uwsgi_busy_buffers_size 32k;

    uwsgi_read_timeout 300;
    uwsgi_send_timeout 300;

    uwsgi_connect_timeout 60;
}

но проблема все еще здесь. Я также попытался установить эти параметры в файле конфигурации uWSGI (wsgi.ini-файл):

buffer-size=8192
ignore-sigpipe=true
ignore-write-errors=true

прежде чем пытаться оптимизировать время отклика, я надеюсь, что эта проблема имеет решение. Я не нахожу никого, кто работает на другой должности. Я работаю с большим количеством данных, поэтому время моего ответа в некоторых случаях будет между 4-10s.

надеюсь, вы можете помочь я:)

большое спасибо заранее.

1 ответов


может быть так, что при загрузке вещей вы используете фрагментированную кодировку. Существует опция uWSGI --chunked-input-timeout, что по умолчанию-4 секунды (это по умолчанию к значению --socket-timeout, что составляет 4 секунды).

хотя проблема теоретически может лежать где-то еще, я предлагаю вам попробовать вышеупомянутые варианты. Кроме того, раздражающие исключения-причина, по которой у меня есть

ignore-sigpipe=true
ignore-write-errors=true
disable-write-exception=true

в моей конфигурации uWSGI (обратите внимание, что я предоставляю 3 варианта, а не 2):

  • ignore-sigpipe делает uWSGI не показывать ошибки SIGPIPE;
  • ignore-write-errors делает его не показывать ошибки с например,uwsgi_response_writev_headers_and_body_do;
  • disable-write-exception предотвращает OSError поколение пишет.