Melhor usar o rm-rf em vez de over nfs?

10

Será que faria muita diferença na hora de fazer o login na máquina que tem o diretório antes de fazer um rm -rf no diretório, ou apenas rm -rf do diretório sobre o NFS?

    
por steviekm3 31.08.2017 / 12:51

2 respostas

11

Claro que o ssh é o melhor.

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

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

  1. seu comando rm fornece o unlink() syscall
  2. O driver
  3. nfs o converte em uma solicitação sunrpc, envia para o servidor nfs
  4. O servidor nfs converte essa solicitação sunrpc de volta para uma unlink() call
  5. executa essa chamada unlink() no lado remoto
  6. após o sucesso, devolve a mensagem de resposta rpc equivalente a "tudo bem, é feito" para o cliente
  7. o driver do kernel do lado do cliente converte isso de volta para o código de saída 0 da chamada unlink() do seu original rm
  8. rm itera para o próximo arquivo, goto 1

Agora, o importante é: entre 2-7, rm tem que esperar. Ele poderia enviar a próxima unlink() de forma assíncrona, mas é uma ferramenta de thread único, não orientada a eventos. Mesmo que pudesse, ainda exigiria flags de montagem 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 de 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- & )

De muitos (mas não todos) aspectos, essa remoção de diretório parecerá que aconteceu em praticamente zero tempo.

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

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

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

    
por 31.08.2017 / 13:11
5

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

Executar a operação de arquivos em massa em um diretório montado pelo NFS é lento. Se você tiver a oportunidade de entrar no próprio servidor NFS e fazê-lo no diretório real, isso seria mais rápido.

Vamos testá-lo removendo a coleção de ports do OpenBSD que eu verifiquei no CVS e montei sobre o 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 (depois de restaurar os arquivos originais do backup):

$ time rm -rf /usr/ports/*
6m49.73s real     0m01.55s user     1m08.96s system
    
por 31.08.2017 / 13:17