NFS에 많은 파일이 포함된 디렉터리가 있다는 것을 알았습니다.
ls *
그런 다음 Ctrl-C를 누르십시오. ls가 다시 표시되는 데는 약간의 시간(예: 20초)이 걸릴 수 있습니다.
왜? ls 명령을 수정하여 응답성을 높일 수 있습니까?
답변1
를 실행할 때 ls *
가장 먼저 일어나는 일은 쉘이 현재 디렉토리 목록을 얻는 것입니다. 디렉토리가 크고 서버가 느린 경우 시간이 걸릴 수 있습니다.
쉘이 현재 디렉토리에 파일 이름 목록을 갖고 있으면 목록을 정렬한 다음(네트워크 상호 작용에 비해 매우 빠릅니다) ls
이 ls
명령은 각 파일을 차례로 찾아 해당 메타데이터를 검색합니다(stat
호출됨) 파일이 디렉터리인지 확인하기 위해 파일이 디렉터리인 경우 ls
디렉터리 자체가 아닌 해당 내용을 나열합니다.
Ctrl+ 를 누르면 C현재 NFS 작업이 중단되지 않습니다. 시스템이 일관되지 않은 상태가 될 수 있으므로 어디서든 파일 시스템 작업을 중단할 수 없습니다. 파일을 읽어도 액세스 시간이 업데이트될 수 있습니다. 대부분의 경우 파일에 대한 기본적인 읽기 또는 쓰기 작업은 인간의 기준에 따라 즉각적으로 이루어지지만 NFS는 예외이며 특히 느린 네트워크를 통해 대량의 데이터를 전송할 때 더욱 그렇습니다.
따라서 Ctrl+를 누르면 C다음과 같은 효과만 적용됩니다.
- 쉘이 현재 파일 이름 목록을 생성 중인 경우 목록이 완전히 검색되면;
ls
서버가 메타데이터를 제공할 때 서버가 시작되어 현재 파일에 대한 메타데이터를 가져오는 경우입니다.- 가 시작되어 현재 디렉토리를 나열하고 있는 경우
ls
목록이 완전히 검색되었거나 적어도 그 일부 이후에 검색되었습니다.
이는 명령의 오류가 아닙니다 ls
(명령이 아직 시작되지 않았을 수도 있음). 쉘의 잘못도 아니고 NFS의 잘못입니다. NFS는 상당히 느립니다.
답변2
가설: NFS를 통해 디렉터리를 탐색하면 예상보다 더 많은 데이터를 한 번에 로드할 수 있습니다. 과도한 서버 측 IO로 인해 단일 NFS 호출에 20초 이상이 소요됩니다. 마운트 intr
옵션을 사용하면 Ctrl-C가 진행 중인 호출을 중단할 수 있습니다.
Google은 READDIRPLUS가 포함된 NFS 호출 목록을 발견했습니다. 기본적으로 readdir + 각 파일에 대한 stat입니다. getacl도 있습니다. 즉, 기본적으로 ls -l
(특정 개수의 파일에 대해) 이 작업을 수행하는 NFS 호출이 있습니다. 각 파일에 대해 별도의 통계 요청을 보내는 대신.
nfs readdirplus용 Google - 이는 합리적인 것 같습니다. 첫 번째 결과는 (유료) 버그 보고서입니다.
RHEL6: NFSv3 READDIRPLUS는 NFS 디렉토리의 글로빙 속도를 크게 저하시켜 성능 문제를 일으킵니다.
- 표준 마운트 RHEL 6.2를 사용하면 3000개 이상의 디렉터리가 포함된 디렉터리에서 glob을 수행하는 데 218초(거의 4분)가 걸립니다.
- readdirplus 호출을 비활성화하기 위해 nordirplus 옵션을 사용하여 동일한 디렉터리를 마운트하면 동일한 디렉터리의 glob은 1.7초만 소요됩니다.
그래서 이것은 조사하기에 흥미로운 방향처럼 보였습니다.
편집: 귀하의 예에서는 ls *
와일드카드도 사용합니다. ls .
글로벌은 피하겠습니다. 이것이 특정 문제에 영향을 미치는 경우 ls가 아닌 쉘에서 와일드카드가 발생하기 때문일 수 있으며 이는 Ctrl-C 처리 방법에 영향을 미칠 수 있습니다. 그것이 중요한지는 의심스럽지만 흥미로운 질문이라고 생각합니다.
답변3
ls
NFS 디렉터리에서 이 명령이 느리게 실행되는 데에는 여러 가지 이유가 있을 수 있습니다.
- 디렉터리가 자동으로 마운트되지 않을 수 있습니다.
- 이러한 컴퓨터는 동일한 네트워크에 있지 않을 수 있습니다.
그러나 이는 구체적인 개념이라기보다는 일반적인 개념이다.네트워크 파일 시스템. 정렬하지 않고 파일을 나열하려면 정렬하지 않고 파일을 나열해 보세요 ls -U
. 매뉴얼 페이지 ls
에서
-U 항목을 디렉토리 순서로 정렬하지 않습니다. one_per_line 형식 "-1"과 함께 사용하면 파일을 즉시 표시하며 메모리 제한이 없습니다.
정렬을 피하기 위한 몇 가지 변형이 있습니다. 시스템의 매뉴얼 페이지를 확인하고 다음 옵션 중 하나를 시도해 볼 수 있습니다.
ls -f
ls -U
ls --sort=none
답변4
속도 저하를 유발할 수 있는 ls 별칭이 있는 경우 \ls 또는 \ls -altr 또는 ls에 대한 다른 옵션을 사용해 보세요.