Hiệu suất NTFS và khối lượng lớn tệp và thư mục


183

Làm thế nào để Windows với NTFS thực hiện với khối lượng lớn tệp và thư mục?

Có hướng dẫn nào xung quanh giới hạn của các tệp hoặc thư mục bạn có thể đặt trong một thư mục trước khi bạn gặp vấn đề về hiệu suất hoặc các vấn đề khác không?

Ví dụ, có một thư mục với 100.000 thư mục bên trong nó là một việc nên làm?



Các câu trả lời tại câu hỏi liên quan kém hơn câu trả lời được chấp nhận ở đây.
Eric J.

Việc triển khai này có thể hữu ích: github.com/acrobit/AcroFS
Ghominejad

Câu trả lời:


271

Đây là một số lời khuyên từ một người có môi trường nơi chúng tôi có các thư mục chứa hàng chục triệu tệp.

  1. Một thư mục lưu trữ thông tin chỉ mục (liên kết đến tệp con & thư mục con) trong tệp chỉ mục. Tập tin này sẽ trở nên rất lớn khi bạn có rất nhiều trẻ em. Lưu ý rằng nó không phân biệt giữa một đứa trẻ là một thư mục và một đứa trẻ đó là một tập tin. Sự khác biệt duy nhất thực sự là nội dung của đứa trẻ đó là chỉ mục thư mục của con hoặc dữ liệu tệp của con. Lưu ý: Tôi đang đơn giản hóa điều này một chút nhưng điều này nhận được điểm.
  2. Các tập tin chỉ mục sẽ được phân mảnh. Khi nó bị phân mảnh quá nhiều, bạn sẽ không thể thêm tệp vào thư mục đó. Điều này là do có giới hạn về # các mảnh được phép. Đó là do thiết kế. Tôi đã xác nhận nó với Microsoft trong một cuộc gọi hỗ trợ. Vì vậy, mặc dù giới hạn lý thuyết về số lượng tệp mà bạn có thể có trong một thư mục là vài tỷ, chúc may mắn khi bạn bắt đầu đạt hàng chục triệu tệp vì trước tiên bạn sẽ đạt giới hạn phân mảnh.
  3. Tuy nhiên, đó không phải là tất cả xấu. Bạn có thể sử dụng công cụ: contig.exe để chống phân mảnh chỉ mục này. Nó sẽ không làm giảm kích thước của chỉ mục (có thể đạt tới vài Gigs cho hàng chục triệu tệp) nhưng bạn có thể giảm # các đoạn. Lưu ý: Công cụ chống phân mảnh đĩa sẽ KHÔNG phân mảnh chỉ mục của thư mục. Nó sẽ chống phân mảnh dữ liệu tập tin. Chỉ có công cụ contig.exe sẽ chống phân mảnh chỉ mục. FYI: Bạn cũng có thể sử dụng điều đó để phân mảnh dữ liệu của một tệp riêng lẻ.
  4. Nếu bạn KHÔNG phân mảnh, đừng đợi cho đến khi bạn đạt đến giới hạn số mảnh tối đa. Tôi có một thư mục mà tôi không thể chống phân mảnh vì tôi đã đợi cho đến khi quá muộn. Thử nghiệm tiếp theo của tôi là thử di chuyển một số tệp từ thư mục đó sang thư mục khác để xem liệu tôi có thể chống phân mảnh nó không. Nếu điều này không thành công, thì điều tôi sẽ phải làm là 1) tạo một thư mục mới. 2) di chuyển một loạt các tập tin vào thư mục mới. 3) chống phân mảnh thư mục mới. lặp lại # 2 & # 3 cho đến khi hoàn thành và sau đó 4) xóa thư mục cũ và đổi tên thư mục mới để khớp với thư mục cũ.

Để trả lời câu hỏi của bạn trực tiếp hơn: Nếu bạn đang xem 100 nghìn mục, đừng lo lắng. Đi đánh gục mình. Nếu bạn đang xem hàng chục triệu mục, thì:

a) Lập kế hoạch phân chia chúng thành các thư mục con (ví dụ: giả sử bạn có 100M tệp. Tốt hơn là lưu trữ chúng trong 1000 thư mục để bạn chỉ có 100.000 tệp trên mỗi thư mục hơn là lưu trữ chúng vào 1 thư mục lớn. sẽ tạo 1000 chỉ mục thư mục thay vì một chỉ số lớn có nhiều khả năng đạt giới hạn số mảnh tối đa hoặc

b) Lập kế hoạch để chạy contig.exe một cách thường xuyên để giữ cho chỉ mục của thư mục lớn của bạn được phân mảnh.

Chỉ đọc bên dưới nếu bạn chán.

Giới hạn thực tế không nằm ở # của đoạn, nhưng về số lượng bản ghi của phân đoạn dữ liệu lưu trữ các con trỏ tới đoạn.

Vì vậy, những gì bạn có là một phân đoạn dữ liệu lưu trữ các con trỏ đến các đoạn của dữ liệu thư mục. Dữ liệu thư mục lưu trữ thông tin về các thư mục con & tệp phụ mà thư mục được cho là được lưu trữ. Trên thực tế, một thư mục không "lưu trữ" bất cứ điều gì. Đây chỉ là một tính năng theo dõi và trình bày thể hiện ảo tưởng về thứ bậc cho người dùng vì chính phương tiện lưu trữ là tuyến tính.


5
Tôi có thể tìm thêm thông tin ở đâu contig.exe, nó không có trên máy chủ của tôi. Một tìm kiếm Google đã trả về trang kỹ thuật này không đề cập đến phân khu thư mục hoặc phân mảnh chỉ mục thư mục.
Evan Carroll

35
Tôi phát hiện ra sự phân mảnh chỉ mục contig & thư mục từ một cuộc gọi công nghệ với một kỹ sư của Microsoft. Đó là một nỗi đau rất lớn ở mông khi trải qua lớp hỗ trợ công nghệ cấp 1-3 vô dụng của họ. (Uh ... bạn đã thử chạy chkdsk chưa? Bạn có thể thử mở thư mục trong Windows Explorer không? Bạn có thể kiểm tra quyền của thư mục không?) BÓNG ĐÁ! Tôi sẽ không ngồi đây 7 ngày để chờ chkdsk chết tiệt của bạn quét một ổ đĩa với hàng chục triệu tệp !!
MrB

5
@ ss2k - Chỉ cần trỏ contig.exeđến một thư mục, tôi nghĩ rằng sẽ thực hiện công việc: contig -a .đưa ra:C:\temp\viele-Dateien is in 411 fragments Summary: Number of files processed : 1 Average fragmentation : 411 frags/file
Lumi

3
@GPhilo Tôi có thể xác nhận hiệu suất vẫn giảm trên SSD khi sử dụng hàng triệu tệp. Tôi cũng đã cố gắng chống phân mảnh thư mục, nhưng contig không làm gì với nó. Nó hoạt động như thể nó đã hoàn thành nhưng cho thấy sự phân mảnh tương tự trước và sau khi chạy nó.
Bram Vanroy

1
Về mặt chạy Contig để chống phân mảnh chỉ mục, tôi nên chạy contig trên c:\my\big\directory, hoặc c:\my\big\directory\*, hoặc trên $mft? (hoặc cái gì khác?)
Stephen R

47

Ngoài ra còn có vấn đề về hiệu suất với việc tạo tên tệp ngắn làm chậm mọi thứ. Microsoft khuyên bạn nên tắt tạo tên tệp ngắn nếu bạn có hơn 300k tệp trong một thư mục [1]. 6 ký tự đầu tiên càng ít độc đáo thì vấn đề này càng nhiều.

[1] Cách NTFS hoạt động từ http://technet.microsoft.com , tìm kiếm "300.000"


3
Tôi muốn thêm một trích dẫn ở đây If you use large numbers of files in an NTFS folder (300,000 or more), disable short-file name generation for better performance, and especially if the first six characters of the long file names are similar.- bỏ qua việc tìm kiếm gợi ý "300.000". BTW: nhập "300" là đủ (= không cần lưu trữ ở đây)
Wolf

32

Tôi đang xây dựng Cấu trúc tệp để lưu trữ tới 2 tỷ (2 ^ 32) tệp và thực hiện các thử nghiệm sau đây cho thấy hiệu suất điều hướng + đọc giảm mạnh ở khoảng 250 tệp hoặc 120 thư mục trên mỗi thư mục NTFS trên ổ đĩa thể rắn ( SSD):

  • Hiệu suất tệp giảm 50% trong khoảng từ 250 đến 1000 tệp.
  • Hiệu suất thư mục giảm 60% trong khoảng từ 120 đến 1000 Thư mục.
  • Giá trị cho số> 1000 vẫn tương đối ổn định

Điều thú vị là Số Thư mục và Tệp KHÔNG can thiệp đáng kể.

Vì vậy, các bài học là:

  • Số tệp trên 250 có giá trị là 2
  • Các thư mục trên 120 có hệ số 2,5
  • File-Explorer trong Windows 7 có thể xử lý #Files hoặc #Dirs lớn, nhưng Tính khả dụng vẫn còn kém.
  • Giới thiệu các thư mục con không tốn kém

Đây là Dữ liệu (2 Phép đo cho mỗi Tệp và Thư mục):

(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

Và đây là Mã kiểm tra:

[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; 
}

2
Bạn thấy mất hiệu suất sau 2 ^ 8 tệp vì bạn cần tắt chức năng tạo tên ngắn (tạo tên 8 ký tự). Xem technet.microsoft.com/en-us/l Library / cc781134 (v = ws.10) .aspx
Kyle Falconer

1
Xin chào, tôi đã thử sử dụng Dòng lệnh này: hành vi fsutil.exe được thiết lập vô hiệu hóa 8dot3 1 Sau khi khởi động lại, kết quả phần lớn giống nhau cho ít hơn 10000 tệp / thư mục. Bài báo nói rằng nó chỉ quan trọng đối với số lượng cao hơn. Những gì tôi thấy mặc dù là một sự hoàn hảo chung. sự xuống cấp có thể do hệ số tải cao hơn trên ổ SSD của tôi (hiện đã đầy 80% thay vì 45%)
Spoc

Rất hữu ích, cảm ơn. Ước tính hàng triệu người cho biết khác xa các giá trị số này.
Adrian Maire

2
Ngay cả sau khi vô hiệu hóa việc tạo tên 8.3, bạn vẫn cần loại bỏ tên 8.3 hiện có, hoặc sẽ có một chút cải tiến đối với việc liệt kê các tệp hiện có.
Stephen R


15

100.000 nên ổn.

Tôi đã (nói về giai đoạn) đã thấy mọi người gặp vấn đề với hàng triệu tệp và bản thân tôi cũng gặp vấn đề với Explorer khi không biết cách đếm 60 nghìn tệp, nhưng NTFS sẽ tốt cho âm lượng bạn đang nói.

Trong trường hợp bạn đang tự hỏi, số lượng tệp tối đa về mặt kỹ thuật (và tôi hy vọng về mặt lý thuyết ) là: 4.294.967.295


5
Đối với người không quen biết, số lượng lớn đó là (2 ^ 32 - 1) tệp.
gian

8

Đối với truy cập cục bộ, số lượng lớn thư mục / tệp dường như không phải là vấn đề. Tuy nhiên, nếu bạn đang truy cập nó qua mạng, sẽ có một hiệu suất đáng chú ý sau vài trăm (đặc biệt là khi được truy cập từ các máy Vista (XP đến Windows Server w / NTFS dường như chạy nhanh hơn nhiều về vấn đề đó)).


4
Bạn có chắc chắn đây là NTFS (giao thức đĩa trên máy chủ) chứ không phải SMB (cấp độ mạng)?
MSalters

Không, tôi đã không nghiên cứu thêm để thu hẹp nguyên nhân. Thông tin duy nhất tôi có là chi tiết như trên.
Brian Knoblauch

2

Khi bạn tạo một thư mục có N mục, bạn tạo một danh sách N mục ở cấp hệ thống tệp. Danh sách này là một cấu trúc dữ liệu được chia sẻ trên toàn hệ thống. Nếu sau đó bạn bắt đầu sửa đổi danh sách này liên tục bằng cách thêm / xóa các mục, tôi mong đợi ít nhất một số tranh chấp khóa trên dữ liệu được chia sẻ. Sự tranh chấp này - về mặt lý thuyết - có thể ảnh hưởng tiêu cực đến hiệu suất.

Đối với các kịch bản chỉ đọc, tôi không thể tưởng tượng được bất kỳ lý do nào làm giảm hiệu suất của các thư mục có số lượng mục lớn.


1

Tôi đã có kinh nghiệm thực tế với khoảng 100 000 tệp (mỗi vài MB) trên NTFS trong một thư mục trong khi sao chép một thư viện trực tuyến.

Mất khoảng 15 phút để mở thư mục bằng Explorer hoặc 7-zip.

Viết trang web sao chép với winhttracksẽ luôn luôn bị mắc kẹt sau một thời gian. Nó cũng xử lý thư mục, chứa khoảng 1 000 000 tệp. Tôi nghĩ điều tồi tệ nhất là MFT chỉ có thể đi qua tuần tự.

Việc mở tương tự dưới ext2fsd trên ext3 cho thời gian gần như giống nhau. Có lẽ di chuyển đến reiserfs (không phải reiser4fs) có thể giúp đỡ.

Cố gắng tránh tình huống này có lẽ là tốt nhất.

Đối với các chương trình của riêng bạn bằng cách sử dụng các đốm màu, bất kỳ fs nào cũng có thể có lợi. Đó là cách Facebook làm để lưu trữ ảnh.


Tôi không chắc chắn nơi bạn có được rằng "MFT chỉ có thể đi qua tuần tự"? MFT chứa cây B và đi ngang qua cây B
phuclv
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.