NTFS 성능 및 대용량 파일 및 디렉토리
NTFS가 설치된 Windows는 대용량 파일 및 디렉터리에서 어떻게 작동합니까?
성능 문제나 기타 문제가 발생하기 전에 단일 디렉터리에 배치할 수 있는 파일 또는 디렉터리 제한에 대한 지침이 있습니까?
예를 들어 내부에 100,000개의 폴더가 있는 폴더가 있어도 괜찮습니까?
다음은 수천만 개의 파일이 포함된 폴더가 있는 환경을 가진 사용자의 조언입니다.
- 폴더는 인덱스 정보(하위 파일 및 하위 폴더에 대한 링크)를 인덱스 파일에 저장합니다.이 파일은 아이들이 많을 때 매우 커질 것입니다.폴더인 하위 항목과 파일인 하위 항목은 구분되지 않습니다.유일한 차이점은 해당 하위 항목의 내용이 하위 항목의 폴더 색인 또는 하위 항목의 파일 데이터라는 것입니다.참고: 저는 이것을 다소 단순화하고 있지만 이것이 요점을 이해합니다.
- 인덱스 파일이 조각나갑니다.파일이 너무 단편화되면 해당 폴더에 파일을 추가할 수 없습니다.이는 허용되는 조각 수에 제한이 있기 때문입니다.그것은 의도적인 것입니다.Microsoft와 지원 문제 통화를 통해 확인했습니다.따라서 폴더에 저장할 수 있는 파일 수에 대한 이론적 제한은 수십억 개이지만 수천만 개의 파일을 저장하기 시작하면 조각화 제한을 먼저 적용할 수 있기 때문에 행운을 빕니다.
- 하지만 모든 것이 나쁜 것은 아닙니다.contu 도구를 사용할 수 있습니다.exe를 사용하여 이 인덱스를 조각 모음합니다.인덱스의 크기(수천만 개의 파일에 대해 최대 몇 기가바이트에 이를 수 있음)는 줄이지 않지만 조각 수는 줄일 수 있습니다.참고: 디스크 조각 모음 도구는 폴더의 인덱스를 조각 모음하지 않습니다.파일 데이터를 조각 모음합니다.인접 지역만.exe 도구가 인덱스를 조각 모음합니다.참고: 개별 파일의 데이터 조각 모음에도 사용할 수 있습니다.
- 조각 모음을 수행하는 경우 조각 제한의 최대 수에 도달할 때까지 기다리지 마십시오.너무 늦을 때까지 기다렸기 때문에 조각 모음을 할 수 없는 폴더가 있습니다.다음 테스트는 일부 파일을 해당 폴더에서 다른 폴더로 이동하여 조각 모음을 수행할 수 있는지 확인하는 것입니다.이 작업이 실패하면 1) 새 폴더를 만들어야 합니다.파일 배치를 새 폴더로 이동합니다.새 폴더를 조각 모음합니다.작업이 완료될 때까지 #2와 #3을 반복한 다음 4) 이전 폴더를 제거하고 새 폴더의 이름을 이전 폴더와 일치하도록 변경합니다.
질문에 보다 직접적으로 답변하기 위해:만약 당신이 10만 개의 출품작을 보고 있다면 걱정하지 마세요.가서 정신 좀 차리세요.수천만 개의 항목을 보고 있다면 다음 중 하나를 선택할 수 있습니다.
하위 폴더(예: 100M개의 파일이 있다고 가정)로 하위 폴더를 분할할 계획을 세웁니다.하나의 큰 폴더에 저장하는 것보다 폴더당 100,000개의 파일만 가질 수 있도록 1000개의 폴더에 저장하는 것이 더 좋습니다.이렇게 하면 fragment의 최대 개수 제한에 도달할 가능성이 높은 단일 큰 인덱스 대신 1000개의 폴더 인덱스가 생성됩니다.
연속 실행 계획을 수립합니다.정기적으로 exe를 실행하여 빅 폴더의 인덱스 조각 모음을 유지할 수 있습니다.
당신이 지루할 때만 아래를 읽으세요.
실제 제한은 fragment 수가 아니라 fragment에 대한 포인터를 저장하는 데이터 세그먼트의 레코드 수에 있습니다.
디렉토리 데이터의 단편에 대한 포인터를 저장하는 데이터 세그먼트가 있습니다.디렉터리 데이터는 디렉터리가 저장한 하위 디렉터리 및 하위 파일에 대한 정보를 저장합니다.사실, 디렉토리는 아무것도 "저장"하지 않습니다.저장 매체 자체가 선형이므로 사용자에게 계층 구조의 환상을 제시하는 추적 및 표시 기능일 뿐입니다.
또한 짧은 파일 이름을 만들 때 속도가 느려지는 성능 문제도 있습니다.[1] 폴더에 30만 개 이상의 파일이 있는 경우 짧은 파일 이름 만들기를 해제하는 것이 좋습니다.처음 6개 문자가 고유하지 않을수록 문제가 더 커집니다.
http://technet.microsoft.com 에서 NTFS 작동 방식, "300,000" 검색
최대 20억 개(2^32)의 파일을 호스팅하는 File-Structure를 구축하고 있으며 솔리드 스테이트 드라이브(SSD)의 NTFS 디렉터리당 약 250개의 파일 또는 120개의 디렉터리에서 Navigate + Read 성능이 급격히 저하된 것을 보여주는 다음 테스트를 수행했습니다.
- 파일 성능은 250개에서 1000개 사이에서 50%까지 떨어집니다.
- 디렉토리 성능은 120개에서 1000개 사이에서 60%까지 떨어집니다.
- 1000보다 큰 숫자 값은 비교적 안정적으로 유지됩니다.
흥미롭게도 디렉터리 및 파일 수는 크게 간섭하지 않습니다.
교훈은 다음과 같습니다.
- 250을 초과하는 파일 수는 2배 비용이 듭니다.
- 120개 이상의 디렉토리는 2.5배 비용이 듭니다.
- Windows 7(윈도우 7)의 파일 탐색기는 큰 #파일 또는 #Dirs를 처리할 수 있지만 사용성은 여전히 좋지 않습니다.
- 하위 디렉터리를 소개하는 데 비용이 많이 들지 않습니다.
다음은 데이터(각 파일 및 디렉토리에 대한 측정값 2개)입니다.
(FOPS = File Operations per Second)
(DOPS = Directory Operations per Second)
#Files lg(#) FOPS FOPS2 DOPS DOPS2
10 1.00 16692 16692 16421 16312
100 2.00 16425 15943 15738 16031
120 2.08 15716 16024 15878 16122
130 2.11 15883 16124 14328 14347
160 2.20 15978 16184 11325 11128
200 2.30 16364 16052 9866 9678
210 2.32 16143 15977 9348 9547
220 2.34 16290 15909 9094 9038
230 2.36 16048 15930 9010 9094
240 2.38 15096 15725 8654 9143
250 2.40 15453 15548 8872 8472
260 2.41 14454 15053 8577 8720
300 2.48 12565 13245 8368 8361
400 2.60 11159 11462 7671 7574
500 2.70 10536 10560 7149 7331
1000 3.00 9092 9509 6569 6693
2000 3.30 8797 8810 6375 6292
10000 4.00 8084 8228 6210 6194
20000 4.30 8049 8343 5536 6100
50000 4.70 7468 7607 5364 5365
다음은 테스트 코드입니다.
[TestCase(50000, false, Result = 50000)]
[TestCase(50000, true, Result = 50000)]
public static int TestDirPerformance(int numFilesInDir, bool testDirs) {
var files = new List<string>();
var dir = Path.GetTempPath() + "\\Sub\\" + Guid.NewGuid() + "\\";
Directory.CreateDirectory(dir);
Console.WriteLine("prepare...");
const string FILE_NAME = "\\file.txt";
for (int i = 0; i < numFilesInDir; i++) {
string filename = dir + Guid.NewGuid();
if (testDirs) {
var dirName = filename + "D";
Directory.CreateDirectory(dirName);
using (File.Create(dirName + FILE_NAME)) { }
} else {
using (File.Create(filename)) { }
}
files.Add(filename);
}
//Adding 1000 Directories didn't change File Performance
/*for (int i = 0; i < 1000; i++) {
string filename = dir + Guid.NewGuid();
Directory.CreateDirectory(filename + "D");
}*/
Console.WriteLine("measure...");
var r = new Random();
var sw = new Stopwatch();
sw.Start();
int len = 0;
int count = 0;
while (sw.ElapsedMilliseconds < 5000) {
string filename = files[r.Next(files.Count)];
string text = File.ReadAllText(testDirs ? filename + "D" + FILE_NAME : filename);
len += text.Length;
count++;
}
Console.WriteLine("{0} File Ops/sec ", count / 5);
return numFilesInDir;
}
10만 개면 됩니다.
저는 사람들이 수백만 개의 파일에 문제가 있는 것을 목격했고, 익스플로러를 사용하는 동안 6만 개 이상의 파일을 세는 방법을 전혀 알지 못했지만 NTFS는 여러분이 말하는 볼륨에 적합할 것입니다.
궁금할 경우를 대비하여 기술적(이론적) 최대 파일 수는 4,294,967,295입니다.
로컬 액세스의 경우 많은 디렉토리/파일이 문제가 되지 않는 것 같습니다.그러나 네트워크를 통해 액세스하는 경우 몇 백 대 후에 성능이 현저하게 저하됩니다(특히 Vista 시스템(XP에서 Windows Server로 NTFS를 사용하는 경우).
N개의 항목이 있는 폴더를 만들 때 파일 시스템 수준에서 N개의 항목 목록을 만듭니다.이 목록은 시스템 전체의 공유 데이터 구조입니다.그런 다음 항목을 추가/제거하여 이 목록을 계속 수정하기 시작하면 공유 데이터에 대한 잠금 경합이 발생할 것으로 예상됩니다.이 경합은 이론적으로 성능에 부정적인 영향을 미칠 수 있습니다.
읽기 전용 시나리오의 경우 항목 수가 많은 디렉터리의 성능이 저하되는 이유를 상상할 수 없습니다.
저는 온라인 라이브러리 하나를 복사하는 동안 디렉터리에 있는 NTFS의 약 100,000개의 파일(각각 몇 MB)을 실제로 경험했습니다.
탐색기 또는 7-zip으로 디렉터리를 여는 데 약 15분이 걸립니다.
사이트 복사본을 작성하는 방법winhttrack
시간이 지나면 항상 갇히게 됩니다.또한 약 1,000,000개의 파일이 포함된 디렉토리도 다루었습니다.제 생각에 가장 나쁜 것은 MFT가 순차적으로 통과해야 한다는 것입니다.
ext3의 ext2fsd에서 동일한 것을 여는 것은 거의 같은 타이밍을 주었습니다.Reiser4fs가 아닌 Reiserfs로 이동하는 것이 도움이 될 수 있습니다.
이 상황을 피하려고 노력하는 것이 아마도 최선일 것입니다.
자신의 프로그램에서 블롭을 사용하는 것이 도움이 될 수 있습니다.그것이 페이스북이 사진을 저장하는 방식입니다.
NTFS 외에도 파일 시스템을 호스팅하는 서버와 [원격으로] 파일 시스템을 사용하는 클라이언트도 NTFS의 동작 및 성능에 영향을 미칠 수 있습니다.클라이언트는 일반적으로 SMB 프로토콜을 사용하여 네트워크 공유에 액세스합니다.Windows Server 및 클라이언트의 각 버전은 다르게 작동할 수 있습니다.
그 외에도 SMB 자체를 조정할 수 있습니다.시작점으로 다음을 참조하십시오.
파일 서버 성능 조정 | Microsoft Learn https://learn.microsoft.com/en-us/windows-server/administration/performance-tuning/role/file-server/
언급URL : https://stackoverflow.com/questions/197162/ntfs-performance-and-large-volumes-of-files-and-directories
'programing' 카테고리의 다른 글
특정 클래스나 속성이 아닌 요소를 선택하는 CSS 셀렉터를 작성할 수 있습니까? (0) | 2023.05.25 |
---|---|
Html에 "활성" 클래스를 추가하는 방법.ASP.NET MVC의 ActionLink (0) | 2023.05.25 |
웹에서 변수를 읽습니다.구성 (0) | 2023.05.25 |
stdin 입력이 비어 있는 경우 xargs 명령을 무시하는 방법은 무엇입니까? (0) | 2023.05.20 |
npm을 이전 버전으로 다운그레이드 (0) | 2023.05.20 |