Erro de uWSGI simples: uwsgi_response_write_body_do () TIMEOUT

2

Isso parece um problema bem conhecido com os tempos limite de Nginx + uWSGI, mas minha configuração é diferente e não consegui encontrar informações sobre isso.

Eu executo um aplicativo Flask no uWSGI, no protocolo http (sem soquetes). Quando eu consultar minha API, às vezes recebo um erro:

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

Recebo mais vezes durante o "horário comercial", ou seja, não com muita frequência à noite. Estou consultando dados JSON longos (coordenadas geográficas, até 50 MBytes) e às vezes não obtenho nenhuma resposta, e às vezes recebo parte da resposta. Estes são erros da solicitação requests do Python:

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)

A conexão é sobre HTTP simples (sem S). Minha configuração do uWSGI abaixo:

[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

E eu executo isso usando uwsgi /path/to/inifile . Não há Nginx, mas na verdade antes, com o Nginx, eu estava recebendo os mesmos problemas. Então eu descartei este aqui.

Como posso evitar esses tempos limite?

    
por adamczi 06.01.2018 / 15:13

1 resposta

2

Eu também uso o nginx + uwsgi para produzir um arquivo grande e encontrar o mesmo problema. Eu resolvi este problema desabilitando o buffer do arquivo temporário uwsgi em nginx use directive uwsgi_max_temp_file_size 0; .

Eu acho que a velocidade de transmissão do nginx para o cliente é muito mais lenta que a velocidade do uwsgi para o nginx. E o buffer do nginx está cheio, então o uwsgi espera muito tempo antes que haja espaço para o nginx receber novos dados e isso faz com que o tempo limite de requisição de gravação do uwsgi seja atingido.

Eu postei um blog para analisar esse problema no meu blog.

    
por 02.02.2018 / 07:44