ฉันจะจัดเก็บและให้บริการไฟล์ gziped ขนาดเล็ก 1,000,000 ไฟล์บนเว็บเซิร์ฟเวอร์ Linux ได้อย่างไร


10

ฉันมีเนื้อหาสแตติกขนาดใหญ่ที่ฉันต้องส่งผ่านเว็บเซิร์ฟเวอร์ที่ใช้ Linux มันเป็นชุดของไฟล์ gzip ขนาดเล็กที่มีมากกว่าหนึ่งล้านไฟล์ 90% ของไฟล์น้อยกว่า 1K และไฟล์ที่เหลืออยู่ไม่เกิน 50K ในอนาคตสิ่งนี้สามารถเติบโตได้มากกว่า 10 ล้านไฟล์ gzip

ฉันควรใส่เนื้อหานี้ในโครงสร้างไฟล์หรือฉันควรพิจารณาที่จะนำเนื้อหาทั้งหมดนี้ไปไว้ในฐานข้อมูลหรือไม่? หากอยู่ในโครงสร้างไฟล์ฉันสามารถใช้ไดเรกทอรีขนาดใหญ่หรือฉันควรพิจารณาไดเรกทอรีที่เล็กกว่า

ฉันบอกว่าโครงสร้างไฟล์จะเร็วกว่าสำหรับการจัดส่ง แต่อีกด้านฉันรู้ว่าไฟล์จะใช้พื้นที่บนดิสก์เยอะเนื่องจากบล็อกไฟล์จะมากกว่า 1K

กลยุทธ์ที่ดีที่สุดเกี่ยวกับประสิทธิภาพการจัดส่งคืออะไร

UPDATE

สำหรับบันทึกฉันได้ทำการทดสอบภายใต้ Windows 7 ด้วยไฟล์ครึ่งล้าน:

ป้อนคำอธิบายรูปภาพที่นี่

คำตอบ:


6

ฉันเดาว่าโครงสร้าง FS จะเร็วขึ้น แต่คุณจะต้องมีโครงสร้างไดเรกทอรีที่ดีเพื่อหลีกเลี่ยงการมีไดเรกทอรีที่มีไฟล์จำนวนมาก

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


5

หากคุณเลือกตัวเลือกโครงสร้างไฟล์สิ่งหนึ่งที่คุณสามารถทำได้เพื่อปรับปรุงประสิทธิภาพของดิสก์ I / O เป็นอย่างน้อยในระดับหนึ่งคือการติดตั้งพาร์ติชันด้วย noatime + nodiratime เว้นแต่คุณจะต้องมี พวกเขาไม่สำคัญเลยดังนั้นฉันแนะนำให้ทำเช่นนั้น บางทีคุณอาจใช้โซลิดสเตตไดรฟ์ก็ได้


4

ฉันคิดว่าคำตอบที่ถูกต้องที่นี่ขึ้นอยู่กับว่าไฟล์จะถูกจัดทำดัชนีอย่างไรสิ่งที่กำหนดเมื่อเลือกไฟล์ที่กำหนดสำหรับการจัดส่ง

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

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

แต่สิ่งสำคัญที่ต้องละทิ้งคำตอบของฉันคือคุณไม่รู้จริง ๆ ว่าอะไรจะทำงานได้ดีที่สุดจนกว่าคุณจะลองด้วยข้อมูลทดสอบตัวแทนและวัดผลลัพธ์


1

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


2
ระบบไฟล์ EXT ไม่สามารถรับมือได้ดีกับจำนวนไฟล์ที่สูงใน dir เดียวกัน โดยเฉพาะอย่างยิ่งไม่ได้มีการตั้งค่า directory_index เริ่มต้น ไม่ได้ทดสอบ XFS ด้วยจำนวนไฟล์ที่สูงเช่นนี้ใน dir เดียวกัน แต่ฉันค่อนข้างแน่ใจว่า EXT จะไม่ทำงานกับทุกสิ่งที่อยู่ใกล้กับ 1 พันล้านใน dir เดียวกัน
Hrvoje Špoljar

1
ฉันได้ยิน reiserfs นั้นดีสำหรับไฟล์ขนาดเล็ก แต่แล้วฉันก็ได้ยินคนที่ดูแลซอฟต์แวร์อยู่ในคุก (!) ดังนั้นอนาคตของ reiserfs นั้นค่อนข้างไม่แน่นอน โดยส่วนตัวฉันจะใช้ EXT4 และ XFS เป็นตัวเลือกที่สอง XFS นั้นดีที่สุดสำหรับไฟล์ขนาดใหญ่หรือไม่?
บทกวี

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