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:
rm
comando fornece o unlink()
syscallunlink()
chamadaunlink()
chamada no lado remotounlink()
chamada do seu originalrm
rm
itera para o próximo arquivo, vá para 1Agora, o importante é: entre 2-7, rm
tem 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
-r
sinalizador,rm
primeiro é necessário verificar se o arquivo é um diretório (lstat
via nfs), abri-lo (opendir
via nfs), ler seu conteúdo (readdir
via 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 (closedir
via nfs) e repita para cada diretório encontrado.