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
поколение пишет.