Sabe aqueles problemas que ocorrem de tempos em tempos, você dá aquele “tapinha” no ambiente e tudo volta ao normal? Então, um dia resolvi parar para analisar e entender que raio de problema era esse.
Era uma vez um servidor de arquivos com mapeamento SMB… que de tempos em tempos tínhamos uma diferença interessante entre o que era apresentado na saída do df e do du.
Vejam a diferença…
Bem, antes de continuar, temos que ter em mente a maneira como esses comandos fazem a leitura do disco e informam o espaço utilizado.
du - Summarize disk usage of each FILE, recursively for directories. df - This manual page documents the GNU version of df. df displays the amount of disk space available on the file system containing each file name argument. If no file name is given, the space available on all currently mounted file systems is shown. Disk space is shown in 1K blocks by default, unless the environment variable POSIXLY_CORRECT is set, in which case 512-byte blocks are used.
Obs.: Descrição obtida na man page de cada comando.
Tendo isso em mente, achei alguns materiais na internet que explicavam que uma possível causa de divergência ocorria no evento de deleção, caso esses arquivos ainda estivessem em uso por outro processo.
E executei o comando a seguir para validar esse teoria:
# lsof | grep ‘(deleted)’
É possível ver na última coluna que o lsof retornou que o status destes e muitos outros arquivos era de deletado.
Fui checar esses arquivos, mas não consegui nem chegar nos diretórios, nem era mais possível encontrá-los. Como assim “eles que não existiam mais”?
Isso mesmo, maaaaass eles ainda são blocos alocados por vários pids do SMB e que estão populando o disco de maneira desnecessária.
E como resolver sem interromper o ambiente e liberar em definitivo esses 7TB de diferença? Fácil, vamos encerrar esses pids.
Só que nessa brincadeira descobri que eram mais de 600 arquivos nessas condição, tudo bem que tem muito pid repetido e tal, mas confesso que sou preguiçosa e adoro montar umas linhas marotas no shell Linux para facilitar meu dia-a-dia. (apaixonada por um for hehe)
for i in `lsof | grep ‘(deleted)’ | grep discomontado | awk ‘{print $2}’ | sort -n | uniq`; do kill $i; done
E voilà… espaço liberado com sucesso.
Depois foi só manter isso na cron pra rodar de tempos e tempos e partir para outra atividade.
Vlw!