แคชการเขียนทำงานอย่างไรกับระบบไฟล์ซึ่งประกอบด้วยดิสก์ที่มีความเร็วแตกต่างกัน


9

บนระบบ Linux ที่ทันสมัยที่มีดิสก์หลายตัวและซอฟต์แวร์ RAID ซึ่งครอบคลุมทั้งไดรฟ์ช้า (HDD) และไดรฟ์ (SSD) ที่รวดเร็วจะเขียนไปยังระบบไฟล์ที่แคชอย่างไร

สำหรับ MD-RAID RAID1 อาร์เรย์สามารถกำหนดค่าด้วยดิสก์--write-mostlyและ--write-behindซึ่งแสดงให้เห็นว่าจะดำเนินการอ่านจากดิสก์ได้เร็วขึ้นและการเขียนไปยังดิสก์ช้าที่สามารถล้าหลัง แต่ที่แคชในระดับ kernel อย่างไร เคอร์เนลแคชดิสก์เขียนก่อนหรือหลังเลเยอร์ md-raid หรือไม่ ในตอนท้ายของการเรียกการเขียน () เป็นข้อมูลที่รับประกันว่าจะถูกเขียนลงในหนึ่งใน--write-behindดิสก์?

สำหรับbtrfsRAID1 สถานการณ์เดียวกันจะเล่นอย่างไร ไม่มี--write-behindหน้าที่การใช้งานจึงนับหน้าสกปรกที่ระดับอุปกรณ์หรือระดับระบบไฟล์หรือไม่ การเขียน () จะกลับมาที่จุดใด

ค่าที่vm.dirty_*ratioปรับได้มีผลกับการตั้งค่าเหล่านี้อย่างไร

คำตอบ:


7

--write-mostly, --write-behindจะถูกจัดการโดยmdคนขับภายใน mdเก็บข้อมูลเมตาเช่นบิตแมปการเขียนตั้งใจ (ซึ่งเป็นสิ่งจำเป็นสำหรับคุณลักษณะการเขียนไม่เขียน) ซึ่งโดยทั่วไปจะบันทึกว่าข้อมูลใดที่ถูกเขียนเปรียบเทียบกับข้อมูลใดที่ยังขาดหายไป นี่เป็นสิ่งจำเป็นในกรณีที่มีเหตุการณ์การสูญเสียพลังงานเมื่อข้อมูลยังไม่ถึงอุปกรณ์ที่เขียนส่วนใหญ่ ในกรณีนั้นพื้นที่ข้อมูลที่ได้รับผลกระทบจะถูกซิงค์อีกครั้ง (ในกรณีของคุณอ่านจาก SSD เขียนไปยัง HDD)

แต่ที่แคชในระดับ kernel อย่างไร

สำหรับกรณี write-behind ไดรเวอร์ md โดยทั่วไปจะทำซ้ำคำร้องขอการเขียนภายใน คำขอเขียนหลักไปที่ไดรฟ์หลักและบอกเลเยอร์ด้านบน "ตกลงฉันทำสิ่งนี้ไปแล้ว"; การร้องขอการเขียนที่คัดลอกนั้นจะอยู่ด้านข้างของการเขียนส่วนใหญ่ด้านหลังของ RAID และอาจใช้เวลานานกว่าจะเสร็จสมบูรณ์โดยหวังว่าจะไม่มีใครสังเกตเห็น

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

ซึ่งอาจเป็นสาเหตุที่รองรับเฉพาะระดับ RAID-1 เท่านั้น แม้ว่าในทางทฤษฎีแล้วมันอาจมีเหตุผลที่จะมี SSD เป็น RAID-0 และ HDD สองพาริตี้ในโหมด write-behind แต่ก็ไม่ได้รับการสนับสนุนสำหรับ RAID-6 แบบเขียนหลัง มันเป็น RAID-1 เท่านั้นและไม่ค่อยได้ใช้แม้กระทั่งที่นั่น

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


3

สำหรับ MD-RAID RAID1 อาร์เรย์สามารถกำหนดค่าด้วยดิสก์--write-mostlyและ--write-behindซึ่งแสดงให้เห็นว่าจะดำเนินการอ่านจากดิสก์ได้เร็วขึ้นและการเขียนไปยังดิสก์ช้าที่สามารถล้าหลัง แต่ที่แคชในระดับ kernel อย่างไร เคอร์เนลแคชดิสก์เขียนก่อนหรือหลังเลเยอร์ md-raid หรือไม่

หลังจากนั้นเนื่องจากฟีเจอร์นี้เฉพาะสำหรับ md-raid

คุณควรคิดถึงคุณสมบัติของ md-raid ว่าเป็นการบัฟเฟอร์ไม่ใช่การแคช มันถูกล้อมรอบด้วยmdadmตัวเลือกต่อไปนี้:

--write หลัง =

ระบุว่าควรเปิดใช้งานโหมด write-behind (ใช้ได้กับ RAID1 เท่านั้น) หากมีการระบุอาร์กิวเมนต์อาร์กิวเมนต์จะตั้งค่าจำนวนการเขียนค้างที่สูงสุดที่อนุญาต ค่าเริ่มต้นคือ 256

ฉันคิดได้เพียงว่ามันถูก จำกัด โดยเคอร์เนลปกติและการบัฟเฟอร์ฮาร์ดแวร์ บัฟเฟอร์เคอร์เนลปกติเป็นที่สิ้นสุดโดยและnr_requests ดูmax_hw_sectors_kb /sys/class/block/$write_behind_device/queue/โดยการบัฟเฟอร์ฮาร์ดแวร์ฉันหมายถึงแคชการเขียนบนไดรฟ์

ในตอนท้ายของการเรียกการเขียน () เป็นข้อมูลที่รับประกันว่าจะถูกเขียนไปยังหนึ่งใน--write-behindดิสก์?

แน่นอนสมมติว่าคุณหมายถึงการเขียน () อยู่ในไฟล์ที่เปิดด้วย O_SYNC / O_DSYNC หรือคุณหมายถึงการเขียน () + fsync () จริง ๆ ถ้าไม่รับประกันจะไม่มีผลเลย


ขอบคุณ แต่นั่นทำให้เกิดคำถามอื่น: หากไฟล์ถูกเปิดด้วย O_SYNC การเขียน () จะคืนกลับมาหลังจากที่มีการเขียนดิสก์แรกหรือมีการเขียนดิสก์ทั้งหมดในกรณีนี้หรือไม่
Steve

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