A documentação da diretiva de tempo limite no apache afirma que:
When writing data to the client, the length of time to wait for an acknowledgement of a packet if the send buffer is full.
Mas se a pilha TCP não receber e ACK, ela reenviará o pacote. Então, como essas duas coisas interagem? O tempo limite do apache estabelece um limite geral de re-tentativas antes de abortar a conexão?
O contexto é uma situação em que o curl pulls falha periodicamente com o erro:
curl: (18) transfer closed with XXXXXX bytes remaining to read
e estou tentando determinar o motivo exato.
Tendo tomado um rastreio Wireshark no cliente e no servidor, parece que o servidor (apache) está encerrando a sessão prematuramente por algum motivo (portanto, não um firewall ou outro forçando-o a ser fechado). Isto está acontecendo para 2 tipos de arquivos que são freqüentemente baixados: arquivos binários grandes (100 mb mb mp4) e pequenos arquivos de texto (~ 10kb). Para os arquivos grandes, há uma mensagem de log do apache:
The timeout specified has expired: [client :] AH01581: Timeout while writing data for URI /xxxx/xxxx/xxxx/ to the client
Meu palpite atual é que isso é apenas congestionamento da rede, já que as falhas tendem a se acumular em determinados momentos, mas eu gostaria de defini-lo ainda mais, se possível.
Configuração:
CentOS 6.6
Apache 2.4.16
Onda 7.19.7
Tags curl apache-2.4 tcp