ความหมายของประสิทธิภาพสำหรับไฟล์นับล้านไฟล์ในระบบไฟล์ที่ทันสมัยคืออะไร?


30

สมมติว่าเรากำลังใช้ ext4 (ด้วย dir_index ที่เปิดใช้งาน) เพื่อโฮสต์ไฟล์ 3M (โดยมีขนาดเฉลี่ย 750KB) และเราจำเป็นต้องตัดสินใจว่าจะใช้รูปแบบโฟลเดอร์ใด

ในโซลูชันแรกเราใช้ฟังก์ชันแฮชกับไฟล์และใช้โฟลเดอร์สองระดับ (เป็น 1 ตัวอักษรสำหรับระดับแรกและ 2 ตัวอักษรถึงระดับที่สอง): ดังนั้นการเป็นfilex.forแฮชเท่ากับabcde1234เราจะเก็บไว้ใน / เส้นทาง / a / bc /abcde1234-filex.for

ในโซลูชันที่สองเราใช้ฟังก์ชันแฮชกับไฟล์และใช้โฟลเดอร์สองระดับ (เป็น 2 ตัวอักษรสำหรับระดับแรกและ 2 ตัวอักษรถึงระดับที่สอง): ดังนั้นการเป็นfilex.forแฮชเท่ากับabcde1234เราจะเก็บไว้ใน / เส้นทาง / ab / de /abcde1234-filex.for

สำหรับวิธีแก้ปัญหาแรกเราจะมีรูปแบบต่อไปนี้ที่/path/[16 folders]/[256 folders]มีค่าเฉลี่ย 732 ไฟล์ต่อโฟลเดอร์ (โฟลเดอร์สุดท้ายที่ไฟล์จะอยู่)

ในขณะที่การแก้ปัญหาที่สองเราจะมี/path/[256 folders]/[256 folders]กับค่าเฉลี่ยของ 45 ไฟล์ต่อโฟลเดอร์

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

นอกจากนี้ยังมีเครื่องมืออะไรบ้างที่เราสามารถใช้ตรวจสอบ / ทดสอบการตั้งค่านี้


7
การเปรียบเทียบจะช่วยได้อย่างชัดเจน แต่ ext4 อาจเป็นระบบไฟล์ที่ผิดสำหรับเรื่องนี้ ฉันจะดู XFS
ewwhite

4
ฉันจะไม่ดู XFS ฉันจะใช้ทันทีโดยไม่ต้องกังวลใจ ต้นไม้ B + ชนะโต๊ะแฮชทุกครั้ง
Michael Hampton

ขอบคุณสำหรับเคล็ดลับการเปรียบเทียบเป็นเรื่องยากนิดหน่อยฉันพยายามhdparm -Tt /dev/hdXแต่มันอาจไม่ใช่เครื่องมือที่เหมาะสมที่สุด
leandro moreira

2
ไม่มีhdparmไม่ได้เป็นเครื่องมือที่เหมาะสมก็คือการตรวจสอบประสิทธิภาพการทำงานของดิบของอุปกรณ์ป้องกันและไม่ได้มีการทดสอบของระบบแฟ้ม
HBruijn

คำตอบ:


28

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

ความช้านั้นขึ้นอยู่กับการออกแบบระบบไฟล์

ระบบไฟล์ ext4 ใช้B-treeเพื่อเก็บรายการไดเรกทอรี การค้นหาในตารางนี้คาดว่าจะใช้เวลาO (log n)ซึ่งส่วนใหญ่น้อยกว่าตารางเชิงเส้นไร้เดียงสาที่ ext3 และระบบไฟล์ก่อนหน้านี้ใช้ (และเมื่อไม่มี) ไดเรกทอรีนั้นเล็กเกินไปสำหรับ สำคัญจริงๆ)

ระบบไฟล์ XFS ใช้ต้นไม้ B +แทน ข้อได้เปรียบของสิ่งนี้เหนือโต๊ะแฮชหรือ B-tree คือโหนดใด ๆ ที่อาจมีหลายลูกซึ่งใน XFS bจะแตกต่างกันและอาจสูงถึง 254 (หรือ 19 สำหรับโหนดรูทและตัวเลขเหล่านี้อาจล้าสมัย ) สิ่งนี้ทำให้คุณมีเวลาที่ซับซ้อนของO (log b n)ซึ่งเป็นการปรับปรุงที่มากมาย

ระบบไฟล์เหล่านี้สามารถจัดการไฟล์ได้หลายหมื่นไฟล์ในไดเรกทอรีเดียวโดย XFS นั้นเร็วกว่า ext4 อย่างมากในไดเรกทอรีที่มีจำนวน inodes เท่ากัน แต่คุณอาจไม่ต้องการไดเรกทอรีเดียวที่มี 3M inodes เช่นเดียวกับต้นไม้ B + การค้นหาอาจใช้เวลาสักครู่ นี่คือสิ่งที่นำไปสู่การสร้างไดเรกทอรีในลักษณะนี้ตั้งแต่แรก

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


และสำหรับ XFS หรือ ext4 ฮาร์ดแวร์ที่คุณใส่ระบบไฟล์จะมีผลกระทบอย่างมากต่อประสิทธิภาพ ไดรฟ์ SATA ความเร็วต่ำ 5400 รอบต่อนาทีสามารถดำเนินการสุ่ม IO ประมาณ 50 ครั้ง / วินาทีไดรฟ์ SAS ที่ดี 15,000 รอบต่อนาทีสามารถทำได้สองสามร้อยและ SSD อาจมีแบนด์วิดท์ จำกัด และอาจได้รับการปฏิบัติการ IO ต่อวินาทีแบบสุ่ม ถ้าไม่มากขึ้น
Andrew Henle

1
อย่างเคร่งครัดพูด $ O (\ log_b n) $ สำหรับการแก้ไข $ b $ มีความซับซ้อนเช่นเดียวกับ $ O (\ log n) $ แต่สำหรับ OP ค่าคงที่ที่แท้จริงจะสำคัญ
Hagen von Eitzen

นอกเสียจากว่าระบบไฟล์ของฉันมีสิ่งผิดปกติ ext4 จะไม่สามารถจัดการ 10,000 ไฟล์ในไดเรกทอรีเดียว การดำเนินการอย่างง่ายls -lใช้เวลาเต็มหนึ่งนาทีหากไดเรกทอรีหลุดจากแคชไอโหนด และเมื่อมันถูกแคชก็ยังคงใช้เวลากว่าหนึ่งวินาที นี่คือ SSD และ Xeon ที่มี RAM จำนวนมากบนเว็บเซิร์ฟเวอร์ที่มีปริมาณการใช้งานค่อนข้างต่ำ
Abhi Beckert

@AbhiBeckert มันอัพเกรดมาจาก ext3 หรือไม่? ถ้าเป็นเช่นนั้นลองสร้างไดเรกทอรีใหม่และย้ายไฟล์ไปที่
Michael Hampton

@ แฮมป์ตันไม่มันเพิ่งจะติดตั้งเซิร์ฟเวอร์ (บน) ฮาร์ดแวร์ที่ทันสมัย ฉันทำงานเกี่ยวกับปัญหากับดูแลระบบ / ศูนย์ข้อมูลของเราสองสามเดือน เราจ่ายเงินหลายพันดอลลาร์ต่อเดือนเพื่อเช่าเซิร์ฟเวอร์และไม่ได้รับประสิทธิภาพที่ยอมรับได้ ดูเหมือนว่าตัวเลือกเดียวคือการย้ายไปยังโครงสร้างไดเรกทอรีใหม่ - อาจใช้แฮชแทนวันที่สำหรับชื่อไฟล์ที่จะกระจายออกไปอย่างเท่าเทียมกัน
Abhi Beckert

5

จากประสบการณ์ของฉันหนึ่งในปัจจัยการปรับสเกลคือขนาดของ inodes ที่กำหนดกลยุทธ์การแบ่งชื่อแบบแฮช

ตัวเลือกทั้งสองที่คุณเสนอนั้นสร้างรายการ inode ได้สูงสุดสามรายการสำหรับแต่ละไฟล์ที่สร้างขึ้น นอกจากนี้ไฟล์ 732 ไฟล์จะสร้าง inode ที่ยังน้อยกว่า 16KB ปกติ สำหรับฉันนี่หมายถึงตัวเลือกใดตัวเลือกหนึ่งจะทำงานเหมือนกัน

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


1
อะไรทำให้การใช้ผลรวมของ SHA1 (และผลรวมอื่น ๆ ของแฮชอีกต่อไป) เป็นปัญหาที่ยากยิ่งขึ้น? มันยากสำหรับผู้ใช้ที่เป็นมนุษย์ใช่ แต่มันก็เหมือนกันกับระบบปฏิบัติการระบบไฟล์และโปรแกรมอื่น ๆ
kbolino

4

แน่นอนว่าตัวเลือกใดตัวเลือกหนึ่งจะช่วยลดจำนวนไฟล์ในไดเรกทอรีเป็นสิ่งที่สมเหตุสมผลสำหรับ xfs หรือ ext4 หรือระบบไฟล์ใด ๆ ไม่ชัดเจนซึ่งดีกว่าจะต้องทดสอบเพื่อบอก

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

hdparmการทำ I / O อย่างยั่งยืนนั้นไม่มีประโยชน์ มันจะไม่แสดง I / Os ขนาดเล็กจำนวนมากหรือรายการไดเรกทอรียักษ์ที่เชื่อมโยงกับไฟล์จำนวนมาก


1

หนึ่งในปัญหาคือวิธีการสแกนโฟลเดอร์

ลองนึกภาพวิธี Java ที่เรียกใช้การสแกนในโฟลเดอร์

จะต้องจัดสรรหน่วยความจำจำนวนมากและยกเลิกการจัดสรรในช่วงเวลาสั้น ๆ ซึ่งหนักมากสำหรับ JVM

วิธีที่ดีที่สุดคือจัดโครงสร้างโฟลเดอร์ตามวิธีที่แต่ละไฟล์อยู่ในโฟลเดอร์เฉพาะเช่นปี / เดือน / วัน

วิธีการสแกนแบบเต็มรูปแบบก็คือสำหรับแต่ละโฟลเดอร์มีฟังก์ชั่นการทำงานหนึ่งเดียวดังนั้น JVM จะออกจากฟังก์ชั่นยกเลิกการจัดสรรแรมและรันอีกครั้งในโฟลเดอร์อื่น

นี่เป็นเพียงตัวอย่าง แต่การมีโฟลเดอร์ขนาดใหญ่เช่นนี้ก็ไม่สมเหตุสมผล


2
คุณกำลังสมมติว่า Java และสแกนโฟลเดอร์ ไม่มีการพูดถึงในคำถามและมีวิธีอื่นในการประมวลผลโฟลเดอร์ใน Java นอกเหนือจากการสแกน
user207421

1

ฉันมีปัญหาเดียวกัน พยายามจัดเก็บไฟล์หลายล้านไฟล์ในเซิร์ฟเวอร์ Ubuntu ใน ext4 สิ้นสุดการใช้งานการวัดประสิทธิภาพของฉันเอง พบว่าไดเรกทอรีแบนทำงานได้ดีขึ้นในขณะที่ใช้งานง่ายกว่า:

มาตรฐาน

เขียนบทความ


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