ไฟล์สูงสุดต่อไดเรกทอรีใน ext4


16

ฉันจัดการแอปพลิเคชันที่มีที่เก็บไฟล์ซึ่งจัดเก็บไฟล์ทั้งหมดด้วยชื่อไฟล์เท่ากับผลรวม md5 ไฟล์ทั้งหมดจะถูกเก็บไว้ในไดเรกทอรีเดียว ขณะนี้มีไฟล์หลายพันไฟล์ แต่เร็ว ๆ นี้ควรมีไฟล์นับล้านไฟล์บนเซิร์ฟเวอร์ เซิร์ฟเวอร์ปัจจุบันใช้งาน Ubuntu 11.10 บนระบบไฟล์ ext4

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

สิ่งนี้ยังคงเป็นจริงหรือระบบไฟล์ที่ทันสมัย ​​(เช่น ext4) มีวิธีที่มีประสิทธิภาพมากขึ้นในการจัดการกับสิ่งนี้และขยายขนาดตามธรรมชาติหรือไม่? Wikipediaมีรายละเอียดบางอย่างเกี่ยวกับระบบไฟล์ แต่มันไม่ได้พูดอะไรเกี่ยวกับไฟล์สูงสุดต่อไดเรกทอรีหรือเวลาค้นหา

คำตอบ:


8

ext3และต่อมา filesystems สนับสนุนแฮช B ต้นไม้การจัดทำดัชนีไดเรกทอรี เครื่องชั่งนี้จะทำงานได้ดีตราบใดที่การดำเนินการเพียงอย่างเดียวของคุณคือการเพิ่มลบและเข้าถึงตามชื่อ อย่างไรก็ตามฉันยังคงแนะนำให้แบ่งไดเรกทอรีออก มิฉะนั้นคุณสร้างกับดักอันตรายสำหรับเครื่องมือ ( updatedb, ls, duและอื่น ๆ ) ที่ดำเนินการอื่น ๆ ในไดเรกทอรีที่สามารถระเบิดขึ้นถ้าไดเรกทอรีมีรายการมากเกินไป


8

หลักของปัญหาคือการขุดผ่าน inode ไดเรกทอรีสำหรับไฟล์เดียวที่คุณต้องการ ระบบไฟล์บางระบบทำได้ดีกว่าระบบอื่น สเกลบางตัวใกล้เคียงกับหลายพันล้าน แต่ถ้าคุณมี ... ไฟล์ 20K ที่เข้าสู่ไฟล์เหล่านั้นจะเร็วกว่าอย่างเห็นได้ชัด นอกจากนี้การนับไฟล์จำนวนมากยังสร้างปัญหาให้กับเครื่องมือบางอย่างและอาจทำให้การสำรอง / กู้คืนเป็นปัญหาที่ยากขึ้น

เมื่อมันเกิดขึ้นฉันก็พบปัญหาเดียวกันในการพัฒนาของเราเอง (md5sum เป็นชื่อไฟล์ สิ่งที่ฉันแนะนำให้นักพัฒนาของเราคือการสับสตริงเป็นชิ้น ๆ พวกเขาไปกับกลุ่ม 4 แต่ในระบบไฟล์ที่เราอยู่ในเวลานั้นแม้หลายคนจะพิสูจน์ปัญหาจากมุมมองด้านประสิทธิภาพดังนั้นพวกเขาจึงแยกกลุ่มของ -3 สำหรับ 6 แฝดสามคนแรกและออกจากที่เหลือเป็น ชื่อไฟล์ในไดเรกทอรีเทอร์มินัล

กลุ่ม 4: 4976/d70b/180c/6142/c617/d0c8/9d0b/bd2b.txt
กลุ่ม 3:497/6d7/0b1/80c/614/2c6/17d0c89d0bbd2b.txt

สิ่งนี้มีความได้เปรียบในการรักษาขนาดไดเรกทอรีให้เล็กและเนื่องจาก MD5sum นั้นค่อนข้างสุ่มจึงจะสร้างโครงสร้างไดเรกทอรีที่สมดุล ไดเรกทอรีสุดท้ายนั้นไม่น่าจะได้รับมากกว่าสองสามไฟล์ และนั่นก็ไม่ใช่เรื่องยากที่จะทำงานกับโค้ดของเรา เราทำงานกับโครงการไฟล์หลายล้านโครงการดังนั้นการปรับสเกลเป็นสิ่งสำคัญมากสำหรับเรา


4
โปรดระวังว่าหากผู้โจมตีมีทรัพยากรการคำนวณเขาสามารถสร้างข้อมูลที่เป็นอันตรายที่จะลงจอดในไดเรกทอรีเดียวกันโดยเจตนา ผู้โจมตีที่มีทรัพยากรที่เหมาะสมและเทคโนโลยีในปัจจุบันสามารถสร้างแฮชที่มีเลขฐานสิบหกตัวแรกเหมือนกัน (และทำให้เกิดการชนกันในไดเรกทอรีสามระดับแรก) ในอัตราประมาณหนึ่งทุกสิบนาที และแน่นอนว่าสามารถสร้างแฮช MD5 แบบเต็มได้ในวันนี้
David Schwartz

5

ระบบไฟล์ที่ทันสมัยจัดการกับไดเรกทอรีที่มีขนาดใหญ่มากได้เป็นอย่างดีแม้กระทั่งไฟล์นับล้าน แต่เครื่องมือธรรมดาทำไม่ได้ ตัวอย่างเช่นการแสดงรายการไดเรกทอรีขนาดใหญ่ที่มี "ls" จะใช้เวลาค่อนข้างนานเนื่องจากโดยปกติแล้วจะอ่านไดเรกทอรีทั้งหมดและเรียงลำดับ (แม้ว่าคุณสามารถใช้ ls -f เพื่อหลีกเลี่ยงการเรียงลำดับ) มันจะไม่เริ่มแสดงไฟล์จนกว่าจะอ่านทั้งหมด การแยกชื่อช่วยในบางกรณี แต่ไม่ได้อยู่ในทั้งหมด (ตัวอย่างเช่นการจำลองแบบ rsync อาจยังจำเป็นต้องรวบรวมต้นไม้ทั้งหมดของชื่อ)


-1

ฉันขอแนะนำให้ใช้ฐานข้อมูล SQL แทนได้หรือไม่ สิ่งนี้จะเปลี่ยนจุดอ่อนที่เห็นในแอปพลิเคชันของคุณเป็นจุดแข็ง

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