ในหนึ่งในสภาพแวดล้อมการผลิตของฉันเรามีสองอินสแตนซ์ที่ทำงานบนคลัสเตอร์ RedHat โดยมีหนึ่งอินสแตนซ์การผลิตที่เกี่ยวข้องกับคลัสเตอร์
เรามีหน่วยความจำหลัก 125G พร้อมพูลบัฟเฟอร์ InnoDB 24G ซึ่งครอบครองโดย instance1 & 12G ที่ครอบครองโดย instance2 ซึ่งไม่เกี่ยวข้องกับคลัสเตอร์ RedHat ทั้งข้อมูลและบันทึกธุรกรรมอยู่บนพาร์ติชั่นดิสก์ LVM พร้อมระบบไฟล์ ext3
สำหรับการเพิ่มประสิทธิภาพการทำงานที่ดีขึ้นและ I / O throughput ที่ฉันได้ตัดสินใจที่จะเปลี่ยนแปลงไปinnodb_flush_methodO_DIRECT
อ้างอิงจากเอกสารของ MySQL:
ที่ข้อมูล InnoDB และไฟล์เข้าสู่ระบบตั้งอยู่บน SAN จะได้รับพบว่าการตั้งค่า
innodb_flush_methodเพื่อO_DIRECTประสิทธิภาพสามารถลดง่ายSELECTงบโดยปัจจัยที่สาม
หมายถึงการที่มีประสิทธิภาพสูง MySQL Ver 2 และ 3 มันบอกว่านักพัฒนา InnoDB innodb_flush_method=O_DSYNCพบข้อบกพร่องเกี่ยวกับการใช้ O_SYNCและO_DSYNCคล้ายกับfsync()และfdatasync(): O_SYNCซิงค์ทั้งข้อมูลและเมตาดาต้าในขณะที่O_DSYNCซิงค์ข้อมูลเท่านั้น
ถ้านั่นดูเหมือนคำอธิบายมากมายโดยไม่มีคำแนะนำนี่คือคำแนะนำ:
ถ้าคุณใช้ระบบปฏิบัติการยูนิกซ์เหมือนระบบปฏิบัติการและควบคุม RAID ของคุณมี writecache
O_DIRECTแบตเตอรี่สำรองเราขอแนะนำให้คุณใช้ หากไม่เป็นเช่นนั้นค่าเริ่มต้นหรือO_DIRECTอาจเป็นตัวเลือกที่ดีที่สุดขึ้นอยู่กับแอปพลิเคชันของคุณ
โดย googling ฉันได้รับรายงานเปรียบเทียบนี้: O_DSYNCเทียบกับO_DIRECT
Bench Mark Report: =================== การทดสอบการทำธุรกรรมที่ซับซ้อน 1B Row, 64 เธรด * SAN O_DIRECT: คำขออ่าน / เขียน: 31560140 (8766.61 ต่อวินาที) * SAN O_DSYNC: คำขออ่าน / เขียน: 5179457 (1438.52 ต่อวินาที) * SAN fdatasync: คำขออ่าน / เขียน: 9445774 (2623.66 ต่อวินาที) * Local-disk O_DIRECT: คำขอการอ่าน / เขียน: 3258595 (905.06 ต่อวินาที) * Local-disk O_DSYNC: คำขออ่าน / เขียน: 3494632 (970.65 ต่อวินาที) * Local-disk fdatasync: คำขออ่าน / เขียน: 4223757 (1173.04 ต่อวินาที
อย่างไรก็ตามO_DIRECTปิดการใช้งานแคชระดับระบบปฏิบัติการที่สามารถทำการแคชซ้ำซึ่งแสดงปริมาณงาน I / O ที่ดีขึ้น
เป็นการดีที่จะไปกับO_DIRECTมากกว่าO_DSYNC? ตัวเลือกทั้งสองนี้ค่อนข้างสับสน ตัวเลือกใดสามารถแสดงปริมาณงาน I / O ที่ดีขึ้นและการปรับปรุงประสิทธิภาพโดยไม่ส่งผลกระทบต่อข้อมูลอ่าน / เขียนโดยเฉพาะในการผลิต มีคำแนะนำที่ดีกว่าจากประสบการณ์ส่วนตัวของคุณหรือไม่?
ฉันเห็น Rolando Update ในโพสต์ :
ยังคงมีความสับสนเล็กน้อยในพารามิเตอร์ทั้งสองนี้ ที่ฉันจะได้เห็นส่วนใหญ่ของแม่แบบการผลิตการกำหนดค่าใช้
O_DIRECTฉันไม่ได้เห็นใด ๆO_DSYNCที่แนะนำ
ระบบ
- MySQL 5.1.51-enterprise-gpl-pro-log
- Red Hat Enterprise Linux Server รีลีส 5.5
- DELL DRAC พร้อม Raid Controller ที่มีแคชการเขียนกลับแบตเตอรี่ 512MB
- คอนโทรลเลอร์ Dell PERC H700 พร้อมแบตเตอรี่สำรอง (BBU)
ข้อมูลเพิ่มเติม
mysql> แสดงตัวแปรเช่น 'innodb_thread_concurrency'; + --------------------------- + ------- + | Variable_name | ค่า | + --------------------------- + ------- + | innodb_thread_concurrency | 96 | + --------------------------- + ------- + 1 แถวในชุด (0.00 วินาที) mysql> แสดงตัวแปรเช่น 'innodb_read_io_threads'; ชุดว่าง (0.00 วินาที) mysql> แสดงตัวแปรเช่น 'innodb_write_io_threads'; ชุดว่าง (0.00 วินาที)
เราใช้ปลั๊กอินเริ่มต้นดังนั้นฉันได้โพสต์ข้อมูลจากสถานะ InnoDB:
mysql> SELECT * จากปลั๊กอิน WHERE PLUGIN_NAME ต้องการ '% innodb%' และ PLUGIN_TYPE เช่น 'STORAGE ENGINE' \ G
★★ *******
PLUGIN_NAME: InnoDB
PLUGIN_VERSION: 1.0
PLUGIN_STATUS: ใช้งานอยู่
PLUGIN_TYPE: STORAGE ENGINE
PLUGIN_TYPE_VERSION: 50151.0
PLUGIN_LIBRARY: NULL
PLUGIN_LIBRARY_VERSION: NULL
PLUGIN_AUTHOR: Innobase OY
PLUGIN_DESCRIPTION: รองรับธุรกรรมล็อคระดับแถวและปุ่มต่างประเทศ
PLUGIN_LICENSE: GPL
1 แถวในชุด (0.00 วินาที)