[ URGENTE ] - Aplicação com muitos sockets e too many open files exception

Estou tendo que desenvolver uma aplicação que precisa usar threads para abrir sockets e essas threads também fazem atualizações no banco de dados, ou seja, cada uma tem uma conexão.
Quando aumento o número de threads na aplicação tenho que aumentar o número de conexões com o banco. Quando chego a abrir por volta de 800 a 1000 threads recebo esta exception:

java.lang.Throwable: java.net.SocketException: Too many open files at br.com.billing.request.RequestSDPThread.run(RequestSDPThread.java:163) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) at java.lang.Thread.run(Thread.java:619) Caused by: java.net.SocketException: Too many open files at java.net.Socket.createImpl(Socket.java:388) at java.net.Socket.<init>(Socket.java:362) at java.net.Socket.<init>(Socket.java:209) at br.com.http.Request.connect(Request.java:143) at br.com.client.http.ClientSDPRequest.send(ClientSDPRequest.java:115) at br.com.client.http.ClientSDPRequest.reserveAndCommit(ClientSDPRequest.java:140) at br.com.request.RequestSDPThread.run(RequestSDPThread.java:151) ... 3 more
Isso acontece porque tenho muitos sockets abertos, e porque tenho no datasource mais de 500 conexões, então, gostaria de saber se isso é uma limitação ou se é questão de configuração?
Estou usando o tomcat( com dbcp ), jpa e spring.
E esta aplicação precisa manter mais de 500 transações por segundo para um servidor apache, por isso faço com threads as minhas requisções.

Oi!

Estou achando estes números (800, 1000) muito altos…verifique se vc não está esquecendo de fechar conexões. Verifique também o tempo de processamento das requisições talvez esteja alto demais fazendo com que o número de threads aumente muito.

Não esqueça de verificar tambem o fluxo do processamento nos pontos de controle de exceptions; pode estar havendo alguma exception não controlada fazendo o fluxo terminar tardiamente sem passar pelos códigos que fecham as conexões.

flws

Se você estiver usando uma máquina Solaris ou Linux ou algum outro Unix existe um parâmetro do kernel que deve ser atualizado, para permitir que um processo possa abrir mais que N arquivos ou sockets.

Suspeito que você esteja usando alguma coisa derivada do Unix, porque no Windows o número excessivo de sockets abertos não provoca esse erro de “Too many open files” mas outra coisa.

As conexões do banco de dados estão sendo gerenciadas pelo spring e os sockets eu estou fechando corretamente em blocos finally.
Este erro só acontece quando eu aumento o número de sockets e o número de conexões com o banco de dados.
Eu estou usando um linux para rodar a aplicação. Achei este comando “ulimit -a” que fala que open files na máquina tem o máximo de 1024.
Então fiz um java simples que só ficava abrindo arquivos e contando quanto arquivos eu abri e consegui chegar a 4200 :? . Agora não sei esta informação do comando ulimit é correta. Abaixo segue o código que eu fiz para forçar o erro:

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.FileNotFoundException;

public class TestSocket {
        public final static void main(String[] args){
                System.out.println( "------- Start Test Open Files -------" );

                File testFile = new File( "test.txt" );

                if( !testFile.exists() ) {
                        System.out.println( "Don't exist file." );
                        System.exit( 0 );
                }

                //BufferedReader buffer = null;

                for(int i = 0; i < 5000; i++) {
                        System.out.println( "File: " + i ) ;

                        try {
                                BufferedReader buffer = new BufferedReader( new FileReader( testFile ) ) ;
                        } catch(IOException e) {
                                //e.printStackTrace();
                                System.out.println( "Exception: " + e.getMessage() + " " + e.getCause() );
                        }

                }

                System.out.println( "------- End Test Open Files -------" );
        }
}

[quote=Jedi_FeniX] Achei este comando “ulimit -a” que fala que open files na máquina tem o máximo de 1024.
Então fiz um java simples que só ficava abrindo arquivos e contando quanto arquivos eu abri e consegui chegar a 4200 …
[/quote]
Hum… você deveria ter acumulado esses BufferedReaders em um List<>, porque do jeito que você fez o Garbage Collector (Finalizer) pode até ter fechado alguns desses arquivos.

Pessoal funciona assim, o windows tem um limite para as portas abertas, já passei por este problema ao construir um antispam, nos testes eu testava até 1000 tudo ok, mas 5000 já não dava, para funcionar você tem que alterar o registro do windows. agora só não me lembro onde.

tem aqui para o windows 7 e xp

http://pplware.sapo.pt/2009/04/17/windows-7-remover-limite-conexoes-tcpip/

http://www.babooforum.com.br/forum/index.php?showtopic=240248

aqui tem mais informações.

Estou usando linux…

entanglement vou fazer um arquivo para ficar abrindo conexões com um servidor no mesmo estilo no de cima e ver o que acontece.