ext4는 파일을 큰 디렉토리와 개별적으로 하위 디렉토리에 넣습니다.

ext4는 파일을 큰 디렉토리와 개별적으로 하위 디렉토리에 넣습니다.

파일을 하위 폴더로 구성하면 모든 파일을 하나의 큰 디렉터리에 저장하는 것보다 ext4 파일 시스템에서 읽기 액세스 성능이 향상됩니까?

현재 우리는 600,000개의 파일(각각 3-10MB)을 포함하는 대규모 디렉토리를 보유하고 있습니다. 이러한 파일을 각각 5K 파일이 포함된 하위 폴더로 구성하면 성능이 향상됩니까?

그러한 벤치마크를 수행하기 위한 몇 가지 도구를 제안해 주실 수 있나요?

추가 정보로, 우리는 이러한 파일을 전체 경로로 읽고 디렉터리에 새 파일을 쓰는 방식으로 사용합니다. 게다가, 우리는 이전 파일보다 새로 생성된 파일을 더 자주 읽습니다.

답변1

각 3~10MB

파일 크기는 중요하지 않습니다.

파일을 하위 폴더로 구성하면 모든 파일을 하나의 큰 디렉터리에 저장하는 것보다 ext4 파일 시스템에서 읽기 액세스 성능이 향상됩니까?

논리적으로 이는 "성능"이 의미하는 바에 따라 다릅니다.모두파일을 하위 디렉터리에 넣는 것은 더 나쁠 것입니다. 보려는 하위 디렉터리를 알고 해당 하위 디렉터리만 나열하면 더 빠를 수 있습니다.

흥미로운 경우는 이름으로만 파일에 액세스하면 되고 디렉터리 목록을 가져올 필요가 없는 경우입니다.

현재 우리는 600,000개의 파일(각각 3-10MB)을 포함하는 대규모 디렉토리를 보유하고 있습니다. 이러한 파일을 각각 5K 파일이 포함된 하위 폴더로 구성하면 성능이 향상됩니까?

다시 말하지만, 사용 패턴에 따라 다릅니다! 디렉토리를 거의 나열하지 않는 것처럼 보이므로 그 차이는 크지 않습니다.

디렉터리에서 파일을 가져오는 작업은 대략 다음과 같습니다.

  1. /path/to/file경로는 구성요소( -> path, to, file) 로 분류됩니다.
  2. 각 디렉토리에 대해 포함하는 디렉토리의 색인을 요청해야 합니다(따라서 보려면 의 색인을 봐야 하고, to가져오려면 의 색인을 봐야 합니다. 올려다보았다.topathfilefiletotopath

분명히 경로가 깊을수록 더 많은 검색이 필요하므로 시간이 좀 걸립니다.

문제는 -files 색인에서 항목을 조회하는 것이 N색인에서 두 번 연속 조회를 수행하는 것보다 시간이 더 걸리나요 sqrt(N)? (따라서 이 경우 N파일을 sqrt(N)디렉토리 에 넣고 sqrt(N)각 디렉토리에 대한 항목이 있습니다.)

내 대답은 아니오 야. Ext4 사용B-트리이는 디렉토리 항목 조회의 최적화된 구현이 log[N]첫 번째 경우 시간이 걸리고 2·log[sqrt(N)] = 2·log[N^(1/2)] = 2·(1/2)·log[N] = log[N]점근적임을 의미합니다.

물론 쭉 살펴보세요하나데이터 구조는 일반적으로많은특히 "더 깊은" 디렉터리의 인덱스를 읽기 위해 저장소로 돌아갈 필요가 전혀 없다는 점을 보장하는 경우 데이터 지역성 측면에서 바람직합니다. 따라서 하나의 큰 디렉터리는 조회 시간 측면에서 여러 작은 디렉터리보다 성능이 뛰어납니다.

이것이 중요합니까? 나는 그것을 의심한다. 600,000개의 파일은 많지 않습니다.

하지만, 애플리케이션이 스마트하다면 상황은 다릅니다. 모든 디렉토리 설명자를 한 번만 열고(나중에 사용하기 위해 openat) 해당 구조를 애플리케이션에 유지한다면 물론회의더 작은 지수를 연구하는 것만으로도 이점을 얻을 수 있습니다. 파일을 확실히 다시 읽을 것이라는 점을 알고 있다면 파일 설명자를 열어두고 일종의 내부 테이블에 잠시 동안 저장하는 것이 현명할 수 있습니다. 이것중요한open소요된 시간의 일부는 디렉터리 검색이 아니라 close사용자와 파일 사이에 발생하는 컨텍스트 전환에 있을 수 있습니다.

답변2

그것은극도로디렉토리에 수백 개 이상의 파일을 두는 것은 현명하지 않습니다.

  • 중단 등으로 인해 파일 시스템 오류가 발생할 수 있습니다.모두파일에 일시적 또는 영구적으로 액세스할 수 없습니다.
  • 파일 시스템 캐시는 미리 모든 항목으로 오염됩니다.
  • 모든 항목(목록 및 검색 작업 포함)을 생성하는 데 필요한 많은 양의 데이터와 커널 작업으로 인해 여러 작업이 완료되지 않습니다.

귀하의 사용 사례에 FS 스토리지가 필요한지 확실하지 않습니다. NoSQL을 포함한 데이터베이스를 고려할 수 있습니다.

관련 정보