VFS: limite máx. do arquivo 1231582 atingido

5

Estou executando um kernel Linux 2.6.36 e estou vendo alguns erros aleatórios. Coisas como

ls: error while loading shared libraries: libpthread.so.0: cannot open shared object file: Error 23

Sim, meu sistema não pode executar consistentemente um comando 'ls'. : (

Eu notei vários erros na minha saída do dmesg:

# dmesg | tail
[2808967.543203] EXT4-fs (sda3): re-mounted. Opts: (null)
[2837776.220605] xv[14450] general protection ip:7f20c20c6ac6 sp:7fff3641b368 error:0 in libpng14.so.14.4.0[7f20c20a9000+29000]
[4931344.685302] EXT4-fs (md16): re-mounted. Opts: (null)
[4982666.631444] VFS: file-max limit 1231582 reached
[4982666.764240] VFS: file-max limit 1231582 reached
[4982767.360574] VFS: file-max limit 1231582 reached
[4982901.904628] VFS: file-max limit 1231582 reached
[4982964.930556] VFS: file-max limit 1231582 reached
[4982966.352170] VFS: file-max limit 1231582 reached
[4982966.649195] top[31095]: segfault at 14 ip 00007fd6ace42700 sp 00007fff20746530 error 6 in libproc-3.2.8.so[7fd6ace3b000+e000]

Obviamente, os erros file-max parecem suspeitos, sendo agrupados e recentes.

# cat /proc/sys/fs/file-max
1231582
# cat /proc/sys/fs/file-nr
1231712 0       1231582

Isso também parece um pouco estranho para mim, mas a questão é que não há como ter 1.2 milhões de arquivos abertos neste sistema. Eu sou o único a usá-lo e não é visível para ninguém fora da rede local.

# lsof | wc
  16046  148253 1882901
# ps -ef | wc 
    574    6104   44260

Eu vi alguma documentação dizendo:

file-max & file-nr:

The kernel allocates file handles dynamically, but as yet it doesn't free them again.

The value in file-max denotes the maximum number of file- handles that the Linux kernel will allocate. When you get lots of error messages about running out of file handles, you might want to increase this limit.

Historically, the three values in file-nr denoted the number of allocated file handles, the number of allocated but unused file handles, and the maximum number of file handles. Linux 2.6 always reports 0 as the number of free file handles -- this is not an error, it just means that the number of allocated file handles exactly matches the number of used file handles.

Attempts to allocate more file descriptors than file-max are reported with printk, look for "VFS: file-max limit reached".

Minha primeira leitura é que o kernel basicamente tem um vazamento de descritor de arquivo embutido, mas eu acho isso muito difícil de acreditar. Isso implicaria que qualquer sistema em uso ativo precisa ser reinicializado de vez em quando para liberar os descritores de arquivo. Como eu disse, não posso acreditar que isso seja verdade, já que é normal para mim ter sistemas Linux permanecendo por meses (até anos) de cada vez. Por outro lado, também não consigo acreditar que meu sistema quase inativo esteja mantendo mais de um milhão de arquivos abertos.

Alguém tem alguma ideia, seja para correções ou diagnóstico adicional? Eu poderia, é claro, apenas reinicializar o sistema, mas não quero que isso seja um problema recorrente a cada poucas semanas. Como uma medida paliativa, eu abandonei o Firefox, que era responsável por quase 2000 linhas de saída lsof (!), Embora eu tivesse apenas uma janela aberta, e agora eu posso rodar 'ls' novamente, mas duvido que isso consertará problema por muito tempo. (editar: Ops, falou cedo demais. Quando terminei de digitar essa pergunta, o sintoma estava de volta)

Agradecemos antecipadamente por qualquer ajuda.

E outra atualização: meu sistema era basicamente inutilizável, então decidi que não tinha outra opção a não ser reiniciar. Mas antes disso, saí cuidadosamente de um processo de cada vez, verificando /proc/sys/fs/file-nr após cada término. Descobri que, previsivelmente, o número de arquivos abertos diminuiu gradualmente quando fechei as coisas. Infelizmente, não foi um grande efeito. Sim, consegui limpar 5000 a 10000 arquivos abertos, mas ainda havia mais de 1,2 milhão. Eu desliguei quase tudo. Todos os shells interativos, exceto pelo ssh que eu deixei aberto para terminar de fechar, httpd, até mesmo serviço nfs. Basicamente tudo na tabela de processos que não era um processo do kernel, e ainda havia um número terrível de arquivos aparentemente deixados em aberto.

Após a reinicialização, descobri que /proc/sys/fs/file-nr mostrou cerca de 2000 arquivos abertos, o que é muito mais razoável. Iniciar duas sessões de Xvnc como de costume, juntamente com as dezenas de janelas de monitoramento que eu gosto de manter abertas, elevaram o total para cerca de 4000 arquivos. Não vejo nada de errado com isso, é claro, mas obviamente não identifiquei a causa raiz.

Ainda estou procurando ideias, pois definitivamente espero que isso aconteça novamente.

E outra atualização, no dia seguinte:

Eu observei o sistema cuidadosamente e descobri que /proc/sys/fs/file-nr apresentou um crescimento de cerca de 900 arquivos abertos por hora. Fechei o único cliente NFS do sistema durante a noite e o crescimento parou. Lembre-se, não liberou os recursos, mas pelo menos deixou de consumir mais. Esse é um bug conhecido com o NFS? Eu vou estar trazendo o cliente NFS de volta online hoje, e vou reduzi-lo ainda mais.

Se alguém estiver familiarizado com esse comportamento, sinta-se à vontade para entrar com "Sim, o NFS4 tem esse problema, volte para o NFS3" ou algo assim.

    
por Rick Koshi 13.02.2011 / 21:42

3 respostas

6

Após um pouco mais de testes, acredito que isso seja um bug do servidor NFS. Quando um processo em um cliente NFS coloca um bloqueio de gravação em um arquivo, o servidor reserva um identificador de arquivo aberto (essa pode ser a terminologia incorreta - minhas desculpas a qualquer guru do kernel que esteja lendo isso). Isso provavelmente seria OK se o servidor liberasse o identificador quando o bloqueio fosse liberado, mas aparentemente não funciona.

Meu problema original ocorreu com o rrdtool. O rrdtool abre um arquivo para leitura / gravação, bloqueia o arquivo para gravação, faz suas alterações e sai. Cada vez que eu executo o rrdtool, o número de arquivos abertos no servidor aumenta em um. (Detalhe de Nitpicky - o servidor realmente aloca em blocos de 32, então é mais como "32 execuções fazem 32 descritores de arquivos abertos", mas isso é um detalhe insignificante a longo prazo)

Eu escrevi um programa de teste mínimo para verificar esse comportamento. De fato, abrir o arquivo, bloqueá-lo e sair é suficiente para acionar isso. Liberar explicitamente a trava antes de sair não ajuda de forma alguma. Abrir o arquivo sem bloqueá-lo não acionará o problema.

Até agora, ainda não encontrei uma maneira de liberar os recursos no servidor, além da reinicialização. Reiniciar o serviço NFS é insuficiente, como mencionado acima.

Ainda não testei a versão 3 do NFS. Talvez funcione melhor.

De qualquer forma, obrigado por tentar. Espero que minhas experiências possam ajudar alguém no futuro.

Uma última atualização: J. Bruce Fields, um dos desenvolvedores do NFSv4, confirmou que este é um bug, e diz que é limitado ao NFSv4. Aparentemente, fui o primeiro a denunciá-lo. Ele espera ter um patch em breve.

Lembre-se, kids: Quando você encontrar um bug, encontre o local adequado para denunciá-lo e há uma boa chance de que ele seja consertado. Viva o código aberto. : -)

    
por 28.02.2011 / 16:14
0

I shut down the system's only NFS client for the night, and the growth stopped. Mind you, it didn't free up the resources, but it did at least stop consuming more.

Veja Uso de NFS considerado prejudicial , especificamente o ponto III.B. Quando o seu cliente NFS fica indisponível, seus bloqueios não são liberados, portanto a quantidade de arquivos abertos não diminui. Se você chutar o servidor NFS (ou, mais precisamente, o daemon de bloqueio), verá a diminuição da contagem de arquivos abertos.

Acho que você pode atribuir com segurança o problema a qualquer coisa que o cliente NFS esteja fazendo, o que você não declarou na pergunta acima, até onde eu posso ver.

Os erros error loading shared libraries são porque você atingiu o número máximo de arquivos que podem ser abertos; quando você executa ls , o kernel tenta abrir uma biblioteca ls está dinamicamente ligada com; Obviamente, isso falha quando você está no limite máximo de arquivos abertos para esse sistema de arquivos, daí o erro.

Algo que seu cliente está fazendo é abrir 900 arquivos por hora. Não é um Mac rodando o Spotlight na exportação do NFS, é?

    
por 27.02.2011 / 19:19
0

Estou tendo os mesmos problemas. Cluster de servidores HA instalado que usamos como armazenamento de rede central. Neste cluster DRBD, o servidor NFS4 está em execução.

A cada hora, geramos milhares de pequenos arquivos de dados e os armazenamos neste servidor NFS4.

A partir do momento em que iniciamos o servidor NFS4, demora cerca de 30 dias até que o fs.file-nr atinja o limite de 1,2 mil arquivos e, em 24 horas, todas as máquinas falhem ..

Só agora, duas horas depois de a máquina de backup HA ter assumido o controle após a falha, ela é exibida

fs.file-nr = 19552 0 488906

aumentando em +3000 em 20 minutos.

A máquina de backup HA estava em espera por 30 dias e tinha 580 0 488906 o tempo todo. A única coisa que mudou foi que o servidor NFS4 foi iniciado.

Eu ficaria muito feliz se houvesse uma solução para isso ...

Estou executando o MDV 2010 com o kernel RC3 2.6.37 RC3 personalizado compilado

    
por 06.03.2011 / 17:36

Tags