Quantidade de Threads abertas

Galera, seguinte, minha aplicação hora que chega na quantidade de 6 mil threads aberta a aplicação capota.

Sei que é doideira esse monte de thread, mas preciso para alguns testes da minha aplicação. Preciso chegar em 10 mil threads para poder testar a minha aplicação.

Ocorre o seguinte erro: “unable to create new native thread”.

Estou passando na minha aplicação os seguintes parametros: -Xms512m -Xmx768m
Estou usando o aplicativo do NetBeans que monitora a aplicação, o status esta desse jeito:

Total Memory:522,059,760B
Used Memory:115,409,720B

Não sei por que nao esta criando mais Thread, sendo que ha memoria suficiente.

Estou usando o Ubuntu, será que tenho habilitar algum recurso de SO ou da JVM?

Att

[quote]Linux doesn’t have a separate threads per process limit, just a limit on the total number of processes on the system (threads are essentially just processes with a shared address space on Linux) which you can view like this:

cat /proc/sys/kernel/threads-max

The default is the number of memory pages/4. You can increase this like:

echo 100000 > /proc/sys/kernel/threads-max

There is also a limit on the number of processes (an hence threads) that a single user may create, see ulimit/getrlimit for details regarding these limits.
[/quote]
Fonte: http://stackoverflow.com/questions/344203/maximum-number-of-threads-per-process-in-linux

Mas precisa mesmo de tanta thread? O que você está fazendo com threads que não poderia ser simulado sem threads?

ViniGodoy,

A historia é longa, mas vamos la.
Tenho que fazer um sistema que mantenha equipamentos de rastreamentos conectados. Esses equipamentos funcionam de duas maneiras:

Primeira: Trata a conexao que recebe os dados da posição do veiculo e telemetria do veiculo, ate esse ponto blza, por que quando termina a trasmissao dos dados eu fecho o socket e quando e equipamento quiser conectar de novo o servidor vai estar a disposição, sem problemas essa primeira parte.

Segunda: Trata da conexao que a empresa fabricante do equipamento mantem com os equipamentos. É preciso desse canal de conexao para quando a empresa dos equipamentos quiser um equipamento online ele esteja. Entendeu?

O fluxo é o seguinte:

O equipamento conecta no servidor de manutenção.
Pego a string de conexao que o equipamento me manda.
Identifico o equipamento na base.
equipamento identificado mando um @ para que o mesmo fique em “standy by” mas conectado ao meu servidor, para que quando eu quiser mandar algum comando para ele, ele esteja online.
Equipamento fica no maximo 30 minutos conectado, passado esse tempo desconecto e mando ele conectar novamente.

O que eu fiz:

Equipamento conecta no servidor de manutenção.
Faço a validação do equipamento em uma Thread separada, equipamento ok na base eu guardo ele em um Map, nesse caso eu guardo o SocketChannel dentro do meu Map, usando o IMEI do equipamento como Chave, Thread morre.
Tenho uma outra parte do sistema que fica verificando no Map se ha algum comando para o equipamento.

Se caso o equipamento desconectar eu tiro o antigo do Map e adiciono o novo SocketChannel no Map.

Quais os problemas que estou tendo:

Primeiro

06/12/2011 07:34:09,005 32092830 [main] ERROR root  - Principal-mainjava.net.SocketException: Too many open files
    at java.net.PlainSocketImpl.socketAccept(Native Method)
    at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:408)
    at java.net.ServerSocket.implAccept(ServerSocket.java:462)
    at java.net.ServerSocket.accept(ServerSocket.java:430)
    at br.com.ces.svias.principal.Principal.main(Principal.java:68)

o que já Fiz: Já aumentei o limite de conexao do linux e nada, continua com o mesmo problema.

Segundo, mesmo antes de dar o problema acima, quando mando algum comando para o equipamento que esta dentro do Map, a conexao dele esta perdida, ai tenho que esperar o equipamento conectar novamente e acesso a minha base para mandar comandos pendentes para o equipamento.

O cliente esta no meu pé para que o sistema fique pronto.
Eu testei o sistema da seguinte maneira, quando o equimamento conectar eu crio uma Thread para ele, eu testei sem conexão com o banco, foi criado todas as threads que eu necessitei, aproximadamente 8000 equipamentos, quando coloquei a minha aplicação acessando o banco é que começou o erro:“unable to create new native thread”.

Sei que a criação de Threads não é o ideal, mas não sei mais o que fazer.

Com relação ao banco estou usando C3PO para gerenciar o pool de conexao.

Outra coisa, o meu sistema é 32 bits, no caso estou usando Ubuntu, estou montando outra maquina 64 bits.

Att

Você pode evitar todas essas threads usando os Selectors. Assim você pode criar uma thread só para vigiar a conexão de todos os equipamentos.
Para muitos clientes, é uma das únicas maneiras.


http://www.exampledepot.com/egs/java.nio/NbClient.html

O uso de Selector deve ser fácil para você, que já está usando um SocketChannel, não?

Se seu problema é que o processamento pode ser um pouco lento e você não quer que 8000 sockets sejam atendidos por uma única thread, pode usar algo como um pool de threads (que não precisa ter 8000 threads, é claro - pode ter umas 2 vezes a quantidade de cores do processador da sua máquina) para atender as requisições que são selecionadas pelo seu Selector.

Galera,

Vou tentar com o Selector, como realizo os meus testes a noite, amanha eu conto para voces o que ocorreu.

Att