단일 디렉토리에있는 파일 시스템 다수의 파일


29

크기는 크지 않지만 평균 크기가 30kb 인 약 60,000 개의 파일이 단일 디렉토리에 저장되는 것을 사용해야합니다 (이것은 요구 사항이므로 더 적은 수의 파일로 하위 디렉토리로 나눌 수는 없습니다).

파일은 무작위로 액세스되지만 일단 생성되면 동일한 파일 시스템에 대한 쓰기는 없습니다. 현재 Ext3을 사용하고 있지만 매우 느립니다. 어떤 제안?


3
왜 하나의 디렉토리에 있어야합니까?
Kyle Brandt

1
또한 xfs와 ext4가 충분히 개선되면 원래 질문에 대한 최신 답변에 관심이 있습니다.

답변:


15

XFS를 고려해야합니다. 파일 시스템과 디렉토리 레벨 모두에서 매우 많은 수의 파일을 지원하며 B + 트리 데이터 구조로 인해 많은 수의 항목에서도 성능이 상대적으로 일관되게 유지됩니다.

Wiki 에는 디자인을 자세히 설명하는 많은 논문과 출판물 대한 페이지 가 있습니다 . 시도해보고 현재 솔루션에 대해 벤치마킹하는 것이 좋습니다.


@nelaar의 답변 슬라이드에 따르면 ext4는이 작업에서 xfs보다 우수합니다.
mulllhausen

13

리눅스에서 10 억 개의 파일

이 기사의 저자는 파일 수가 많은 파일 시스템의 일부 성능 문제를 다루고 다양한 파일 시스템 ext3, ext4 및 XFS의 성능을 잘 비교합니다. 슬라이드 쇼로 제공됩니다. http://events.linuxfoundation.org/slides/2010/linuxcon2010_wheeler.pdf

mkfs를 실행할 시간 1M 50kb 파일 작성 시간 파일 시스템 복구 시간 1m 파일 제거


2
우리는 답변이 내용을 가리키는 포인터가 아닌 내용을 포함하는 것을 선호합니다. 이것이 이론적으로 질문에 대답 할 수 있지만 여기에 답의 핵심 부분을 포함시키고 참조 할 수있는 링크를 제공하는 것이 바람직 합니다.
user9517은 GoFundMonica를 지원합니다.

@Iain PDF를 다운로드하는 것만으로도 같은 정보를 얻을 수 있기를 바랍니다.
nelaaro


8

ext3의 디렉토리에있는 많은 파일은 자매 사이트 stackoverflow.com 에서 자세히 논의되었습니다.

내 생각에 ext3의 한 디렉토리에있는 60 000 개의 파일은 이상적이지 않지만 다른 요구 사항에 따라 충분할 수 있습니다.


5

승인. ReiserFS, XFS, JFS, Ext3 (dir_hash enabled) 및 Ext4dev (2.6.26 커널)를 사용하여 예비 테스트를 수행했습니다. 첫 인상은 모든 것이 충분히 빠르다는 것입니다. (비밀 한 워크 스테이션에서) 원격 프로덕션 시스템의 프로세서 속도가 상당히 느립니다.

초기 테스트에서도 ReiserFS에 이상한 점이 있었으므로 배제했습니다. JFS는 다른 모든 것보다 CPU 요구량이 33 % 적어서 원격 서버에서 테스트 할 것 같습니다. 성능이 충분하면 사용하겠습니다.


5

내 파일이 더 크지 만 많은 파일을 저장하는 응용 프로그램을 작성 중이며 여러 디렉토리에 걸쳐 분할 할 1000 만 개가 있습니다.

ext3은 주로 기본 "링크 된 목록"구현으로 인해 느립니다. 따라서 한 디렉토리에 많은 파일이 있으면 다른 디렉토리를 열거 나 만들 때 속도가 느려집니다. ext3에 사용할 수있는 htree 인덱스라는 것이 많이 있습니다. 그러나 파일 시스템 생성에서만 사용할 수 있습니다. 여기를 참조하십시오 : http://lonesysadmin.net/2007/08/17/use-dir_index-for-your-new-ext3-filesystems/

어쨌든 파일 시스템을 다시 빌드해야하고 ext3 제한으로 인해 ext4 (또는 XFS)를 사용하는 것이 좋습니다. 작은 파일 일수록 ext4가 조금 더 빠르며 재 구축이 더 빠르다고 생각합니다. 내가 아는 한 Htree 색인은 ext4에서 기본값입니다. JFS 또는 Reiser에 대한 경험이 없지만 사람들이 이전에 권장한다고 들었습니다.

실제로 여러 파일 시스템을 테스트했을 것입니다. ext4, xfs 및 jfs를 사용 해보고 어떤 것이 가장 우수한 성능을 발휘하는지 확인하십시오.

개발자가 응용 프로그램 코드에서 속도를 높일 수 있다고 말한 것은 "stat + open"호출이 아니라 "open + fstat"입니다. 첫 번째는 두 번째보다 상당히 느립니다. 그에 대한 통제력이나 영향력이 있는지 확실하지 않습니다.

stackoverflow에 대한 내 게시물을 참조하십시오. 리눅스에서 최대 천만 개의 파일을 저장하고 액세스하는 것은 매우 유용한 답변과 링크가 있습니다.


3

dir2index를 활성화하기 위해 tune2fs를 사용하면 도움이 될 수 있습니다. 활성화되어 있는지 확인하려면 :

sudo tune2fs -l /dev/sda1 | grep dir_index

활성화되어 있지 않은 경우 :

sudo umount /dev/sda1   
sudo tune2fs -O dir_index /dev/sad1
sudo e2fsck -D /dev/sda1
sudo mount /dev/sda1

그러나 나는 당신이 잘못된 길을 가고있을 것이라고 생각합니다 ... 평평한 색인을 생성하고 그에 따라 무작위로 선택하는 코드를 사용하는 이유는 무엇입니까? 그런 다음보다 최적화 된 트리 구조를 위해 하위 디렉토리를 사용할 수 있습니다.


1
이었다 /dev/sad1복사 / 파스타 오류를 방지하기 위해 의도적?
Anwar

2

ext3 이하는 디렉토리 당 최대 32768 개의 파일을 지원합니다. ext4는 실제 파일 수에서 최대 65536 개를 지원하지만 더 많은 파일을 보유 할 수 있습니다 (파일을 디렉토리에 저장하지 않으므로 대부분의 사용자 목적에 중요하지 않음).

또한 디렉토리가 ext * 파일 시스템에 저장되는 방식은 본질적으로 하나의 큰 목록입니다. 보다 현대적인 파일 시스템 (Reiser, XFS, JFS)에서는 B- 트리로 저장되어 큰 세트에 훨씬 효율적입니다.


2
dir에서 해당 파일 수를 지원하는 것은 합리적인 속도로 파일을 수행하는 것과 다릅니다. ext4가 더 나은지 아직 모르겠지만 dir_index가 켜져 있어도 디렉토리에 수천 개가 넘는 파일이 있으면 ext3이 크게 느려집니다 (도움이되지만 문제를 완전히 제거하지는 않습니다).
cas

1

파일 이름 대신 파일 inode를 저장할 수 있습니다. inode 번호에 액세스하면 파일 이름을 확인하는 것보다 훨씬 빠릅니다.


지금 말해. inode 번호로 파일을 어떻게 열 수 있습니까?
Matt

1
@Matt, 답변 후 질문이 변경 된 것 같습니다. 아니면 1.5 년 전에 훨씬 더 어리 석었습니다 :)))
kolypto

0

하나의 디렉토리에 많은 파일을 넣지 않으려는 경우 일종의 구조를 원합니다. 파일의 첫 문자로 시작하는 서브 디렉토리를 갖는 것만 큼 간단하지만 액세스 시간을 향상시킬 수 있습니다. 내가 사용하고 싶은 또 다른 바보 트릭은 메타 정보로 캐시를 업데이트하도록 시스템을 강제 업데이트하는 것입니다. updatedb를 정기적으로 실행하는 것입니다. 한 창에서 slabtop을 실행하고 다른 창에서 updatedb를 실행하면 많은 메모리가 캐싱에 할당되는 것을 볼 수 있습니다. 이 방법으로 훨씬 빠릅니다.


-1

이 파일에 데이터 종류를 지정하지 않았습니다. 그러나 그 소리에서 빠른 검색을 위해 색인이있는 일종의 데이터베이스를 사용해야합니다.


-1

파일 시스템은 이러한 요구 사항에 이상적인 스토리지가 아닐 수도 있습니다. 어떤 종류의 데이터베이스 스토리지가 더 좋습니다. 그래도 도움이되지 않으면 여러 디렉토리에서 파일을 분할하고 unionfs를 사용하여 모든 파일을 표시하려는 단일 디렉토리에 해당 디렉토리를 마운트 (바인딩)하십시오. 나는이 기술을 전혀 사용하지 않았지만 시도해 볼 가치가 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.