많은 수의 파일이 있는 NFS 디렉토리에서 ls 명령이 그렇게 느리게 인터럽트되는 이유는 무엇입니까?

많은 수의 파일이 있는 NFS 디렉토리에서 ls 명령이 그렇게 느리게 인터럽트되는 이유는 무엇입니까?

NFS에 많은 파일이 포함된 디렉터리가 있다는 것을 알았습니다.

ls *

그런 다음 Ctrl-C를 누르십시오. ls가 다시 표시되는 데는 약간의 시간(예: 20초)이 걸릴 수 있습니다.

왜? ls 명령을 수정하여 응답성을 높일 수 있습니까?

답변1

를 실행할 때 ls *가장 먼저 일어나는 일은 쉘이 현재 디렉토리 목록을 얻는 것입니다. 디렉토리가 크고 서버가 느린 경우 시간이 걸릴 수 있습니다.

쉘이 현재 디렉토리에 파일 이름 목록을 갖고 있으면 목록을 정렬한 다음(네트워크 상호 작용에 비해 매우 빠릅니다) lsls명령은 각 파일을 차례로 찾아 해당 메타데이터를 검색합니다(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

lsNFS 디렉터리에서 이 명령이 느리게 실행되는 데에는 여러 가지 이유가 있을 수 있습니다.

  • 디렉터리가 자동으로 마운트되지 않을 수 있습니다.
  • 이러한 컴퓨터는 동일한 네트워크에 있지 않을 수 있습니다.

그러나 이는 구체적인 개념이라기보다는 일반적인 개념이다.네트워크 파일 시스템. 정렬하지 않고 파일을 나열하려면 정렬하지 않고 파일을 나열해 보세요 ls -U. 매뉴얼 페이지 ls에서

-U 항목을 디렉토리 순서로 정렬하지 않습니다. one_per_line 형식 "-1"과 함께 사용하면 파일을 즉시 표시하며 메모리 제한이 없습니다.

정렬을 피하기 위한 몇 가지 변형이 있습니다. 시스템의 매뉴얼 페이지를 확인하고 다음 옵션 중 하나를 시도해 볼 수 있습니다.

ls -f
ls -U
ls --sort=none

답변4

속도 저하를 유발할 수 있는 ls 별칭이 있는 경우 \ls 또는 \ls -altr 또는 ls에 대한 다른 옵션을 사용해 보세요.

관련 정보