Pessoal,
Temos uma aplicação multithreaded que realiza atividades de FTP. Mais precisamente download e upload.
Por exemplo, cadastramos um servidor FTP e alguns diretorios para este servidor FTP no banco.
Nossa aplicação le os diretorios, e lança uma thread para cada um dos diretórios.
Dependendo do tipo do diretório, a aplicação baixa arquivos do servidor FTP, ou então faz upload de arquivos locais para o servidor FTP.
Depois de algum tempo que a aplicação está rodando, o comando netstat do windows retorna um número enorme de conexões em TIME_WAIT, todas que foram utilizadas pela minha aplicação.
O problema é que chega a um ponto em que quase todas as 60 mil e poucas portas disponíveis ficam em TIME_WAIT.
Depois de algum tempo realizando testes, percebi que dava pra diminuir o número de conexões que minha aplicação realiza.
Mesmo assim o número de portas em TIME_WAIT é absurdo.
Como sabemos, TIME_WAIT é um status normal em toda conexão TCP, que tem um tempo de duração, baseado na especificação do TCP, e que ocorre depois que a conexão já foi fechada.
Andei pesquisando algumas formas para corrigir esse problema.
Pensei em criar um pool de conexões FTP, e deixar um número limite de conexões sempre conectado. Assim nenhuma porta ficaria em TIME_WAIT e o problema seria resolvido. Porém isso consumiria banda, e eu ainda correria o risco de o o servidor fechar as conexões.
Pensei em limitar o número de portas que a minha aplicação pode usar. Isso provavelmente ajudaria um pouco, porém limitaria os acessos que a minha aplicação faz, e provavelmente faria com que alguns servidores FTP com mais uso impactassem em servidores com menos uso, o que seria ruim.
Pensei em limitar o timeout do TIME_WAIT. Pesquisando por aí, descobri que é possível até mesmo eliminar este estado. Porém a conexão TCP correria o risco de se “perder” caso ela fosse realizada em uma porta que deveria estar em TIME_WAIT. Em outras palavras, minhas conexões TCP não seriam mais “tão confiáveis”.
E isso impactaria em todas as aplicações que fazem conexões TCP na máquina que for rodar minha aplicação de FTP.
Então eu baixei o Filezilla para realizar uns testes.
Percebi que ele faz praticamente a mesma coisa:
Transferi 180 arquivos para um mesmo servidor, e depois disso mais de 200 portas ficaram em TIME_WAIT.
Bom…se alguém tiver alguma observação ou dica eu agradeço.