Como determinar quais processos têm mais inodes abertos

4

Aqui está o meu problema, visível em um gráfico munin:

Meusinodesusados/abertosestão"subitamente" aumentando constantemente.

Existe uma maneira de determinar qual processo está mantendo os inodes atualmente abertos? Eu usei a abordagem do link e encontrei e limpei algumas pastas com e-mails e logs eu poderia me livrar de ... Ainda assim, se os inodes estão ABERTOS, deve haver algum processo que os mantenha em uso, certo? Pode não ser necessariamente a pasta com a maioria dos arquivos de onde o aumento está vindo - ou estou errado lá?

Por isso, gostaria de ver quem está mantendo-os abertos e, em seguida, acompanhe o uso para ver de onde o aumento está vindo

Atualizar

Baseado no script de Andrew, criei uma versão dele que também mostra o nome do processo. Como tenho alguns processos nginx / apache em execução que podem reaparecer, gostaria de ver os resultados no nome do processo.

for dir in /proc/*/fd;
do
    echo -n "$dir ";
    pid='expr "$dir" : '\/proc\/\(.*\)\/.*''; # extract the pid
    pname='ps -p $pid -o comm='; # grab process name
    echo -n "$pname ";
    ls $dir 2>/dev/null | wc -l;
done | sort -n -k 3

Exemplo de saída:

/proc/4612/fd sshd 49
/proc/46470/fd node 60
/proc/5655/fd nginx 66
/proc/6656/fd nginx 76
/proc/7654/fd nginx 81
/proc/8578/fd dovecot 107
/proc/9657/fd nginx 117
/proc/3495/fd java 146
/proc/4785/fd mysqld 382

Assim, o próximo teste seria registrar a distribuição ao longo do tempo para ver quais mudanças e como ela se correlaciona com o número de / proc / sys / fs / inode-nr que Morgan mencionou

Um ano depois ...

Algum tempo se passou, aqui está um novo gráfico

E adivinhe, o final de setembro é o ponto em que uma unidade defeituosa foi substituída. Então parece que toda a bagunça foi gerada por um erro de disco. No entanto, os scripts ainda são úteis!

    
por Xosofox 21.07.2015 / 23:43

4 respostas

2

Conte o número de entradas em cada diretório /proc/[PID]/fd . Isso fornecerá o número de descritores de arquivos que cada processo abriu. Embora demore um pouco para enumerar todos os processos, a falta de processos que iniciam ou param enquanto sua contagem está em andamento não deve ser um problema, pois você está procurando por um processo de longa duração com muitos descritores de arquivos abertos.

Algo parecido com isto:

for dir in /proc/*/fd;
do
    echo -n "$dir "; #need a space to get real columns for the sort
    ls $dir 2>/dev/null | wc -l;
done | sort -n -k 2

As últimas linhas de saída mostrarão o diretório / proc / [PID] / fd com uma contagem de descritores de arquivos abertos para cada processo. O processo culpado deve estar lá perto do fundo.

Note que cada entrada em / proc / [PID] / fd é tecnicamente um descritor de arquivo e não um inode aberto separado, cada inode aberto separado deve ter pelo menos um descritor de arquivo separado em um / proc / [PID] / fd diretório em algum lugar.

    
por 22.07.2015 / 00:15
1

Eu acho que a questão aqui é, em parte, o que significa munin "inodes abertos". Minha instalação padrão do munin tem dois plugins para obter o número de inodes alocados:

"/ etc / munin / plugins / open_inodes" que obtém a métrica de inode de "/ proc / sys / fs / inode-nr"

e

"/ etc / munin / plugins / df_inode", que obtém a métrica da saída de "df -i".

Esses números são um reflexo dos arquivos existentes e não o número de arquivos / inodes em uso por todos os processos no sistema.

Por exemplo, este script cria dez arquivos e depois que ele termina, podemos ver o aumento na alocação de inode em "df -i" e inode-nr.

    #!/usr/bin/python

    f0 = open("foo0", "w")
    f1 = open("foo1", "w")
    f2 = open("foo2", "w")
    f3 = open("foo3", "w")
    f4 = open("foo4", "w")
    f5 = open("foo5", "w")
    f6 = open("foo6", "w")
    f7 = open("foo7", "w")
    f8 = open("foo8", "w")
    f9 = open("foo9", "w")

No entanto, se eu ajustar isso para evitar que o programa termine (e os arquivos já existam) ... os arquivos serão deixados "abertos" e "em uso" pelo processo.

    #!/usr/bin/python

    import time

    f0 = open("foo0", "w")
    f1 = open("foo1", "w")
    f2 = open("foo2", "w")
    f3 = open("foo3", "w")
    f4 = open("foo4", "w")
    f5 = open("foo5", "w")
    f6 = open("foo6", "w")
    f7 = open("foo7", "w")
    f8 = open("foo8", "w")
    f9 = open("foo9", "w")

    time.sleep(600)

que podemos ver refletido na saída de "lsof -p PID"

COMMAND    PID   USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
...
open_some 6602 morgan    3w   REG  254,1        0 262198 /home/morgan/src/foo0
open_some 6602 morgan    4w   REG  254,1        0 262273 /home/morgan/src/foo1
open_some 6602 morgan    5w   REG  254,1        0 262284 /home/morgan/src/foo2
open_some 6602 morgan    6w   REG  254,1        0 262287 /home/morgan/src/foo3
open_some 6602 morgan    7w   REG  254,1        0 262289 /home/morgan/src/foo4
open_some 6602 morgan    8w   REG  254,1        0 262301 /home/morgan/src/foo5
open_some 6602 morgan    9w   REG  254,1        0 262302 /home/morgan/src/foo6
open_some 6602 morgan   10w   REG  254,1        0 262309 /home/morgan/src/foo7
open_some 6602 morgan   11w   REG  254,1        0 262457 /home/morgan/src/foo8
open_some 6602 morgan   12w   REG  254,1        0 268672 /home/morgan/src/foo9

Mas posso executar esse script "abrir e permanecer aberto" quantas vezes eu quiser, e isso não alterará os números em df / inode-nr.

Portanto, em resumo, munin está relatando o número de inodes alocados, não o número de todos os inodes em uso por todos os processos. Se, depois de excluir um grupo de arquivos, o gráfico munin não refletir os inodes do free'd, pode ser que o gráfico não tenha sido gerado novamente ou, no exemplo mostrado, a escala de tempo do gráfico seja muito longa para refletir um mudança súbita.

    
por 22.07.2015 / 05:37
0

Pode ser que, se foi por causa de arquivos de log, os inodes não foram liberados quando você os limpou. Tente reiniciar os serviços que tinham esses arquivos de log abertos ou você pode realmente eliminar os arquivos de log sem reiniciar fazendo echo "" > logfilenamegoeshere depois de fazer backup dos dados que deseja salvar do log.

    
por 22.07.2015 / 00:12
0

Encontrou um utilitário "fatrace" para "rastreio de acesso a arquivos" do autor postagem do blog disponível para download aqui . Ele exibirá todos os processos acessando quaisquer arquivos no sistema.

    
por 01.08.2015 / 00:47