답변:
물론 ssh가 더 좋습니다.
Nfs는 다양한 원격 프로 시저 호출 및 데이터 동기화 대기 시간과 함께 복잡한 네트워크 프로토콜을 사용합니다. ssh의 경우에는 적용되지 않습니다.
또한 많은 잠금 장치가 있습니다. nfs에서 파일 삭제는 다음과 같은 방식으로 작동합니다.
rm명령은 unlink()syscall을 제공합니다unlink()호출 로 변환합니다unlink()호출을 원격에서 실행unlink()원래 호출의 종료 코드 0으로 다시 변환합니다.rmrm 다음 파일로 반복, goto 1이제 중요한 것은 : 2-7 사이, rm기다려야합니다. 다음 unlink()호출을 비동기식으로 보낼 수 있지만 이벤트 중심의 도구가 아닌 단일 스레드입니다. 가능하더라도 여전히 까다로운 nfs 마운트 플래그가 필요합니다. 결과를 얻지 못할 때까지 기다립니다.
Nfs 및 모든 네트워크 파일 시스템은 항상 훨씬 느립니다.
대부분의 경우 트릭을 사용하여 재귀 삭제를 준 무한 속도로 만들 수 있습니다.
mv -vf oldfilms oldfilms-)rm -rf oldfilms- &)많은 (전부는 아님) 측면에서이 디렉토리 제거는 마치 거의 제로에 발생한 것처럼 보입니다.
확장 : @ el.pascado가 그의 훌륭한 의견에서 언급했듯이 실제로 2-7은 모든 파일에 대해 3x 를 실행 해야합니다.
lstat()syscall 포함) 확인unlink()의 경우 디렉토리의 경우 opendir()모든 파일 / 디렉토리를 재귀 적으로 삭제 한 다음 closedir()마지막으로 rmdir().readdir()호출 을 통해 다음 디렉토리 항목으로 반복 하십시오.파일에는 3 개의 nfs RPC 명령이 필요하고 디렉토리에는 3 개의 추가 RPC 명령이 필요합니다.
예. 아마도 때에 따라 다르지. 적은 수의 파일과 디렉토리의 경우 큰 차이가 없습니다.
NFS 마운트 디렉토리에서 대량으로 파일 작업을 수행하는 속도가 느립니다. NFS 서버 자체에 로그인하여 실제 디렉토리에서 수행 할 수 있다면 더 빠를 것입니다.
CVS에서 체크 아웃하고 NFS를 통해 마운트 한 OpenBSD 포트 컬렉션을 제거하여 테스트 해 보겠습니다.
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
클라이언트에서 (백업에서 원본 파일을 복원 한 후) :
$ time rm -rf /usr/ports/*
6m49.73s real 0m01.55s user 1m08.96s system
-r플래그rm가 언급했듯이 먼저 파일이lstatnfs를 통해 디렉토리인지 확인하고 , nfs를 통해 파일을 열고opendir, 내용을 읽은 다음 (readdirnfs를 통해) 파일을 찾은 다음 내부 및 발견 된 모든 파일에 대한 답변에 설명 된대로 실제 삭제를 수행해야합니다 하위 디렉토리closedir로 되풀이 하여 디렉토리를 닫고 ( nfs를 통해) 찾은 모든 디렉토리에 대해 반복하십시오.