Melhor usar o local executando rm -rf em vez de mais de nfs?


10

Faria muita diferença na hora de efetuar login na máquina que possui o diretório antes de executar um rm -rfno diretório ou apenas rm -rfno NFS?

Respostas:


11

Claro que o ssh é melhor.

O Nfs usa um protocolo de rede complexo com várias chamadas de procedimento remoto e tempos de espera para sincronização de dados. No caso do ssh, eles não se aplicam.

Além disso, existem muitos bloqueios. A exclusão do arquivo no nfs funciona desta maneira:

  1. seu rmcomando fornece o unlink()syscall
  2. O driver nfs o converte em uma solicitação sunrpc e envia para o servidor nfs
  3. O servidor nfs converte essa solicitação sunrpc novamente em uma unlink()chamada
  4. executa esta unlink()chamada no lado remoto
  5. depois de bem-sucedido, devolve a mensagem de resposta rpc equivalente a "tudo bem, está feito" ao cliente
  6. o driver do kernel do lado do cliente converte isso de volta no código de saída 0 da unlink()chamada do seu originalrm
  7. rm itera para o próximo arquivo, vá para 1

Agora, o importante é: entre 2-7, rmtem que esperar. Pode enviar a próxima unlink()chamada de forma assíncrona, mas é uma ferramenta de thread único e não orientada a eventos. Mesmo que pudesse, ainda seria necessário sinalizadores de montagem de nfs complicados. Até que não obtenha o resultado, aguarda.

Nfs - e qualquer sistema de arquivos de rede - é sempre muito mais lento.


Em muitos casos, você pode fazer exclusões recursivas com velocidade quase infinita com um truque:

  1. Primeiro, mova o diretório para um nome diferente ( mv -vf oldfilms oldfilms-)
  2. Excluir em segundo plano ( rm -rf oldfilms- &)

Sob muitos aspectos (mas não todos), essa remoção de diretório parecerá como se tivesse acontecido praticamente em tempo zero.


Extensão: Como o @ el.pascado menciona em seu excelente comentário, na verdade, o 2-7 precisa executar 3x para qualquer arquivo:

  • para determinar se é um arquivo ou um diretório (com um lstat()syscall),
  • então faça de acordo. Nos casos de arquivos comuns unlink(), no caso de diretórios opendir(), excluindo todos os arquivos / diretórios nele recursivamente e closedir(), finalmente, finalmente rmdir().
  • finalmente, itere para a próxima entrada do diretório com uma readdir()chamada.

Isso requer 3 comandos RPC nfs para arquivos e 3 adicionais para diretórios.


2
O caso NFS é ainda pior. Como a pergunta menciona o -rsinalizador, rmprimeiro é necessário verificar se o arquivo é um diretório ( lstatvia nfs), abri-lo ( opendirvia nfs), ler seu conteúdo ( readdirvia nfs) e somente executar a exclusão real, conforme descrito na resposta em todos os arquivos encontrados dentro e recorrendo a subdiretórios, feche o diretório ( closedirvia nfs) e repita para cada diretório encontrado.
el.pescado

5

Sim. Bem, talvez. Depende. Para um pequeno número de arquivos e diretórios, não faria muita diferença.

A operação do arquivo em massa em um diretório montado pelo NFS é lenta. Se você tiver a oportunidade de efetuar login no próprio servidor NFS e fazê-lo no diretório real, isso será mais rápido.

Vamos testá-lo removendo a coleção de portas do OpenBSD que fiz check-out do CVS e montei no NFS:

No servidor NFS:

$ cd /export/shared/ports

$ du -hs .
2.6G    .

$ find . | wc -l
  179688

$ time rm -rf /export/shared/ports/*
0m20.87s real     0m00.12s user     0m04.62s system

No cliente (após restaurar os arquivos originais do backup):

$ time rm -rf /usr/ports/*
6m49.73s real     0m01.55s user     1m08.96s system
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.