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:
- seu comando
rmfornece ounlink()syscall
O driver - nfs o converte em uma solicitação sunrpc, envia para o servidor nfs
- O servidor nfs converte essa solicitação sunrpc de volta para uma
unlink()call - executa essa chamada
unlink()no lado remoto - após o sucesso, devolve a mensagem de resposta rpc equivalente a "tudo bem, é feito" para o cliente
- 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 originalrm -
rmitera 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:
- Primeiro mova o diretório para um nome diferente (
mv -vf oldfilms oldfilms-) - 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ãoclosedir(), finalmentermdir(). - 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.