นี่คือคำอธิบายเกี่ยวกับวิธีการfdatasync()
ทำงานกับวิธีการfsync()
ทำงาน
fdatasync()
ล้างข้อมูลบัฟเฟอร์ทั้งหมดของไฟล์ไปยังดิสก์ (ก่อนที่การเรียกระบบจะส่งคืน) มีลักษณะคล้ายกันfsync()
แต่ไม่จำเป็นต้องอัปเดตข้อมูลเมตาเช่นเวลาเข้าถึง แอปพลิเคชันที่เข้าถึงฐานข้อมูลหรือไฟล์บันทึกมักจะเขียนชิ้นส่วนข้อมูลขนาดเล็ก (เช่นหนึ่งบรรทัดในไฟล์บันทึก) จากนั้นโทรfsync()
ทันทีเพื่อให้มั่นใจว่าข้อมูลที่เขียนถูกจัดเก็บไว้ในฮาร์ดดิสก์ น่าเสียดายที่fsync()
จะเริ่มการเขียนสองครั้งเสมอ
- การเขียนหนึ่งครั้งสำหรับข้อมูลที่เขียนใหม่
- การเขียนหนึ่งครั้งเพื่ออัปเดตเวลาแก้ไขที่เก็บไว้ในไอโหนด
หากเวลาการแก้ไขไม่ใช่ส่วนหนึ่งของแนวคิดการทำธุรกรรมคุณfdatasync()
สามารถใช้เพื่อหลีกเลี่ยงการเขียนดิสก์ inode ที่ไม่จำเป็น
ในภาษาอังกฤษO_DSYNC
จะเร็วกว่าO_DIRECT
นับตั้งแต่การO_DIRECT
โทรfsync()
สองครั้ง (หนึ่งสำหรับบันทึกและหนึ่งสำหรับข้อมูล) และfsync()
ตรวจสอบข้อมูลการเขียนผ่านการดำเนินการเขียนที่สอง ใช้O_DSYNC
สายและfdatsync()
fsync()
คุณสามารถคิดว่าfdatasync()
ทำแบบอะซิงโครนัสfsync()
(ไม่ใช่ข้อมูล verfying)
ดูที่ตัวเลขO_DSYNC
เขียน ops สี่ตัวซึ่งสองตัวผ่านการตรวจสอบแล้วในขณะที่ทำการfsync()
เขียนสี่ครั้งทั้งหมดจะถูกตรวจสอบในภายหลัง
สรุปผลการศึกษา
O_DSYNC
- เร็วกว่า
O_DIRECT
- ข้อมูลอาจ / อาจไม่สอดคล้องกันเนื่องจากความล่าช้าหรือความผิดพลาดทันที
O_DIRECT
- มีเสถียรภาพมากขึ้น
- ข้อมูลที่สอดคล้องกัน
- ช้าลงตามธรรมชาติ
ฉันหวังว่าคำตอบนี้จะช่วยได้และฉันหวังว่าฉันจะไม่ทำสิ่งที่เลวร้ายสำหรับคุณ