ประสิทธิภาพ NTFS และไฟล์และไดเรกทอรีจำนวนมาก


183

Windows กับ NTFS ทำงานอย่างไรกับไฟล์และไดเรกทอรีจำนวนมาก?

มีคำแนะนำเกี่ยวกับข้อ จำกัด ของไฟล์หรือไดเรกทอรีที่คุณสามารถวางในไดเรกทอรีเดียวก่อนที่จะพบปัญหาประสิทธิภาพหรือปัญหาอื่น ๆ ?

เช่นมีโฟลเดอร์ที่มี 100,000 โฟลเดอร์ภายในนั้นเป็นสิ่งที่ตกลงที่จะทำอย่างไร



คำตอบของคำถามที่เกี่ยวข้องนั้นด้อยกว่าคำตอบที่ยอมรับได้ที่นี่
Eric J.

การใช้งานนี้อาจเป็นประโยชน์: github.com/acrobit/AcroFS
Ghominejad

คำตอบ:


271

นี่คือคำแนะนำจากบางคนที่มีสภาพแวดล้อมที่เรามีโฟลเดอร์ที่มีไฟล์หลายสิบล้านไฟล์

  1. โฟลเดอร์จัดเก็บข้อมูลดัชนี (ลิงก์ไปยังไฟล์ย่อยและโฟลเดอร์ย่อย) ในไฟล์ดัชนี ไฟล์นี้จะมีขนาดใหญ่มากเมื่อคุณมีลูกจำนวนมาก โปรดทราบว่ามันไม่แยกความแตกต่างระหว่างชายน์ที่เป็นโฟลเดอร์และชายด์ที่เป็นไฟล์ ความแตกต่างเพียงอย่างเดียวคือเนื้อหาของเด็กคนนั้นคือดัชนีโฟลเดอร์ของเด็กหรือข้อมูลไฟล์ของเด็ก หมายเหตุ: ฉันกำลังทำให้สิ่งนี้ง่ายขึ้น แต่สิ่งนี้ได้รับการแก้ไข
  2. ไฟล์ดัชนีจะได้รับการแยกส่วน เมื่อมีการแยกส่วนเกินไปคุณจะไม่สามารถเพิ่มไฟล์ลงในโฟลเดอร์นั้น เนื่องจากมีจำนวน จำกัด ของจำนวนแฟรกเมนต์ที่อนุญาต มันเกิดจากการออกแบบ ฉันยืนยันด้วย Microsoft ในการโทรติดต่อฝ่ายสนับสนุน ดังนั้นแม้ว่าข้อ จำกัด ทางทฤษฎีเกี่ยวกับจำนวนไฟล์ที่คุณสามารถมีในโฟลเดอร์คือหลายพันล้านครั้งโชคดีเมื่อคุณเริ่มกดไฟล์หลายสิบล้านไฟล์เนื่องจากคุณจะพบข้อ จำกัด การแตกแฟรกเมนต์ก่อน
  3. มันไม่ได้เลวร้ายทั้งหมด คุณสามารถใช้เครื่องมือ: contig.exeเพื่อจัดเรียงดัชนีนี้ มันจะไม่ลดขนาดของดัชนี (ซึ่งสามารถเข้าถึงได้ถึงหลายกิ๊กสำหรับไฟล์หลายสิบล้านไฟล์) แต่คุณสามารถลด # ของแฟรกเมนต์ได้ หมายเหตุ: เครื่องมือการจัดเรียงข้อมูลบนดิสก์จะไม่จัดเรียงข้อมูลดัชนีของโฟลเดอร์ มันจะจัดเรียงข้อมูลไฟล์ เครื่องมือ contig.exe เท่านั้นที่จะจัดเรียงดัชนี FYI: คุณสามารถใช้เพื่อจัดเรียงข้อมูลของแต่ละไฟล์ได้
  4. หากคุณทำการดีแฟรกอย่ารอจนกว่าคุณจะถึงจำนวนสูงสุดของการ จำกัด แฟรกเมนต์ ฉันมีโฟลเดอร์ที่ไม่สามารถจัดเรียงข้อมูลเพราะฉันรอจนกว่าจะสายเกินไป การทดสอบครั้งต่อไปของฉันคือพยายามย้ายไฟล์บางไฟล์ออกจากโฟลเดอร์นั้นไปยังโฟลเดอร์อื่นเพื่อดูว่าฉันสามารถจัดเรียงข้อมูลได้หรือไม่ หากสิ่งนี้ล้มเหลวสิ่งที่ฉันต้องทำคือ 1) สร้างโฟลเดอร์ใหม่ 2) ย้ายแบตช์ไฟล์ไปยังโฟลเดอร์ใหม่ 3) จัดระเบียบโฟลเดอร์ใหม่ ทำซ้ำ # 2 & # 3 จนกว่าจะเสร็จสิ้นจากนั้น 4) ลบโฟลเดอร์เก่าและเปลี่ยนชื่อโฟลเดอร์ใหม่เพื่อให้ตรงกับโฟลเดอร์เดิม

เพื่อตอบคำถามของคุณโดยตรง: หากคุณกำลังดูรายการ 100K ไม่ต้องกังวล ไปเคาะตัวเองออกไป หากคุณกำลังดูรายการหลายสิบล้านรายการให้ทำดังนี้:

a) วางแผนที่จะแบ่งย่อยมันลงในโฟลเดอร์ย่อย (เช่นสมมติว่าคุณมีไฟล์ 100M จะดีกว่าที่จะเก็บไว้ใน 1,000 โฟลเดอร์เพื่อให้คุณมี 100,000 ไฟล์ต่อโฟลเดอร์เท่านั้นเพื่อเก็บไว้ใน 1 โฟลเดอร์ใหญ่ จะสร้างดัชนีโฟลเดอร์ 1,000 รายการแทนที่จะเป็นดัชนีขนาดใหญ่เดียวที่มีแนวโน้มที่จะมีจำนวนแฟรกเมนต์จำนวนสูงสุดหรือ

b) วางแผนที่จะเรียกใช้ contig.exe เป็นประจำเพื่อป้องกันการจัดระเบียบดัชนีของโฟลเดอร์ใหญ่

อ่านด้านล่างเฉพาะในกรณีที่คุณเบื่อ

ขีด จำกัด ที่แท้จริงไม่ได้อยู่ใน # ของแฟรกเมนต์ แต่บนจำนวนเร็กคอร์ดของเซ็กเมนต์ข้อมูลที่เก็บพอยน์เตอร์ไปยังแฟรกเมนต์

ดังนั้นสิ่งที่คุณมีคือส่วนของข้อมูลที่เก็บพอยน์เตอร์ไปยังส่วนของข้อมูลไดเรกทอรี ข้อมูลไดเรกทอรีเก็บข้อมูลเกี่ยวกับไดเรกทอรีย่อยและไฟล์ย่อยที่ไดเรกทอรีควรเก็บไว้ จริงๆแล้วสารบบไม่ได้ "เก็บ" อะไรเลย มันเป็นเพียงคุณสมบัติการติดตามและการนำเสนอที่นำเสนอภาพลวงตาของลำดับชั้นให้กับผู้ใช้เนื่องจากสื่อจัดเก็บข้อมูลนั้นเป็นแบบเส้นตรง


5
ฉันจะหาข้อมูลเพิ่มเติมได้จากที่ไหนcontig.exeมันไม่ได้อยู่ในเซิร์ฟเวอร์ของฉัน การค้นหาโดย Google ส่งคืนหน้าเทคเนต์นี้ซึ่งไม่มีการกล่าวถึงไดเรกทอรีย่อยหรือการจัดเรียงดัชนีโฟลเดอร์
Evan Carroll

35
ฉันพบข้อมูลเกี่ยวกับการแยกส่วนดัชนีและโฟลเดอร์จากการโทรด้วยเทคโนโลยีกับวิศวกรของ Microsoft มันเป็นความเจ็บปวดอย่างใหญ่หลวงในการผ่านการสนับสนุนทางเทคนิคระดับ 1-3 เลเยอร์ที่ไร้ประโยชน์ (เอ่อ ... คุณลองใช้งาน chkdsk แล้วคุณลองเปิดโฟลเดอร์ใน Windows Explorer ได้หรือไม่คุณสามารถตรวจสอบการอนุญาตของโฟลเดอร์ได้หรือไม่) FOOL! ฉันจะไม่นั่งที่นี่เป็นเวลา 7 วันเพื่อรอ chkdsk ของคุณเพื่อสแกนไดรฟ์ที่มีไฟล์หลายสิบล้านไฟล์ !!
MrB

5
@ ss2k - แค่ชี้contig.exeไปที่ไดเร็กตอรี่ฉันคิดว่ามันจะทำงาน: contig -a .ให้:C:\temp\viele-Dateien is in 411 fragments Summary: Number of files processed : 1 Average fragmentation : 411 frags/file
Lumi

3
@GPhilo ฉันสามารถยืนยันประสิทธิภาพยังคงลดลงใน SSD เมื่อใช้ไฟล์นับล้าน ฉันก็พยายามที่จะจัดระเบียบโฟลเดอร์ แต่ contig ไม่ได้ทำอะไรกับมัน มันทำหน้าที่ราวกับว่าเสร็จสมบูรณ์ แต่มีการแตกแฟรกเมนต์เหมือนกันทั้งก่อนและหลังเรียกใช้
Bram Vanroy

1
ในแง่ของการรัน Contig เพื่อจัดเรียงดัชนีฉันควรรัน contig บนc:\my\big\directoryหรือc:\my\big\directory\*หรือ$mft? (หรืออย่างอื่น?)
สตีเฟ่น R

47

นอกจากนี้ยังมีปัญหาด้านประสิทธิภาพด้วยการสร้างชื่อไฟล์แบบสั้น ๆ ทำให้ช้าลง Microsoft แนะนำให้ปิดการสร้างชื่อไฟล์แบบสั้นหากคุณมีไฟล์มากกว่า 300k ในโฟลเดอร์ [1] ยิ่งอักขระตัวแรกน้อยกว่า 6 ตัวยิ่งมีปัญหามากขึ้น

[1] NTFS ทำงานอย่างไรจากhttp://technet.microsoft.comค้นหา "300,000"


3
ฉันจะเพิ่มคำพูดที่นี่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.- อะไหล่ค้นหาคำใบ้ "300,000" BTW: การพิมพ์ใน "300" จะเพียงพอ (= ไม่จำเป็นสำหรับคลิปบอร์ดที่นี่)
Wolf

32

ฉันกำลังสร้างโครงสร้างไฟล์เพื่อโฮสต์ไฟล์ได้มากถึง 2 พันล้าน (2 ^ 32) และทำการทดสอบต่อไปนี้ซึ่งแสดง Navigate + อ่านประสิทธิภาพที่ประมาณ 250 ไฟล์หรือ 120 ไดเรกทอรีต่อไดเรกทอรี NTFS ใน Solid State Drive ( SSD):

  • ประสิทธิภาพของไฟล์ลดลง 50% ระหว่าง 250 ถึง 1,000 ไฟล์
  • ประสิทธิภาพของไดเรกทอรีลดลง 60% ระหว่าง 120 และ 1,000 ไดเรกทอรี
  • ค่าสำหรับตัวเลข> 1000 ยังคงค่อนข้างเสถียร

ที่น่าสนใจคือจำนวนไดเรกทอรีและไฟล์จะไม่รบกวนอย่างมีนัยสำคัญ

ดังนั้นบทเรียนคือ:

  • หมายเลขไฟล์ที่สูงกว่า 250 ค่าใช้จ่ายเป็น 2 เท่า
  • ไดเรคทอรี่สูงกว่า 120 มีค่าใช้จ่าย 2.5
  • File-Explorer ใน Windows 7 สามารถจัดการ #Files ขนาดใหญ่หรือ #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; 
}

2
คุณเห็นการสูญเสียประสิทธิภาพหลังจาก 2 ^ 8 ไฟล์เพราะคุณต้องปิดการสร้างชื่อสั้น (การสร้างชื่อตัวละคร 8 ตัว) ดูtechnet.microsoft.com/en-us/library/cc781134(v=ws.10).aspx
Kyle Falconer

1
สวัสดีฉันพยายามที่ใช้บรรทัดคำสั่งนี้: ชุดพฤติกรรม fsutil.exe ปิดการใช้งาน 8dot3 1 หลังจากรีบูตผลลัพธ์ส่วนใหญ่จะเหมือนกันสำหรับไฟล์น้อยกว่า 10,000 ไฟล์ / dirs บทความกล่าวว่ามันเป็นสิ่งสำคัญสำหรับตัวเลขที่สูงขึ้นเท่านั้น สิ่งที่ฉันเห็นว่าเป็นของใช้ทั่วไป อาจลดลงเนื่องจากปัจจัยการโหลดที่สูงขึ้นใน SSD ของฉัน (ตอนนี้มันเต็ม 80% แทนที่จะเป็น 45%)
Spoc

มีประโยชน์มากขอบคุณ การคาดคะเนของผู้ใช้หลายล้านคนที่ผู้ใช้รายอื่นพูดนั้นห่างไกลจากค่าตัวเลขนี้
Adrian Maire

2
แม้หลังจากปิดใช้งานการสร้างชื่อ 8.3 คุณยังคงต้องตัดชื่อ 8.3 ที่มีอยู่เดิมหรือจะมีการปรับปรุงเล็กน้อยสำหรับการแจงนับไฟล์ที่มีอยู่
Stephen R

2
รายละเอียดเพิ่มเติม: blogs.technet.microsoft.com/josebda/2012/11/13/…
Stephen R

15

100,000 ควรจะดี

ฉันได้เห็นคนที่มีปัญหาเกี่ยวกับไฟล์หลายล้านไฟล์และฉันมีปัญหากับ Explorer เพียงแค่ไม่รู้ว่าจะนับไฟล์อะไรสักไฟล์ได้มากกว่า 60 ไฟล์ แต่ NTFS น่าจะเหมาะกับปริมาณที่คุณกำลังพูดถึง

ในกรณีที่คุณสงสัยจำนวนไฟล์สูงสุดทางเทคนิค (และฉันหวังว่าทางทฤษฎี ) คือ: 4,294,967,295


5
สำหรับผู้ที่ไม่ได้ฝึกหัดไฟล์จำนวนมากนั้นคือ (2 ^ 32 - 1)
meatspace

8

สำหรับการเข้าถึงในพื้นที่ไดเรกทอรี / ไฟล์จำนวนมากดูเหมือนจะไม่เป็นปัญหา อย่างไรก็ตามหากคุณเข้าถึงผ่านเครือข่ายจะมีประสิทธิภาพที่เห็นได้ชัดเจนหลังจากไม่กี่ร้อย (โดยเฉพาะอย่างยิ่งเมื่อเข้าถึงจากเครื่อง Vista (XP ถึง Windows Server โดยที่ NTFS ดูเหมือนว่าจะทำงานได้เร็วกว่ามาก))


4
คุณแน่ใจหรือไม่ว่านี่คือ NTFS (โปรโตคอลดิสก์บนเซิร์ฟเวอร์) และไม่ใช่ SMB (ระดับเครือข่าย)
MSalters

ไม่ฉันไม่ได้ทำการวิจัยเพิ่มเติมเพื่อ จำกัด สาเหตุ ข้อมูลเดียวที่ฉันมีมีรายละเอียดด้านบน
Brian Knoblauch

2

เมื่อคุณสร้างโฟลเดอร์ที่มีรายการ N คุณจะสร้างรายการ N รายการที่ระดับระบบไฟล์ รายการนี้เป็นโครงสร้างข้อมูลที่ใช้ร่วมกันทั่วทั้งระบบ หากคุณเริ่มปรับเปลี่ยนรายการนี้อย่างต่อเนื่องโดยการเพิ่ม / ลบรายการฉันคาดว่าอย่างน้อยการช่วงชิงการล็อคมากกว่าข้อมูลที่ใช้ร่วมกัน การแข่งขันนี้ - ในทางทฤษฎี - อาจส่งผลเสียต่อประสิทธิภาพการทำงาน

สำหรับสถานการณ์แบบอ่านอย่างเดียวฉันไม่สามารถจินตนาการถึงเหตุผลใด ๆ สำหรับการลดประสิทธิภาพของไดเรกทอรีที่มีรายการจำนวนมาก


1

ฉันมีประสบการณ์จริงกับไฟล์ประมาณ 100,000 ไฟล์ (แต่ละ MBs) ใน NTFS ในไดเรกทอรีขณะที่คัดลอกหนึ่งไลบรารีออนไลน์

ใช้เวลาประมาณ 15 นาทีในการเปิดไดเรกทอรีด้วย Explorer หรือ 7-zip

กำลังเขียนสำเนาเว็บไซต์ด้วย winhttrackจะติดอยู่หลังจากผ่านไประยะหนึ่ง มันจัดการกับไดเรกทอรีที่มีประมาณ 1 000 000 ไฟล์ ฉันคิดว่าสิ่งที่แย่ที่สุดคือ MFT เท่านั้นที่สามารถสำรวจตามลำดับได้

การเปิดแบบเดียวกันภายใต้ ext2fsd บน ext3 นั้นให้เวลาเกือบเหมือนกัน การย้ายไปยัง reiserfs (ไม่ใช่ reiser4fs) อาจช่วยได้

การพยายามหลีกเลี่ยงสถานการณ์นี้น่าจะดีที่สุด

สำหรับโปรแกรมของคุณเองโดยใช้ blobs โดยไม่มี fs ใด ๆ อาจเป็นประโยชน์ นั่นคือวิธีที่ Facebook ใช้ในการจัดเก็บรูปภาพ


ฉันไม่แน่ใจว่าคุณจะได้รับ "MFT ที่สามารถตามลำดับเท่านั้น"? MFT มีต้นไม้ B และเคลื่อนที่เหมือนต้นไม้ B
phuclv
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.