Processo que está ficando sem identificadores de arquivos abertos

0

Meu aplicativo que é baseado em dois processos Java que trocam dados por uma conexão http é executado em arquivos e produz esta mensagem de erro:

Aug 14 11:27:40 server sender[8301]: java.io.IOException: Too many open files
Aug 14 11:27:40 server sender[8301]: at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)
Aug 14 11:27:40 server sender[8301]: at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:422)
Aug 14 11:27:40 server sender[8301]: at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:250)
Aug 14 11:27:40 server sender[8301]: at org.apache.tomcat.util.net.NioEndpoint$Acceptor.run(NioEndpoint.java:455)
Aug 14 11:27:40 server sender[8301]: at java.lang.Thread.run(Thread.java:748)

Ambos os processos estão sob controle do SystemD. Eu verifiquei os processos usando cat /proc/5882/limits , os limites são definidos assim:

Limit                     Soft Limit           Hard Limit           Units
Max cpu time              unlimited            unlimited            seconds
Max file size             unlimited            unlimited            bytes
Max data size             unlimited            unlimited            bytes
Max stack size            8388608              unlimited            bytes
Max core file size        0                    unlimited            bytes
Max resident set          unlimited            unlimited            bytes
Max processes             63434                63434                processes
Max open files            4096                 4096                 files
Max locked memory         65536                65536                bytes
Max address space         unlimited            unlimited            bytes
Max file locks            unlimited            unlimited            locks
Max pending signals       63434                63434                signals
Max msgqueue size         819200               819200               bytes
Max nice priority         0                    0
Max realtime priority     0                    0
Max realtime timeout      unlimited            unlimited            us

Quando executo lsof | grep pid | wc -l , tenho menos de 2000 entradas (eu executo lsof dessa maneira por causa das informações recuperadas de Discrepância com o comando lsof ao tentar obter a contagem de arquivos abertos por processo )

Não faço a menor ideia do que posso verificar ou aumentar ainda mais.

    
por Marged 14.08.2018 / 15:38

1 resposta

1

A melhor maneira de saber quantos descritores de arquivos abertos seu processo tem é usar:

$ ls /proc/8301/fd/ | wc -l

(Assumindo o PID 8301, como em seu log.)

A execução de lsof percorrerá a árvore /proc inteira e tentará resolver os nomes de todos os arquivos (são pseudo-links simbólicos e precisam de uma chamada para cada link para resolução), portanto, executar lsof levará um muito tempo (dependendo do quão ocupada sua máquina é), então quando você olhar para o resultado, é possível que tudo já tenha mudado. Usar ls /proc/${pid}/fd/ será rápido (apenas uma chamada readdir), muito mais provável de capturar algo próximo da situação atual.

Em relação à solução do problema, você pode considerar aumentar o número de descritores de arquivos permitidos para o seu serviço, o que pode ser feito por definindo a diretiva LimitNOFILE= no seu arquivo unitário systemd.

    
por 15.08.2018 / 07:09