Como remover o diretório no sistema de arquivos NFS com um número enorme de arquivos

Como remover o diretório no sistema de arquivos NFS com um número enorme de arquivos

Um programa mal testado criou um diretório em um compartilhamento NFS com um número enorme de arquivos, que preciso remover.

ls -ald /home/foo
drwxrwxr-x 2 503 503 317582336 Jul 29 11:38 /home/foo

O diretório está localizado em uma montagem NFS de cerca de 600 GB em um dispositivo do tipo netapp. Atualmente, não tenho ideia de quantos arquivos existem nele, mas um diretório semelhante criado depois de apenas 10 minutos tem 121.000 arquivos, então provavelmente está na casa dos milhões em algum lugar. O sistema operacional é o kernel Linux 2.6.

Tentando encontrar uma maneira de listá-lo ou removê-lo e seu conteúdo. find /home/foo resulta em find morrendo após cerca de 1 hora, sem saída diferente de "./"

Responder1

(respondendo à minha própria pergunta caso alguém a encontre enquanto procura algo semelhante.) Existem possivelmente até 9 milhões de arquivos no diretório.

Infelizmente não é possível fazer login diretamente no servidor, é um aparelho. O único acesso aos sistemas de arquivos é via exportação.

rm -rf não pareceu funcionar. observando com atenção que estava pendurado.

encontrar não foi concluído, morreu sem erros.

ls -1 nunca pareceu ser concluído. (Percebo agora que ele tenta classificar os resultados, ls -1f pode ter funcionado eventualmente).

o que funcionou foi um simples trecho de Perl. Presumo que o código c faça o mesmo funcionaria.

 opendir( my $dh,  '/home/foo' ) or die $!
    while ( my $file = readdir $dh ) {
        print "$file\n";
    }

Responder2

Este tópico bastante antigo surgiu para mim no Google, então gostaria de compartilhar algumas estatísticas.

Aqui está uma comparação de três métodos diferentes para remover arquivos em um servidor NFS:

  1. simples:rm dir/*
  2. encontrar:find dir/ -type f -exec rm {} \;
  3. sincronizar novamente:tempdir=$( mktemp -d ); \ rsync -a --delete $tempdir/ dir/; \ rmdir $tempdir

Para comparar esses métodos, criei 10.000 arquivos cada vez que executei um teste com

for i in {1..10000} ; do touch $i ; done

Os resultados no gráfico mostram que o rsync é muito mais rápido e o find é o mais lento dos três métodos desempenho de diferentes métodos para remover vários arquivos, o rsync é mais rápido

Os resultados permanecem quando o número de arquivos é duplicado (não executei findem 20.000 arquivos), tempo médio de 3 execuções para 10.000 arquivos e 2 execuções para 20.000 arquivos.

        10000    20000
find     28.3       -
rm       12.9     23.9
rsync     6.94    12.2

É interessante ver de que mais depende o desempenho desses métodos.

Um relacionadopublicarneste site discute a exclusão de um grande número de arquivos em um sistema de arquivos ext3.

Responder3

Eu sugiro que você NÃO tente remover esses arquivos por NFS - Faça login diretamente no servidor de arquivos e exclua os arquivos lá. Isso será substancialmente menos abusivo para o servidor NFS (e para o cliente).

Além disso, use find (conforme descrito por MattBianco) ou use ls -1 | xargs rm -f(dentro desse diretório) se find estiver tendo problemas para concluir (o último deve funcionar bem no NFS, embora novamente eu recomende fazê-lo localmente).

Responder4

Isso parece um pouco óbvio, mas você já tentou:

rm -rf /home/foo/

? Caso contrário, existe uma maneira de usar um regex para obter um subconjunto pequeno o suficiente para entregar |xargs rm?

Se ls falhar, você pode tentar echo /home/foo/* | xargs rmfalhar com 'linha muito longa' ou algo semelhante. Ah, e apoio a recomendação de tentar fazer isso diretamente no servidor, em vez de no NFS.

informação relacionada