ชี้แจงเกี่ยวกับตัวแปร MySQL innodb_flush_method


21

ให้ฉันเริ่มต้นด้วยการยอมรับว่าฉันไม่รู้งานด้านในของฮาร์ดดิสก์ ดังนั้นเมื่อฉันอ่านคู่มือสำหรับตัวแปรinnodb_flush_methodมันทำให้ฉันสับสน ฉันสามารถขอคำอธิบายในแง่ของคนธรรมดาในความแตกต่างใน O_DSYNC และ O_DIRECT และวิธีการที่จะรู้ว่ามันเป็นปัญหาประสิทธิภาพการทำงานบนเซิร์ฟเวอร์ฐานข้อมูล

สถิติบางอย่างเกี่ยวกับการตั้งค่าของฉัน: Mac OSX 10.6 (เคอร์เนล 32 บิตเนื่องจากสถาปัตยกรรมล้าสมัย) ที่ใช้ MySQL 5.1.49-64 บิต (หวังว่ามันจะช่วยให้ฉันใช้หน่วยความจำได้) 8GB RAM, ~ 6GB ของข้อมูล / ดัชนี Innodb


2
ฉันไม่รู้ว่า Mac OS X รองรับตัวเลือก IO โดยตรงที่เหมาะสมหรือไม่ - ฉันไม่คิดว่าจะเป็นเช่นนั้น คุณเป็นคนที่สองที่ฉันเห็นวันนี้สับสนโดยหน้าคู่มือนั้น ฉันมีบั๊กแบบเปิดอยู่ที่นี่: bugs.mysql.com/bug.php?id=54306
Morgan Tocker

คำตอบ:


16

นี่คือคำอธิบายเกี่ยวกับวิธีการ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
    • มีเสถียรภาพมากขึ้น
    • ข้อมูลที่สอดคล้องกัน
    • ช้าลงตามธรรมชาติ

ฉันหวังว่าคำตอบนี้จะช่วยได้และฉันหวังว่าฉันจะไม่ทำสิ่งที่เลวร้ายสำหรับคุณ


2
น่าจะชี้ให้เห็น: O_DIRECT จะใช้เฉพาะในไฟล์พื้นที่ตารางไม่ใช่ในบันทึก นอกจากนี้ - ไม่ว่า O_DIRECT จะเป็นประโยชน์หรือไม่ขึ้นอยู่กับฮาร์ดแวร์ ฉันเชื่อมโยงกับข้อผิดพลาดเอกสารเปิดเป็นความคิดเห็นกับคำถามของผู้เขียน
Morgan Tocker

ขอบคุณสำหรับการชี้แจงว่ามอร์แกน ฉันจะแก้ไขสิ่งนี้
RolandoMySQLDBA

O_DSYNC คือการเขียนแบบซิงโครนัสคุณจะสรุปได้อย่างไรว่าเร็วกว่าอะซิงโครนัส + fsync
noonex

@noonex fdatasync () มีการซิงโครนัสสำหรับข้อมูลไม่ใช่ข้อมูลเมตา ตามinformit.com/articles/article.aspx?p=23618&seqNum=5 , This means that in principal, fdatasync can execute faster than fsync because it needs to force only one disk write instead of two. However, in current versions of Linux, these two system calls actually do the same thing, both updating the file's modification time.ในขณะที่ผมโพสต์ของฉัน 3.5 ปีที่ผ่านมามันเป็นความจริงโดยเฉพาะอย่างยิ่งกับรุ่นเก่าของลินุกซ์
RolandoMySQLDBA

@noonex ตามen.wikipedia.org/wiki/Sync_(Unix) , The related system call fsync() commits just the buffered data relating to a specified file descriptor. fdatasync() is also available to write out just the changes made to the data in the file, and not necessarily the file's related metadata.(Wiki นั้นได้รับการปรับปรุงล่าสุดเมื่อวันที่ 28 กรกฎาคม 2014)
RolandoMySQLDBA
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.