Respostas:
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:
rmcomando fornece o unlink()syscallunlink()chamadaunlink()chamada no lado remotounlink()chamada do seu originalrmrm itera para o próximo arquivo, vá para 1Agora, 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:
mv -vf oldfilms oldfilms-)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:
lstat()syscall),unlink(), no caso de diretórios opendir(), excluindo todos os arquivos / diretórios nele recursivamente e closedir(), finalmente, finalmente rmdir().readdir()chamada.Isso requer 3 comandos RPC nfs para arquivos e 3 adicionais para diretórios.
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
-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.