Como se livrar do buffer de TCP ou lighttpd 4KB na saída do CGI?

1

Eu tenho um stock lighttpd instalado em um Amazon Linux AMI em execução no EC2. As únicas alterações de configuração que fiz foram ativar o suporte ao CGI.

Em seguida, há uma ferramenta CGI customizada (escrita em C) colocada em / cgi-bin / que é chamada do mundo externo e gera JSON gzip'ed. Esta ferramenta produz dados regularmente, digamos a cada 10-20 segundos, mas apenas algumas centenas de bytes de cada vez.

O problema é que em algum lugar entre o stdout CGI e o que o lighttpd retorna ao cliente, as coisas são armazenadas em buffer e chegam a 4KB de cada vez. Infelizmente, esse sistema está por trás do Amazon Elastic Load Balancer, que não permite conexões inativas por mais de 60 segundos. Por causa do buffer, é como se o servidor não retornasse nada nos primeiros 60 segundos, então a conexão é cancelada e o cliente não recebe nada.

Então, como faço para rastrear essa configuração de buffer e reduzi-lo significativamente? Eu tentei alterar alguns parâmetros de configuração lighttpd e até mesmo alterar "net.ipv4.tcp_wmem" no kernel, mas nada parece funcionar.

    
por Pol 19.08.2011 / 18:21

2 respostas

1

strace o processo lighttpd com o seguinte recurso:

strace -f -tt -p PIDOFLIGHTTPD

Você obterá a saída que mostra cada chamada do sistema feita pelo lighttpd e pelo CGI. O registro de data e hora em microssegundos deve indicar quando o CGI está retornando dados e quando o lighttpd está gravando de volta no cliente. Isso também irá responder se o problema for upstream (se você vir o lighttpd enviando dados quase instantaneamente, etc).

    
por 21.08.2011 / 08:15
1

Quando eu costumava escrever cgi's em Perl, era um cenário que eu tinha que incluir no script perl. Em perl era $|=1 . Você provavelmente precisará fazer o equivalente em C. Você pode querer perguntar sobre o Stack Overflow em seu lugar.

    
por 19.08.2011 / 19:26