Назад | Перейти на главную страницу

Простая ошибка uWSGI: uwsgi_response_write_body_do () TIMEOUT

Это похоже на хорошо известную проблему с тайм-аутами Nginx + uWSGI, но моя настройка отличается, и я не смог найти информацию об этом.

Я запускаю приложение Flask на uWSGI по протоколу http (не сокетам). Когда я запрашиваю свой API, я иногда получаю сообщение об ошибке:

uwsgi_response_write_body_do() TIMEOUT !!!
IOError: : write error

Чаще получаю в «рабочее время», т.е. не так часто ночью. Я запрашиваю длинные данные JSON (географические координаты, до 50 МБ), и иногда я вообще не получаю ответа, а иногда получаю часть ответа. Это ошибки Python requests запрос:

requests.exceptions.ConnectionError: ('Connection aborted.', error(104, 'Connection reset by peer'))

requests.exceptions.ChunkedEncodingError: ('Connection broken: IncompleteRead(0 bytes read)', IncompleteRead(0 bytes read))

ValueError: Expecting object: line 1 column 5590371 (char 5590370)

ValueError: Unterminated string starting at: line 1 column 20998536 (char 20998535)

ValueError: end is out of bounds

# when I set `timeout=None` in Python
requests.exceptions.ReadTimeout: HTTPConnectionPool(host='mydomain.com', port=80): Read timed out. (read timeout=None)

Соединение осуществляется по обычному протоколу HTTP (без S). Моя конфигурация uWSGI ниже:

[uwsgi]
module = run:app
pidfile = /tmp/app.pid
logto = /var/log/uwsgi/%n.log

master = true
processes = 2

http-socket = 0.0.0.0:someport
http-timeout = 300

die-on-term = true

И я запускаю это, используя uwsgi /path/to/inifile. Нет Nginx, но на самом деле раньше, с Nginx, я получал те же проблемы. Так что я исключил это.

Как я могу избежать этих тайм-аутов?

Я также использую nginx + uwsgi для создания большого файла и сталкиваюсь с той же проблемой. Я решил эту проблему, отключив буфер временного файла uwsgi в директиве nginx use uwsgi_max_temp_file_size 0;.

Я думаю, что скорость передачи от nginx к клиенту намного ниже скорости от uwsgi к nginx. Буфер nginx заполнен, поэтому uwsgi ждет много времени, прежде чем появится место для nginx для приема новых данных, и это приведет к тайм-ауту запроса записи uwsgi.

Я публикую блог, чтобы проанализировать эту проблему в своем блоге.