การใช้ O_DIRECT บน Linux


23

หากคำถามนี้เป็นเชิงโปรแกรมเมอร์เกินไปแจ้งให้เราทราบ ฉันสงสัยว่ามีคนคุ้นเคยกับการตั้งค่าสถานะ O_DIRECT สำหรับการเรียกระบบ open () บน Linux 2.6 หรือไม่? ไลนัสดูถูกการใช้งาน แต่การเขียนไฟล์ประสิทธิภาพสูงดูเหมือนจะบ่งบอกถึงการใช้งาน ฉันต้องการทราบประสบการณ์และคำแนะนำในโลกแห่งความเป็นจริงใด ๆ

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

คำตอบ:


17

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

Linus กล่าวว่าการอ้างถึงการใช้งานที่ผู้คนมักจะอ้างถึง O_DIRECT และสำหรับการใช้งานเหล่านั้น IMO Linus นั้นถูกต้องที่สุด แม้ว่าคุณจะสั่ง I / O โดยตรง แต่คุณไม่สามารถถ่ายโอนข้อมูลไปยัง / จากอุปกรณ์โดยตรงไปยังคำสั่งโปรแกรมของคุณคุณต้องมีบัฟเฟอร์ที่เต็มไปด้วย (โดยโปรแกรมหรืออุปกรณ์) และโอนผ่านการเรียกระบบไปยังอีกปลายหนึ่ง นอกจากนี้เพื่อให้มีประสิทธิภาพคุณจะไม่ต้องการอ่านสิ่งที่คุณเพิ่งอ่านไปใหม่ในกรณีที่คุณต้องการอีกครั้ง ดังนั้นคุณต้องมีแคชบางอย่าง ... และเป็นสิ่งที่เคอร์เนลจัดเตรียมไว้โดยไม่มี O_DIRECT แคชหน้า! ทำไมไม่ใช้มัน มันยังมาพร้อมกับประโยชน์หากกระบวนการเพิ่มเติมต้องการเข้าถึงไฟล์เดียวกันพร้อมกันมันจะเป็นความหายนะกับ O_DIRECT

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

คนที่ใช้ O_DIRECT เพื่อประสิทธิภาพมักมาจากระบบที่มีอัลกอริธึมแคชเพจที่ไม่ดีหรือไม่มีกลไกการแนะนำ POSIX หรือแม้แต่คนที่ทำซ้ำสิ่งที่คนอื่นพูด เพื่อหลีกเลี่ยงปัญหาเหล่านี้ O_DIRECT เป็นวิธีแก้ปัญหา Linux, OTOH มีปรัชญาที่คุณควรแก้ไขปัญหาพื้นฐานที่แท้จริงและปัญหาพื้นฐานคือระบบปฏิบัติการที่ทำงานได้ไม่ดีเมื่อมีการแคชหน้า

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


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

4
o_direct อาจมีประโยชน์ในระบบที่ผู้พัฒนาต้องการจัดเตรียมกลไกการแคชที่ชั้นแอปพลิเคชัน (คิดว่าฐานข้อมูล)
Jmoney38

มันไม่เกี่ยวอะไรกับประสิทธิภาพ นั่นไม่ใช่ความจริงเสมอไปโดยเฉพาะอย่างยิ่งสำหรับการเข้าถึงอุปกรณ์ความเร็วสูงที่อัตรา IO แบนด์วิดธ์หน่วยความจำของคู่แข่งหรือแม้แต่เพียงร้อยละที่สำคัญของแบนด์วิดธ์หน่วยความจำ ในกรณีดังกล่าวการข้ามสำเนาพิเศษไปยัง / จากหน้าแคชอาจมีประโยชน์ด้านประสิทธิภาพอย่างมาก
Andrew Henle

13

อันที่จริงO_DIRECT เป็นสิ่งจำเป็นที่จะหลีกเลี่ยงการอย่างใดอย่างหนึ่ง

  • มลพิษแคช - บางครั้งคุณรู้ว่าไม่มีความรู้สึกในค่าใช้จ่ายกับแคชเช่นเมื่อจัดการกับไฟล์ที่มีขนาดใหญ่มากพูด 64 GiB เมื่อมี RAM เพียง 2 GiB ไฟล์ Torrent ขนาด 32 GiB ที่ผู้ใช้ตัดสินใจในการตรวจสอบดูเหมือนจะเป็นตัวเลือกที่ดีสำหรับการแคช มันเป็นเพียงกิจกรรมพิเศษที่มีค่าใช้จ่ายของตัวเอง และอาจทำให้ข้อมูลที่มีประโยชน์บางอย่างถูกตัดออกจากแคช
  • double caching - ตัวอย่างเช่น RDBMS บางตัว (MySQL พูดถึง) อนุญาตให้กำหนดแคชของตัวเอง ฐานข้อมูลควรรู้วิธีการแคชและสิ่งที่ดีกว่าหน่วยความจำเสมือนของเคอร์เนลซึ่งไม่รู้เกี่ยวกับการวางแผน SQL และอื่น ๆ

- ซึ่งไม่ดีอย่างที่เห็น และO_DIRECTไม่ได้หมายความว่าจะได้เร็วขึ้นมักจะเป็นไม่ได้


10
posix_fadviseสามารถดูแลปัญหามลพิษแคช
psusi

ฉันไม่คิดว่าหน่วยความจำเสมือนมีส่วนเกี่ยวข้องกับมันเพียงแมปที่อยู่หน่วยความจำ Buffer Cache / Page Cache คือสิ่งที่คุณหมายถึง
ArekBulski

แคช / แคชเป็นส่วนหนึ่งของระบบย่อย VM ใน UNIX เท่าที่ฉันจะบอกได้นั่นคือเหตุผลที่ฉันใช้คำนี้ ขอบคุณสำหรับการแก้ไข :)
poige

6

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


1
รายงานข้อผิดพลาดจะกล่าวถึงการใช้ระบบไฟล์ด้วยตัวเลือก journal = data ตัวเลือกนี้ตรงกันข้ามกับผลกระทบโดยตรงกับการตั้งค่าสถานะ O_DIRECT ระบบไฟล์ ext3 และ ext4 ส่วนใหญ่ไม่มีชุดแฟล็กนี้และหากปิดการตั้งค่าจะอนุญาตให้เปิดไฟล์ด้วย O_DIRECT
casualunixer

3

มันมีเรื่องเกี่ยวกับประสิทธิภาพมากมาย

ตัวอย่างที่น่าสนใจคือ mongodb โดยใช้เครื่องมือ mmap O_DIRECT ใช้งานได้ดีที่สุดตามที่คนอื่นได้ระบุไว้ซึ่งข้อมูลไม่น่าจะถูกอ่านได้ในบางครั้ง ใน mongodb สมุดรายวันฐานข้อมูลจะถูกเขียนโดยใช้ O_DIRECT ในขณะที่ข้อมูลและดัชนีการเขียนถูกจัดการโดยกลไกแคชของหน้า (pdflush) เพราะถึงแม้ว่า O_DIRECT จะเสนอแบนด์วิดท์น้อยลง แต่ก็หมายถึงเวลาแฝงที่น้อยลง ไฟดับที่ไม่คาดคิด (เคอร์เนลตกใจดิสก์หรือไฟฟ้าขัดข้อง) โปรดทราบว่ายังคงมีบัฟเฟอร์ก่อนการเขียน O_DIRECT มุ่งมั่นที่จะจัดเก็บแบบไม่ลบเลือนนี่เป็นเพียงการลดการสูญเสียข้อมูล

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

แต่สิ่งสำคัญที่ต้องจำไว้คือ O_DIRECT ทำลายความเป็นธรรมในการจัดสรรทรัพยากร สาเหตุหนึ่งที่แอปพลิเคชันของคุณเร่งความเร็วคือมันทำให้สิ่งอื่น ๆ ช้าลง


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

คุณสามารถให้การอ้างอิงเพิ่มเติมเพื่ออธิบายเมื่อมันไม่ยุติธรรมหรือไม่?
วัฏจักร

3

เกี่ยวข้องกับสิ่งที่ @Juliano ได้พูดไปแล้ว

ชำระเงินposix_fadviseหากปัญหาที่เกิดขึ้นจริงเป็นพฤติกรรมที่ไม่เหมาะสมของอัลกอริทึมแคชของระบบไฟล์พื้นฐานคุณสามารถลองให้คำแนะนำวิธีที่คุณจะใช้ระบบไฟล์ สำหรับ fs ที่ถูกนำมาใช้อย่างดีควรเพิ่มประสิทธิภาพ (นี่คือลิงค์ไปยังหัวข้ออื่นที่มีการพิจารณาคล้ายกัน/programming//a/3755818/544721 )


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