[Servidor em Linux] - Too many open files [Resolvido]

Oi,

Meu servidor passou a levantar a exceção Too many open files em maquinas Linux.

Notei que isso apenas acontece quando o sistema fica rodando por muito tempo (algo como 1 semana). Se não estou enganada, já postei algo a algum atrás sobre isso, e não consegui uma solução adequada.

A principio, não sei se isso acontece no Socket ou na criação dos arquivos de Log, que fazem uso dos tais PrintStream.

Alguém pode me dar uma dica?

Tchauzin!

oi lina,

veja se ajuda

[quote=André Fonseca]oi lina,

veja se ajuda

Oi,

Até ajudou.

Usei o comando ulimit -aH (e retornou como máximo open files 1024). Usei o comando lsof -p (pid) para listar os arquivos abertos.

Foi apresentado uma lista enorme de arquivos… vou ter que analisar linha por linha…

Tchauzin!

Oi,

Verifiquei no resultado do comando lsof -p varias e varias linhas contendo: IPv6 839130 TCP localhost:62345 -> localhost:43710 (CLOSE_WAIT)

Seria isso o motivo? Como se trata de um IPv6 TCP como devo proceder? O sistema operacional não deveria fechar isso?

Tchauzin!

[quote=lina]Oi,

Verifiquei no resultado do comando lsof -p varias e varias linhas contendo: IPv6 839130 TCP localhost:62345 -> localhost:43710 (CLOSE_WAIT)

Seria isso o motivo? Como se trata de um IPv6 TCP como devo proceder? O sistema operacional não deveria fechar isso?

Tchauzin![/quote]

Lina, espero que te ajude:

Vai precisar gerenciar esses sockets abertos.



oi,

tenta fechar os sockets em um bloco finally

finally { mysocket.close(); }

você pode tentar também altera o parametro do sistema operacional

EDIT: no link que te passei o leoramos conseguiu resolver apenas atualizando a versão do JDK

Oi,

Já estou fechando os sockets em bloco finally.

Agora apresenta alguns arquivos com a seguinte descrição:

sock 0,4 917849 can’t identify protocol

Alguém sabe o que pode ser?

Tchauzin!

O servidor tem suporte ao ipv6 ?

ping6 -c5 ::1

Se o resultado for o seguinte (ou similar):

       # ping6 -c 5 ::1
       PING ::1(::1) 56 data bytes
       64 bytes fro m ::1: icmp_seq=1 ttl=64 time=0.055 ms
       64 bytes fro m ::1: icmp_seq=2 ttl=64 time=0.020 ms
       64 bytes fro m ::1: icmp_seq=3 ttl=64 time=0.033 ms
       64 bytes fro m ::1: icmp_seq=4 ttl=64 time=0.046 ms
       64 bytes fro m ::1: icmp_seq=5 ttl=64 time=0.039 ms

       --- ::1 ping statistics ---
       5 packets transmitted, 5 received, 0% packet loss, time 3996ms
       rtt min/avg/max/mdev = 0.020/0.038/0.055/0.013 ms

significa que o IPv6 está instalado corretamente.

No entanto, se sistema não reconhecer este comando ou retornar algum erro, siga as instruções abaixo:

Primeiramente, certifique-se de que o kernel suporta IPv6. Tente carregar o módulo IPv6 digitando em uma janela do terminal:

 [code]  modprobe ipv6 [/code]

Se este comando retornar um erro, significa que seu kernel não tem suporte ao IPv6. Nesse caso você deverá recompilar um kernel com suporte ao IPv6.

Oi,

Tem suporte, resultado do comando:

[code]ping6 -c5 ::1
PING ::1(::1) 56 data bytes
64 bytes from ::1: icmp_seq=1 ttl=64 time=0.020 ms
64 bytes from ::1: icmp_seq=2 ttl=64 time=0.025 ms
64 bytes from ::1: icmp_seq=3 ttl=64 time=0.025 ms
64 bytes from ::1: icmp_seq=4 ttl=64 time=0.027 ms
64 bytes from ::1: icmp_seq=5 ttl=64 time=0.025 ms

— ::1 ping statistics —
5 packets transmitted, 5 received, 0% packet loss, time 3997ms
rtt min/avg/max/mdev = 0.020/0.024/0.027/0.005 ms
[/code]

E agora?

Tchauzin!

oi,

Então se o seu código esta tratando corretamente os sockets e o SO tem suporte para IPV6 talvez alterando o parametro que lista o máximo de open files resolva

Já tentou fazer isso??Dá uma lida na minha resposta anterior, o cara disse que conseguiu resolver apenas fazendo um update do JDK também…

abs

[quote=André Fonseca]oi,

Então se o seu código esta tratando corretamente os sockets e o SO tem suporte para IPV6 talvez alterando o parametro que lista o máximo de open files resolva

Já tentou fazer isso??Dá uma lida na minha resposta anterior, o cara disse que conseguiu resolver apenas fazendo um update do JDK também…

abs[/quote]

Oi,

Vou postar mais informações para ver se alguém pode me ajudar.

  • Digitado o comando ulimit -aH no terminal.

root@router:/home/# ulimit -aH core file size (blocks, -c) unlimited data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 16382 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) unlimited cpu time (seconds, -t) unlimited max user processes (-u) unlimited virtual memory (kbytes, -v) unlimited file locks (-x) unlimited

  • Digitado o comando lsof | grep (PID) | wc -l

root@router:/home/# lsof | grep 28222| wc -l 763 root@router:/home/#

  • Digitado o comando lsof -p (PID) para mostrar quais são os arquivos abertos

MeuPrograma 28222 root 44u IPv6 262397213 0t0 TCP *:1401 (LISTEN) MeuPrograma 28222 root 45u sock 0,6 0t0 262397214 can't identify protocol MeuPrograma 28222 root 46u sock 0,6 0t0 262401049 can't identify protocol MeuPrograma 28222 root 47u IPv6 262397216 0t0 TCP *:1501 (LISTEN) MeuPrograma 28222 root 48u sock 0,6 0t0 262397217 can't identify protocol MeuPrograma 28222 root 49u sock 0,6 0t0 262401095 can't identify protocol MeuPrograma 28222 root 50u IPv6 262397219 0t0 TCP *:2001 (LISTEN) MeuPrograma 28222 root 52u sock 0,6 0t0 262401506 can't identify protocol MeuPrograma 28222 root 53u IPv6 262397222 0t0 TCP *:5001 (LISTEN) MeuPrograma 28222 root 54u sock 0,6 0t0 262397223 can't identify protocol MeuPrograma 28222 root 56u IPv6 262397225 0t0 TCP *:afs3-callback (LISTEN) MeuPrograma 28222 root 57u sock 0,6 0t0 262397226 can't identify protocol MeuPrograma 28222 root 59u IPv6 262397228 0t0 TCP *:1101 (LISTEN) MeuPrograma 28222 root 62u IPv6 262397242 0t0 TCP *:customs (LISTEN) MeuPrograma 28222 root 64u sock 0,6 0t0 262406201 can't identify protocol MeuPrograma 28222 root 65u IPv6 262397250 0t0 TCP *:8001 (LISTEN) MeuPrograma 28222 root 67u sock 0,6 0t0 262407809 can't identify protocol MeuPrograma 28222 root 68u IPv6 262397253 0t0 TCP *:1301 (LISTEN) MeuPrograma 28222 root 70u sock 0,6 0t0 262412690 can't identify protocol MeuPrograma 28222 root 71u IPv6 262397256 0t0 TCP *:9001 (LISTEN) MeuPrograma 28222 root 73u sock 0,6 0t0 262413721 can't identify protocol MeuPrograma 28222 root 74u IPv6 262397259 0t0 TCP *:4001 (LISTEN) MeuPrograma 28222 root 76u sock 0,6 0t0 262420144 can't identify protocol MeuPrograma 28222 root 77u IPv6 262397262 0t0 TCP *:1601 (LISTEN) MeuPrograma 28222 root 78u sock 0,6 0t0 262397263 can't identify protocol MeuPrograma 28222 root 79u sock 0,6 0t0 262695670 can't identify protocol MeuPrograma 28222 root 80u IPv6 262397265 0t0 TCP *:x11-1 (LISTEN) MeuPrograma 28222 root 82u sock 0,6 0t0 262439630 can't identify protocol MeuPrograma 28222 root 83u IPv6 262397268 0t0 TCP *:1201 (LISTEN) MeuPrograma 28222 root 84u sock 0,6 0t0 262397269 can't identify protocol MeuPrograma 28222 root 85u sock 0,6 0t0 262422117 can't identify protocol MeuPrograma 28222 root 86u sock 0,6 0t0 262397271 can't identify protocol MeuPrograma 28222 root 89u sock 0,6 0t0 262397781 can't identify protocol MeuPrograma 28222 root 90u sock 0,6 0t0 262397886 can't identify protocol MeuPrograma 28222 root 91u sock 0,6 0t0 262397964 can't identify protocol MeuPrograma 28222 root 95u sock 0,6 0t0 262398945 can't identify protocol MeuPrograma 28222 root 98u sock 0,6 0t0 262461324 can't identify protocol MeuPrograma 28222 root 99u sock 0,6 0t0 262445854 can't identify protocol MeuPrograma 28222 root 101u sock 0,6 0t0 262592726 can't identify protocol MeuPrograma 28222 root 103u sock 0,6 0t0 262592728 can't identify protocol MeuPrograma 28222 root 105u sock 0,6 0t0 262695686 can't identify protocol MeuPrograma 28222 root 106u sock 0,6 0t0 262695687 can't identify protocol MeuPrograma 28222 root 107u sock 0,6 0t0 262762844 can't identify protocol MeuPrograma 28222 root 109u sock 0,6 0t0 262772791 can't identify protocol MeuPrograma 28222 root 110u sock 0,6 0t0 262729010 can't identify protocol MeuPrograma 28222 root 111u sock 0,6 0t0 262763160 can't identify protocol MeuPrograma 28222 root 115u sock 0,6 0t0 262763262 can't identify protocol MeuPrograma 28222 root 117u sock 0,6 0t0 262763458 can't identify protocol MeuPrograma 28222 root 120u sock 0,6 0t0 262828943 can't identify protocol MeuPrograma 28222 root 121u sock 0,6 0t0 262797418 can't identify protocol MeuPrograma 28222 root 122u sock 0,6 0t0 262764662 can't identify protocol MeuPrograma 28222 root 124u sock 0,6 0t0 262764664 can't identify protocol MeuPrograma 28222 root 125u sock 0,6 0t0 262828944 can't identify protocol MeuPrograma 28222 root 126u sock 0,6 0t0 262838355 can't identify protocol MeuPrograma 28222 root 127u sock 0,6 0t0 262797624 can't identify protocol MeuPrograma 28222 root 128u sock 0,6 0t0 262829851 can't identify protocol MeuPrograma 28222 root 129u sock 0,6 0t0 262798057 can't identify protocol MeuPrograma 28222 root 130u sock 0,6 0t0 262829852 can't identify protocol MeuPrograma 28222 root 132u sock 0,6 0t0 262829880 can't identify protocol MeuPrograma 28222 root 133u sock 0,6 0t0 262835952 can't identify protocol MeuPrograma 28222 root 134u sock 0,6 0t0 262829943 can't identify protocol MeuPrograma 28222 root 135u sock 0,6 0t0 262832425 can't identify protocol MeuPrograma 28222 root 136u sock 0,6 0t0 262838889 can't identify protocol MeuPrograma 28222 root 137u sock 0,6 0t0 262860003 can't identify protocol MeuPrograma 28222 root 138u sock 0,6 0t0 262839440 can't identify protocol MeuPrograma 28222 root 139u sock 0,6 0t0 262832808 can't identify protocol MeuPrograma 28222 root 140u sock 0,6 0t0 262833555 can't identify protocol MeuPrograma 28222 root 141u sock 0,6 0t0 262833694 can't identify protocol MeuPrograma 28222 root 142u sock 0,6 0t0 262839441 can't identify protocol MeuPrograma 28222 root 143u sock 0,6 0t0 262852518 can't identify protocol MeuPrograma 28222 root 144u sock 0,6 0t0 262855267 can't identify protocol MeuPrograma 28222 root 145u sock 0,6 0t0 262858276 can't identify protocol MeuPrograma 28222 root 146u sock 0,6 0t0 262874916 can't identify protocol MeuPrograma 28222 root 148u sock 0,6 0t0 262872235 can't identify protocol MeuPrograma 28222 root 149u sock 0,6 0t0 262872874 can't identify protocol MeuPrograma 28222 root 152u sock 0,6 0t0 262880528 can't identify protocol MeuPrograma 28222 root 153u sock 0,6 0t0 262874933 can't identify protocol MeuPrograma 28222 root 155u sock 0,6 0t0 263315852 can't identify protocol MeuPrograma 28222 root 156u sock 0,6 0t0 262885703 can't identify protocol MeuPrograma 28222 root 157u sock 0,6 0t0 262885704 can't identify protocol MeuPrograma 28222 root 158u sock 0,6 0t0 262875215 can't identify protocol MeuPrograma 28222 root 159u sock 0,6 0t0 262877589 can't identify protocol

  • Ainda não atualizei a versão do JDK, até porque sempre usei essa e nunca tive esse problema.

Tchauzin!

oi Lina,

Essa mensagem ‘cant identify protocol’ acontecia antes?

Então, parece que o seu código é que está com problemas mesmo na hora de manter os arquivos abertos.

A sugestão do am75 é você debugar o seu programa ao mesmo tempo que roda o lsof no servidor, assim você pode tentar identificar qual parte do código produzindo esse gargalo

De qualquer forma, pode ser sim que uma atualização da JDK resolva todo o problema…

Já passei semanas tentando achar um erro em uma aplicação e muitas vezes aplicando um patch no servidor de aplicações ou no java resolveu tudo do nada… :wink:

Abs

[quote=André Fonseca]oi Lina,

Essa mensagem ‘cant identify protocol’ acontecia antes?

Então, parece que o seu código é que está com problemas mesmo na hora de manter os arquivos abertos.

A sugestão do am75 é você debugar o seu programa ao mesmo tempo que roda o lsof no servidor, assim você pode tentar identificar qual parte do código produzindo esse gargalo

De qualquer forma, pode ser sim que uma atualização da JDK resolva todo o problema…

Já passei semanas tentando achar um erro em uma aplicação e muitas vezes aplicando um patch no servidor de aplicações ou no java resolveu tudo do nada… :wink:

Abs[/quote]

Oi,

Imagine um client que fica em listen numa determinada porta. O mesmo recebe uma conexão nessa porta por meio do HyperTerminal. Após estar tudo conectado e trafegando dados, o HyperTerminal é desconectado.

Como o client saberá que essa conexão socket já morreu?

Tchauzin!

[quote=lina][quote=André Fonseca]oi Lina,

Essa mensagem ‘cant identify protocol’ acontecia antes?

Então, parece que o seu código é que está com problemas mesmo na hora de manter os arquivos abertos.

A sugestão do am75 é você debugar o seu programa ao mesmo tempo que roda o lsof no servidor, assim você pode tentar identificar qual parte do código produzindo esse gargalo

De qualquer forma, pode ser sim que uma atualização da JDK resolva todo o problema…

Já passei semanas tentando achar um erro em uma aplicação e muitas vezes aplicando um patch no servidor de aplicações ou no java resolveu tudo do nada… :wink:

Abs[/quote]

Oi,

Imagine um client que fica em listen numa determinada porta. O mesmo recebe uma conexão nessa porta por meio do HyperTerminal. Após estar tudo conectado e trafegando dados, o HyperTerminal é desconectado.

Como o client saberá que essa conexão socket já morreu?

Tchauzin![/quote]

oi,

Desculpe, não entendi, o HyperTerminal funciona como client ou como server?

O que você precisaria é que o server enviasse um aknowledge (confirmação) para o cliente de que a conexão (socket) foi fechado correto?

Eu não sei se isso é possível (talvez usando system calls…)

Uma alternativa que estive pensando é você colocar um timeout no server, mas não sei se isso resolveria…

Você tentou aumentar o parâmetro de “open files” no SO??

Abs

[quote=André Fonseca][quote=lina][quote=André Fonseca]oi Lina,

Essa mensagem ‘cant identify protocol’ acontecia antes?

Então, parece que o seu código é que está com problemas mesmo na hora de manter os arquivos abertos.

A sugestão do am75 é você debugar o seu programa ao mesmo tempo que roda o lsof no servidor, assim você pode tentar identificar qual parte do código produzindo esse gargalo

De qualquer forma, pode ser sim que uma atualização da JDK resolva todo o problema…

Já passei semanas tentando achar um erro em uma aplicação e muitas vezes aplicando um patch no servidor de aplicações ou no java resolveu tudo do nada… :wink:

Abs[/quote]

Oi,

Imagine um client que fica em listen numa determinada porta. O mesmo recebe uma conexão nessa porta por meio do HyperTerminal. Após estar tudo conectado e trafegando dados, o HyperTerminal é desconectado.

Como o client saberá que essa conexão socket já morreu?

Tchauzin![/quote]

oi,

Desculpe, não entendi, o HyperTerminal funciona como client ou como server?

O que você precisaria é que o server enviasse um aknowledge (confirmação) para o cliente de que a conexão (socket) foi fechado correto?

Eu não sei se isso é possível (talvez usando system calls…)

Uma alternativa que estive pensando é você colocar um timeout no server, mas não sei se isso resolveria…

Você tentou aumentar o parâmetro de “open files” no SO??

Abs
[/quote]

Oi,

Não tentei, pois aumentar o parâmetro do “Open Files” só iria camuflar o erro.

Vou dar uma lida no link e posto em seguida.

Tchauzin!

Oi,

Resolvido! Apenas precisei implementar o método available() do InputStream conforme mostra em sua documentação:

/** * Returns an estimate of the number of bytes that can be read (or * skipped over) from this input stream without blocking by the next * invocation of a method for this input stream. The next invocation * might be the same thread or another thread. A single read or skip of this * many bytes will not block, but may read or skip fewer bytes. * * <p> Note that while some implementations of {@code InputStream} will return * the total number of bytes in the stream, many will not. It is * never correct to use the return value of this method to allocate * a buffer intended to hold all data in this stream. * * <p> A subclass' implementation of this method may choose to throw an * {@link IOException} if this input stream has been closed by * invoking the {@link #close()} method. * * <p> The {@code available} method for class {@code InputStream} always * returns {@code 0}. * * <p> This method should be overridden by subclasses. * * @return an estimate of the number of bytes that can be read (or skipped * over) from this input stream without blocking or {@code 0} when * it reaches the end of the input stream. * @exception IOException if an I/O error occurs. */ public int available() throws IOException { return 0; }

This method should be overridden by subclasses.

Tchauzin!