"Too many open files" erro -> ulimit -n 65536 não resolve

Iniciado por evefuji, 19 de Outubro de 2011, 19:50

tópico anterior - próximo tópico

evefuji

Olá,

Depois de muito procurar e quebrar a cabeça, infelizmente não encontrei solução para esse problema (encontrei em outros fóruns problemas muito semelhantes, mas nenhuma solução).

Tenho uma aplicação no glassfish que necessita abrir muitos arquivos, entretanto, me sai sempre o erro "Too many open files". Mudei o parâmetro do ulimit -n, tanto através do ulimit quanto através do arquivo /etc/security/limits.conf, mas não me solucionou o problema.

Adicionei ao limits.conf


glassfish soft nofile 65536
glassfish hard nofile 65536


E depois de reiniciar, o ulimit -n me trouxe 65536.

Entretanto, rodando o comando abaixo:


for pid in `pidof java`; do echo "$(< /proc/$pid/cmdline)"; egrep 'files|Limit' /proc/$pid/limits; echo "Currently open files: $(ls -1 /proc/$pid/fd | wc -l)"; echo; done


Tenho a seguinte resposta:



Limit                     Soft Limit           Hard Limit           Units
Max open files            1024                 1024                 files
Currently open files: 971

/usr/lib/jvm/java-6-sun/bin/java-jar/opt/glassfishv3/glassfish/bin/../modules/admin-cli.jarstart-domaindomain1
Limit                     Soft Limit           Hard Limit           Units
Max open files            1024                 1024                 files
Currently open files: 55


Não sei mais o que posso fazer para solucionar isso, alguém tem alguma ideia?

evefuji

Faltou dizer uma coisa, se eu reinicio o glassfish como serviço durante o boot, é que o limite está 1024. Se eu inicio depois do boot (manualmente), ele fica com o limite do ulimit. Como posso fazer para ele iniciar como serviço durante o boot com esse limite, ou esperar o limite estar atualizado para inicializar?

zekkerj

evefuji, esse limite deve ter sido hardcoded no script de inicialização. Se vc se vira com shell script, vale dar uma olhada no código.
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

evefuji

#3
Citação de: zekkerj online 19 de Outubro de 2011, 21:56
evefuji, esse limite deve ter sido hardcoded no script de inicialização. Se vc se vira com shell script, vale dar uma olhada no código.
não consegui encontrar isso nos scripts de inicialização, mas no script de inicialização do glassfish coloquei as seguintes instruções:


ulimit -Hn 65536
ulimit -Hn 65536



E agora não está mais dando esse problema.  (nao gosto de hardcode, mas foi a solução que encontrei)

Aproveitando o tópico, estou tendo problema de memória disponível quando eu rodo o vacuum do postgres, alguém aqui conhece o parâmetro que limita a memória do vacuum do postgre 8.4 (não tenho certeza se é vacuum_mem), ou alguma forma de aumentar a memória virtual sem reparticionar o disco?

zekkerj

Citaralguma forma de aumentar a memória virtual sem reparticionar o disco?

vc pode criar um arquivo contíguo ("dd if=/dev/zero of=arquivo.swp bs=1M count=<tamanho desejado da memória em MiB>"), depois usá-lo como memória swap.

mkswap arquivo.swp
sudo swapon arquivo.swp


Este último comando tem que ser reexecutado a cada boot.
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

evefuji

Citação de: zekkerj online 22 de Outubro de 2011, 14:20
Citaralguma forma de aumentar a memória virtual sem reparticionar o disco?

vc pode criar um arquivo contíguo ("dd if=/dev/zero of=arquivo.swp bs=1M count=<tamanho desejado da memória em MiB>"), depois usá-lo como memória swap.

mkswap arquivo.swp
sudo swapon arquivo.swp


Este último comando tem que ser reexecutado a cada boot.
obrigado, acredito que deu certinho, estou testando aqui qualquer coisa aviso.

thanks

zekkerj

O comando "free -m" pode confirmar pra você se resolveu ou não.
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D