ในหนึ่งในสภาพแวดล้อมการผลิตของฉันเรามีสองอินสแตนซ์ที่ทำงานบนคลัสเตอร์ RedHat โดยมีหนึ่งอินสแตนซ์การผลิตที่เกี่ยวข้องกับคลัสเตอร์
เรามีหน่วยความจำหลัก 125G พร้อมพูลบัฟเฟอร์ InnoDB 24G ซึ่งครอบครองโดย instance1 & 12G ที่ครอบครองโดย instance2 ซึ่งไม่เกี่ยวข้องกับคลัสเตอร์ RedHat ทั้งข้อมูลและบันทึกธุรกรรมอยู่บนพาร์ติชั่นดิสก์ LVM พร้อมระบบไฟล์ ext3
สำหรับการเพิ่มประสิทธิภาพการทำงานที่ดีขึ้นและ I / O throughput ที่ฉันได้ตัดสินใจที่จะเปลี่ยนแปลงไปinnodb_flush_method
O_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 วินาที)