Linux: มีกี่ดิสก์ I / O ที่ใช้ในการอ่านไฟล์ จะลดได้อย่างไร? [ซ้ำ]


10

ตามบทความนี้ใน Haystack ของ Facebook:

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

ฉันสันนิษฐานว่าเมตาดาต้าไดเรกทอรีระบบแฟ้ม & inode จะถูกแคชใน RAM โดยระบบปฏิบัติการและการอ่านไฟล์มักจะต้องใช้เพียง 1 ดิสก์ IO

นี่เป็นปัญหา "หลายดิสก์ของ IO เพื่ออ่านไฟล์เดียว" ซึ่งระบุไว้ในกระดาษเฉพาะของเครื่องใช้ NAS หรือ Linux มีปัญหาเดียวกันหรือไม่

ฉันวางแผนที่จะเรียกใช้เซิร์ฟเวอร์ Linux สำหรับแสดงรูปภาพ วิธีใดที่ฉันสามารถลดจำนวนดิสก์ IO - ให้แน่ใจว่าระบบปฏิบัติการแคชเก็บข้อมูลไดเรกทอรี & inode ทั้งหมดใน RAM และการอ่านแต่ละไฟล์จะต้องใช้ดิสก์ IO ไม่เกิน 1 เท่านั้น


1
ไม่ใช่คำตอบสำหรับคำถาม แต่คุณสามารถใช้น้ำยาวานิช (Facebook ใช้) ซึ่งเก็บรักษาไฟล์ในหน่วยความจำ ด้วยวิธีนี้หากภาพหนึ่งภาพร้อน (คำขอจำนวนมากไปยังไฟล์เดียวกัน) ดิสก์ IO จะไม่ถูกนำมาใช้เพื่อให้บริการ

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

ระบบไฟล์จำนวนมากเก็บ inode ไว้ในไดเรกทอรีลดจำนวนคำขอลงหนึ่งรายการและเพิ่มโอกาสที่จะเกิดการเข้าใช้แคช แต่นี่ไม่ใช่คำถามการเขียนโปรแกรม
Ben Voigt

คุณสามารถเปลี่ยนขนาดบล็อกของระบบไฟล์เมื่อสร้างมันเช่นกับmke2fs -b 32768เพื่อให้มัน 32k อย่างไรก็ตามสิ่งนี้มีประโยชน์เฉพาะเมื่อคุณไม่มีไฟล์ขนาดเล็กในระบบไฟล์นั้น

คำตอบ:


5

Linux มี "ปัญหา" เหมือนกัน นี่เป็นรายงานเกี่ยวกับนักเรียนของฉันที่ตีพิมพ์เมื่อสองปีก่อนที่แสดงผลบน Linux IOs หลายตัวสามารถมาจากหลายแหล่ง:

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

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

นี่คือความคิดบางอย่าง:

1) ความช่วยเหลือเกี่ยวกับระบบไฟล์แคช แคชขนาดใหญ่จะดูดซับการอ่านส่วนใหญ่ อย่างไรก็ตามหากคุณต้องการใส่ดิสก์หลายแผ่นในเครื่องอัตราส่วน Disk-to-RAM จะ จำกัด จำนวนแคช

2) อย่าใช้ไฟล์ขนาดเล็กหลายล้านไฟล์ รวมเข้ากับไฟล์ที่มีขนาดใหญ่ขึ้นและจัดเก็บชื่อไฟล์และออฟเซ็ตภายในไฟล์

3) วางหรือแคชข้อมูลเมตาบน SSD

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

การทำให้ไดเรกทอรีมีขนาดเล็ก (น้อยกว่า 1,000 หรือมากกว่านั้น) ไม่ควรช่วยอะไรมากเพราะคุณจะต้องมีไดเรกทอรีมากขึ้นและจำเป็นต้องถูกแคชไว้


และแน่นอนว่าใช้ระบบไฟล์ที่ไม่มีรูปแบบไดเรกทอรีบนดิสก์แบบโบราณทั้งหมด readdir ไม่ควรใช้เวลามากกว่าเชิงเส้นและการเข้าถึงไฟล์โดยตรงควรจะเป็นเวลาลอการิทึมเท่านั้น
jørgensen

ฉันเพิ่มเข้าไปในคำตอบว่าเป็นจุดที่ 4
dmeister

@dister สิ่งที่ดี +1
Magellan

@dmeister ลิงก์ของคุณเสียชีวิต
Don Scott

1

ขึ้นอยู่กับระบบไฟล์ที่คุณวางแผนจะใช้ ก่อนอ่านระบบข้อมูลไฟล์:

  • อ่านไฟล์ไดเรกทอรี
  • อ่าน inode ของไฟล์ของคุณ
  • อ่านส่วนของไฟล์ของคุณ

หากโฟลเดอร์มีไฟล์จำนวนมากแสดงว่าเป็นการแคชล่วงหน้า


หากคุณมีรายชื่อ I / O เข้าถึงมันอาจจะน่าสนใจมากขึ้นที่จะแยกผู้ที่ดำเนินการโดยจากผู้ที่ดำเนินการโดยopen() read()หน้าwin.tue.nl/~aeb/linux/vfs/trail.htmlแสดงให้เห็นถึงแนวทางที่ดีของแนวคิดเคอร์เนลต่างๆที่เกี่ยวข้อง (บางทีมันอาจจะล้าสมัยฉันจะไม่สามารถที่จะบอก?.)
ADL

0

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

ที่กล่าวว่าฉันคิดว่าปุ่มvfs_cache_pressureใช้เพื่อควบคุมสิ่งนี้ "เมื่อ vfs_cache_pressure = 0 เคอร์เนลจะไม่เรียกคืนเดนส์และ inodes เนื่องจากความดันหน่วยความจำและสิ่งนี้สามารถนำไปสู่สภาวะหน่วยความจำไม่เพียงพอ"

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