Que parâmetro do kernel ou outras configurações controlam o número máximo de soquetes TCP que podem ser abertos em um servidor Linux? Quais são as vantagens de permitir mais conexões?
Notei durante o teste de carga de um servidor Apache com ab que é muito fácil maximizar as conexões abertas no servidor. Se você deixar de lado a opção ab's -k, que permite a reutilização da conexão, e solicitar que ele envie mais de 10.000 solicitações, o Apache atenderá as primeiras 11.000 solicitações e, em seguida, interromperá por 60 segundos. Uma olhada na saída netstat mostra 11.000 conexões no estado TIME_WAIT. Aparentemente, isso é normal. As conexões são mantidas em aberto por 60 segundos, mesmo depois que o cliente é concluído por razões de confiabilidade do TCP .
Parece que essa seria uma maneira fácil de fazer DoS um servidor e estou me perguntando quais são as afinações e precauções habituais para isso.
Aqui está a minha saída de teste:
# ab -c 5 -n 50000 http://localhost/
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (be patient)
Completed 5000 requests
Completed 10000 requests
apr_poll: The timeout specified has expired (70007)
Total of 11655 requests completed
Aqui está o comando netstat que eu executo durante o teste:
# netstat --inet -p | grep "localhost:www" | sed -e 's/ \+/ /g' | cut -d' ' -f 1-4,6-7 | sort | uniq -c
11651 tcp 0 0 localhost:www TIME_WAIT -
1 tcp 0 1 localhost:44423 SYN_SENT 7831/ab
1 tcp 0 1 localhost:44424 SYN_SENT 7831/ab
1 tcp 0 1 localhost:44425 SYN_SENT 7831/ab
1 tcp 0 1 localhost:44426 SYN_SENT 7831/ab
1 tcp 0 1 localhost:44428 SYN_SENT 7831/ab
fonte
Você realmente quer ver o que o sistema de arquivos / proc tem a oferecer a esse respeito.
Nessa última página, você pode achar o seguinte interessante:
fonte
Eu não acho que exista um ajuste para definir isso diretamente. Isso se enquadra na categoria de ajuste de TCP / IP. Para descobrir o que você pode ajustar, tente 'man 7 tcp'. O sysctl ('man 8 sysctl') é usado para configurá-los. 'sysctl -a | grep tcp 'mostrará a maioria do que você pode ajustar, mas não tenho certeza se mostrará todos eles. Além disso, a menos que isso mude, os soquetes TCP / IP se abrem se parecem com descritores de arquivo. Portanto, esta e a próxima seção desse link podem ser o que você está procurando.
fonte
Tente definir o seguinte, bem como definir tcp_fin_timeout. Isso deve encerrar TIME_WAIT mais rapidamente.
fonte
tcp_tw_recycle
que é potencialmente perigoso.tcp_tw_reuse
é mais seguro e não vejo motivo para usá-los simultaneamente.O estoque apache (1) costumava ser predefinido para suportar apenas 250 conexões simultâneas - se você quisesse mais, havia um arquivo de cabeçalho a ser modificado para permitir mais sessões simultâneas. Não sei se isso ainda é verdade no Apache 2.
Além disso, você precisa adicionar uma opção para permitir muitos descritores de arquivos abertos para a conta que executa o Apache - algo que os comentários anteriores falham em apontar.
Preste atenção às configurações do trabalhador e que tipo de tempo limite de manutenção permanente você possui no próprio Apache, quantos servidores extras você tem em execução ao mesmo tempo e qual a velocidade com que esses processos extras são eliminados.
fonte
Você pode reduzir o tempo gasto no estado TIME_WAIT (Defina net.ipv4.tcp_fin_timeout). Você pode substituir o Apache pelo YAWS ou nginx ou algo semelhante.
As trocas de mais conexões geralmente envolvem o uso de memória e, se você tiver um processo de bifurcação, muitos processos filhos que inundam sua CPU.
fonte
O número absoluto de soquetes que podem ser abertos em um único endereço IP é 2 ^ 16 e é definido pelo TCP / UDP, não pelo kernel.
fonte
A ferramenta de benchmarking do servidor HTTP Apache, ab , na versão 2.4, possui a opção -s timeout . Consulte também erro ab (Apache Bench): apr_poll: o tempo limite especificado expirou (70007) no Windows .
Esta opção resolve seu problema.
fonte