작업을 수행하기 전에 디렉토리가 있는 시스템에 로그인하는 것과 NFS를 통해 디렉토리에 로그인하는 것 rm -rf
사이 에 시간에 큰 차이가 있습니까?rm -rf
답변1
물론 SSH가 더 좋습니다.
Nfs는 다양한 원격 프로시저 호출 및 데이터 동기화 대기 시간이 포함된 복잡한 네트워크 프로토콜을 사용합니다. SSH의 경우 이는 적용되지 않습니다.
그 외에도 자물쇠가 많이 있습니다. nfs의 파일 삭제는 다음과 같이 작동합니다.
- 귀하의
rm
명령은unlink()
시스템 호출을 제공합니다 - nfs 드라이버는 이를 sunrpc 요청으로 변환하여 nfs 서버로 보냅니다.
- nfs 서버는 이 sunrpc 요청을
unlink()
호출 로 다시 변환합니다. unlink()
원격 측에서 이 호출을 실행합니다.- 성공 후 "Okay, done"에 해당하는 RPC 응답 메시지를 클라이언트에 반환합니다.
- 클라이언트의 커널 드라이버는 이를
unlink()
원래 호출의 종료 코드 0 으로 다시 변환합니다.rm
rm
다음 파일로 반복하고 1로 이동
이제 중요한 것은 다음과 같습니다.오후 2시~7시 사이에 rm
기다려야 합니다 . 다음 unlink()
호출을 비동기적으로 보낼 수 있지만 단일 스레드이며 이벤트 지향 도구가 아닙니다. 가능하더라도 여전히 까다로운 nfs 마운트 플래그가 필요합니다. 결과가 나오지 않을 때까지 기다립니다.
Nfs와 모든 네트워크 파일 시스템은 항상 훨씬 느립니다.
대부분의 경우 다음 트릭을 사용하면 재귀 삭제를 거의 무한대로 빠르게 수행할 수 있습니다.
- 먼저 디렉터리를 다른 이름(
mv -vf oldfilms oldfilms-
) 으로 이동합니다. - 백그라운드에서 삭제(
rm -rf oldfilms- &
)
전부는 아니지만 여러 면에서 이 디렉터리 삭제는 거의 0번에 발생한 것처럼 보입니다.
확장하다:@el.pascado가 그의 훌륭한 댓글에서 언급했듯이 실제로 2-7을 실행해야 합니다.3배모든 파일의 경우:
- 파일인지 디렉토리인지 확인(
lstat()
시스템 호출 사용) - 그런 다음 적절한 일을 하십시오. 일반 파일
unlink()
및 디렉토리의 경우opendir()
해당 안의 모든 파일/디렉터리를 반복적으로 삭제한 다음closedir()
마지막으로 을 삭제합니다rmdir()
. readdir()
마지막으로 호출하여 다음 디렉토리 항목으로 반복합니다.
파일에는 3개의 nfs RPC 명령이 필요하고 디렉터리에는 3개의 추가 명령이 필요합니다.
답변2
예. 아마도. 때에 따라 다르지. 적은 수의 파일과 디렉토리의 경우 큰 차이가 없습니다.
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