Ubuntu Server 10.04.1 x86
Eu tenho uma máquina com um serviço HTTP FCGI por trás do nginx, que atende a muitas solicitações HTTP pequenas para vários clientes diferentes. (Cerca de 230 solicitações por segundo nos horários de pico, o tamanho médio da resposta com cabeçalhos é de 650 bytes, vários milhões de clientes diferentes por dia.)
Como resultado, tenho muitos soquetes pendurados em TIME_WAIT (o gráfico é capturado com as configurações TCP abaixo):
Eu gostaria de reduzir o número de soquetes.
O que posso fazer além disso?
$ cat / proc / sys / net / ipv4 / tcp_fin_timeout 1 $ cat / proc / sys / net / ipv4 / tcp_tw_recycle 1 $ cat / proc / sys / net / ipv4 / tcp_tw_reuse 1
Atualização: alguns detalhes sobre o layout de serviço real na máquina:
cliente ----- Soquete TCP -> nginx (proxy reverso do balanceador de carga) ----- Soquete TCP -> nginx (trabalhador) --domain-socket -> fcgi-software --single-persistent-TCP-socket -> Redis --single-persistent-TCP-socket -> MySQL (outra máquina)
Provavelmente eu deveria alternar o balanceador de carga -> a conexão do trabalhador com os soquetes do domínio, mas o problema sobre os soquetes TIME_WAIT permaneceria - planejo adicionar um segundo trabalhador em uma máquina separada em breve. Nesse caso, não será possível usar soquetes de domínio.
fonte
Respostas:
Uma coisa que você deve fazer para começar é consertar o arquivo
net.ipv4.tcp_fin_timeout=1
. Isso é muito baixo, você provavelmente não deve levar muito menos do que 30.Uma vez que isso está por trás do nginx. Isso significa que o nginx está atuando como um proxy reverso? Se for esse o caso, suas conexões são 2x (uma para o cliente e outra para os servidores da web). Você sabe a que extremidade esses soquetes pertencem?
Atualização:
fin_timeout é quanto tempo eles permanecem no FIN-WAIT-2 (De
networking/ip-sysctl.txt
na documentação do kernel):Eu acho que você talvez apenas precise deixar o Linux manter o número do soquete TIME_WAIT em comparação com o que parece ser talvez um limite de 32k neles e é aqui que o Linux os recicla. Este 32k é mencionado neste link :
Esse link também sugere que o estado TIME_WAIT é de 60 segundos e não pode ser ajustado via proc.
Curiosidade : Você pode ver os timers no timewait com netstat para cada soquete com
netstat -on | grep TIME_WAIT | less
Reutilizar versus reciclar:
são interessantes, parece que a reutilização permite a reutilização de soquetes time_Wait e a reciclagem o coloca no modo TURBO:
Eu não recomendaria o uso de net.ipv4.tcp_tw_recycle, pois isso causa problemas com os clientes NAT .
Talvez você tente não ativar os dois e ver qual é o efeito (tente um de cada vez e veja como eles funcionam por conta própria)? Eu usaria
netstat -n | grep TIME_WAIT | wc -l
para um feedback mais rápido do que Munin.fonte
net.ipv4.tcp_fin_timeout
você recomendaria?30
ou talvez20
. Experimente e veja. Você tem muita carga, então muito TIME_WAIT faz sentido.net.ipv4.tcp_fin_timeout
de1
para20
?netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c
. Então, @Alex, se Munin não gostar, talvez veja como ele monitora essas estatísticas. Talvez o único problema é que Munin está dando-lhe dados ruins :-)O tcp_tw_reuse é relativamente seguro, pois permite que as conexões TIME_WAIT sejam reutilizadas.
Além disso, você pode executar mais serviços ouvindo em portas diferentes atrás do seu balanceador de carga se ficar sem portas é um problema.
fonte