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


25

ฉันมีแอปพลิเคชันที่เขียนไปยังไดเรกทอรี ext3 ซึ่งเมื่อเวลาผ่านไปได้ขยายไฟล์เป็นสามล้านไฟล์ จำเป็นต้องพูดการอ่านรายชื่อไฟล์ของไดเรกทอรีนี้ช้าเหลือทน

ฉันไม่ตำหนิ ext3 วิธีการแก้ปัญหาที่เหมาะสมจะได้รับที่จะให้รหัสโปรแกรมการเขียนไปยังไดเรกทอรีย่อยเช่นแทนที่จะใช้เท่านั้น./a/b/c/abc.ext./abc.ext

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

หรือในคำอื่น ๆ สมมติว่าฉันต้องการเก็บไฟล์สามล้านไฟล์ไว้ในโครงสร้างควรมี./a/b/c/abc.extโครงสร้างในระดับใด?

เห็นได้ชัดว่านี่เป็นคำถามที่ไม่สามารถตอบได้อย่างแน่นอน แต่ฉันกำลังมองหาการประเมินสวนบอล

คำตอบ:


12

ให้คุณมี distro ที่รองรับdir_indexความสามารถจากนั้นคุณสามารถมี 200,000 ไฟล์ในไดเรกทอรีเดียว ฉันจะเก็บไว้ที่ประมาณ 25,000 แม้ว่าเพียงเพื่อความปลอดภัย ไม่ต้องdir_indexพยายามเก็บไว้ที่ 5,000


10

จะมากระวังวิธีการที่คุณเลือกแยกไดเรกทอรี "a / b / c" ดูเหมือนสูตรสำหรับหายนะสำหรับฉัน ...

อย่าสุ่มสี่สุ่มห้าเพียงแค่สร้างโครงสร้างที่ลึกหลายไดเรกทอรีพูดรายการ 100 รายการในระดับแรก 100 รายการในระดับที่สอง 100 รายการในลำดับที่สาม ฉันเคยไปที่นั่นมาแล้วรับเสื้อแจ็คเก็ตและต้องปรับโครงสร้างใหม่เมื่อการแสดงไปในเครปเปอร์ที่มีไฟล์ไม่กี่ล้านไฟล์ :-)

เรามีลูกค้าที่ใช้รูปแบบ "หลายไดเรกทอรี" และท้ายที่สุดก็วางไฟล์เพียงหนึ่งถึงห้าไฟล์ต่อไดเรกทอรีและนี่เป็นการฆ่าพวกเขา 3 ถึง 6 ชั่วโมงเพื่อทำ "du" ในโครงสร้างไดเรกทอรีนี้ ผู้ช่วยชีวิตที่นี่คือ SSD พวกเขาไม่เต็มใจที่จะเขียนส่วนนี้ของแอปพลิเคชันของพวกเขาและ SSD ใช้เวลานี้ลดลงจากชั่วโมงเป็นนาที

ปัญหาคือว่าแต่ละระดับของการค้นหาไดเรกทอรีใช้เวลาแสวงหาและแสวงหามีราคาแพงมาก ขนาดของไดเร็กตอรี่เป็นอีกปัจจัยหนึ่งดังนั้นการมีขนาดเล็กกว่าใหญ่กว่าจึงเป็นชัยชนะครั้งใหญ่

เพื่อตอบคำถามของคุณเกี่ยวกับจำนวนไฟล์ต่อไดเรกทอรี 1,000 รายการที่ฉันเคยได้ยินชื่อว่า "เหมาะสมที่สุด" แต่ประสิทธิภาพที่ 10,000 ดีขึ้น

ดังนั้นสิ่งที่ฉันขอแนะนำคือหนึ่งระดับของไดเรกทอรีแต่ละระดับจะมีความยาวไดเรกทอรี 2 ตัวอักษรประกอบด้วยตัวอักษรตัวใหญ่และตัวเล็กและตัวเลขสำหรับไดเรกทอรีประมาณ 3800 ในระดับบนสุด จากนั้นคุณสามารถเก็บไฟล์ 14M ด้วยไดเรกทอรีย่อยที่มีไฟล์ 3800 หรือประมาณ 1,000 ไฟล์ต่อไดเรกทอรีย่อยสำหรับไฟล์ 3M

ฉันได้ทำการเปลี่ยนแปลงเช่นนี้กับลูกค้ารายอื่นและทำให้เกิดความแตกต่างอย่างมาก


6

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

กฎส่วนบุคคลของฉันคือการตั้งเป้าหมายให้มีขนาดไดเรกทอรี <= 20k ไฟล์แม้ว่าฉันจะเห็นประสิทธิภาพที่ค่อนข้างดีพร้อมไฟล์ / ไดเรกทอรีสูงสุด 100k


3

ฉันมีไฟล์ทั้งหมดไปโฟลเดอร์เช่น:

อัปโหลด / [วันที่] / [ชั่วโมง] /yo.png

และไม่มีปัญหาเรื่องประสิทธิภาพ


4
และคุณได้รับไฟล์กี่ไฟล์ต่อชั่วโมง
Cascabel

2

http://en.wikipedia.org/wiki/Ext3#Functionality - กล่าวถึงว่าไดเรกทอรีสามารถมีไดเรกทอรีย่อยได้ประมาณ 32000 ไดเรกทอรีเท่านั้น แต่ไม่ได้กล่าวถึงไฟล์

http://roopindersingh.com/2008/05/10/ext3-handling-large-number-of-files-in-a-directory/

นอกจากนี้ฉันเกลียดการแลกเปลี่ยนผู้เชี่ยวชาญ แต่ฉันอ่านความคิดเห็นเกี่ยวกับคำถามนี้ว่ามันเหมาะที่จะมีน้อยกว่า 10-15,000 ต่อไดเรกทอรี


2

ฉันสามารถยืนยันบนเซิร์ฟเวอร์ที่ทรงพลังสวยพร้อมหน่วยความจำมากมายภายใต้การโหลดที่เหมาะสมที่ไฟล์ 70,000 ไฟล์สามารถทำให้เกิดความเสียหายได้ทุกประเภท ฉันไปลบโฟลเดอร์แคชที่มีไฟล์ 70k ในนั้นและทำให้ apache เริ่มวางไข่อินสแตนซ์ใหม่จนกว่าจะถึง maxed out ที่ 255 และระบบใช้หน่วยความจำฟรีทั้งหมด (16gb แม้ว่าอินสแตนซ์เสมือนอาจต่ำกว่า) ไม่ว่าจะด้วยวิธีใดการเก็บรักษาไว้ต่ำกว่า 25,000 น่าจะเป็นการเคลื่อนไหวที่รอบคอบมาก


1

จากประสบการณ์ของผมวิธีที่ดีที่สุดคือการไม่จัดโครงสร้างไฟล์ไว้ล่วงหน้าเกินไป ดังที่กล่าวไว้ในคำตอบอย่างน้อยหนึ่งคำตอบมีส่วนขยายระบบไฟล์ที่จัดการกับจุดสิ้นสุดของสิ่งต่าง ๆ

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

sqrt (3_000_000) == 1732

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

ได้รับตัวอย่างของคุณนี้จะเป็น./a/abc.ext, ./ab/abc.ext, ./abc/abc.ext...

การแพร่กระจายของไฟล์จะขึ้นอยู่กับชื่อไฟล์จริง foobar???.txtลองนึกภาพการใช้เทคนิคนี้ในการไดเรกทอรีของล้านไฟล์แต่ละชื่อ มีวิธีที่จะทำให้การแพร่กระจายสำเร็จยิ่งขึ้นเช่นการแฮชตามค่าของบิตจำนวนหนึ่งจากผลรวม MD5 ของแต่ละชื่อไฟล์ แต่ฉันจะกล้าเดาว่าจะเกินความเป็นจริงสำหรับสิ่งที่คุณพยายามทำ


1

อืมผมอ่านบทความนี้เมื่อเร็ว ๆ นี้ เป็นหลักคุณใช้ประโยชน์จากการกระจายของอัลกอริทึมการแปลงแป้นพิมพ์ที่คุณชื่นชอบ ฉันเริ่มเล่นกับตัวเลข, MySQL ที่ลงนาม INT มีค่าสูงสุด 2147483647 นอกจากนี้คุณยังสามารถเปลี่ยนแปลงจำนวนไฟล์ที่ต้องการต่อไดเรกทอรีและจำนวนของไดเรกทอรีย่อยเพื่อกำหนดจำนวนสุดท้ายของไดเรกทอรีย่อย / ไฟล์ - การแยกต่อไดเรกทอรีสำหรับชุดข้อมูลที่กำหนด แต่มันยากที่จะหาหลักฐานเชิงประจักษ์เกี่ยวกับองค์กรไดเรกทอรี / ไฟล์ที่ดีที่สุด บทความนี้จะให้ข้อมูลเชิงลึกเกี่ยวกับความแตกต่างของประสิทธิภาพในระบบไฟล์ (ตัวชี้วัดที่น่าสนใจ) แต่ไม่มีอะไรเกี่ยวกับองค์กรที่ดีที่สุด


0

ฉันคิดว่าคุณกำลังคิดมากเกินไปในเรื่องนี้ หากคุณเลือกไดเรคทอรีระดับเพิ่มอีกหนึ่งระดับและสามารถสร้างสมดุลให้กับสิ่งต่าง ๆ อย่างเท่าเทียมกันคุณจะมีไดเรคทอรี 1732 * และ 1732 ไฟล์ต่อไดเรกทอรี

หากคุณไม่ต้องการใช้ไฟล์หลายพันล้านไฟล์คุณสามารถเลือกตัวเลขระหว่าง 1,000 ถึง 100,000 และได้ผลลัพธ์ที่ดี

* รากที่สองของ 3 ล้าน

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