การตั้งค่า MySQL InnoDB page_cleaner อาจไม่เหมาะสม


17

เห็นหมายเหตุนี้ใน mysqld.log:

[Note] InnoDB: page_cleaner: 1000ms intended loop took 15888ms. The settings might not be optimal. (flushed=200 and evicted=0, during the time.)

ดูเหมือนว่าจะมีการพูดถึงบางสิ่งเช่นนี้: MySQL อินสแตนซ์ถ่วง "ทำดัชนี SYNC"

คำถามของฉันคือ:ควรมีการดำเนินการใดบ้างหากมีเมื่อเห็นบันทึกนี้ในบันทึก

รุ่น MySQL และ OS:
mysql-community-server- 5.7.9 -1.el7.x86_64
centos-release-7-1.1503.el7.centos.2.8.x86_64

กำลังแสดงตัวแปรต่างๆเช่น 'innodb%'; ตามที่แนะนำแสดงให้เห็น:

innodb_page_cleaners | 1

คำตอบ:


11

ค่าดีฟอลต์ของ innodb_page_cleaners เปลี่ยนจาก 1 เป็น 4 ใน MySQL 5.7.8 หากจำนวนเธรดการล้างหน้าเกินจำนวนอินสแตนซ์บัฟเฟอร์พูล innodb_page_cleaners จะถูกตั้งค่าเป็นค่าเดียวกันโดยอัตโนมัติเช่นเดียวกับ innodb_buffer_pool_instances

ตรวจสอบ innodb_buffer_pool_instance ด้วย:

mysql> SHOW GLOBAL VARIABLES LIKE 'innodb_buffer_pool_instances'

คุณสามารถตั้งค่าได้เพียงสูงที่สุดเท่าที่innodb_page_cleaners innodb_buffer_pool_instancesถ้าคุณต้องการแล้วคุณยังต้องinnodb_page_cleaners=4innodb_buffer_pool_instances=4


2
ดีฉันมีทั้ง innodb_buffer_pool_instances และ innodb_page_cleaners ตั้งค่าเป็น 8 และฉันเห็นคำเตือนเป็นครั้งคราว มันเป็นเพียงแค่พวงของเดสก์ท็อปลายขวางดิสก์หมุนระหว่าง i / o หนักเช่นตารางการปรับให้เหมาะสมและคล้ายกันฉันเดาว่ามันเป็นวิธีที่บอบบางของ mysql ในการบอกคุณว่าดิสก์ของคุณช้าเกินไป;)
Aleksandar Ivanisevic

5

เราประสบปัญหาเดียวกันในไคลเอนต์ที่หลากหลายและพบว่าปัญหาเกิดจากการตั้งค่าของinnodb_lru_scan_depthจากค่าเริ่มต้นที่ 1024 ถึงต่ำถึง 128 ถึงแม้ว่าการลดค่าจะช่วยลดเวลาในการประมวลผลธุรกรรมโดยเฉพาะอย่างยิ่งในการเขียนปริมาณงานที่ถูกผูกไว้ ฉันเชื่อว่าการตั้งค่าต่ำเกินไปจะทำให้บัฟเฟอร์พูลไม่สามารถติดตามการล้างบัฟเฟอร์และหน้าบัฟเฟอร์พูลบางบัฟเฟอร์ได้

ในกรณีของเราเราเห็นการปรับปรุงที่รุนแรงโดยการเพิ่มค่าจาก 128 เป็น 256 แต่โดยทั่วไปแล้วค่าที่ถูกต้องขึ้นอยู่กับฮาร์ดแวร์และประเภทของการโหลด เคล็ดลับคือการหาค่าที่เหมาะสมระหว่างการเพิ่มประสิทธิภาพ OLTP และให้ MySQL รักษาบัฟเฟอร์พูลไว้เพื่อไม่ให้page_cleanerจำเป็นต้องทำงานมากตามที่ระบุไว้ในข้อความด้านบน ( "InnoDB: page_cleaner: 1000ms loop loop ใช้เวลา 15888 มิลลิวินาที " )

ค่าสามารถเปลี่ยนแปลงได้แบบไดนามิกโดยไม่ต้องรีสตาร์ท MySQL เช่น

SET GLOBAL innodb_lru_scan_depth=256;

1
หากฉันรีสตาร์ท MySQL innodb_lru_scan_depth ส่งคืนกลับเป็น 1024 ดังนั้นจะเปลี่ยนอย่างถาวรได้อย่างไร
Karim Samir

@KarimSamir เพิ่มที่innodb_lru_scan_depth = 256ใดที่หนึ่งในmy.cnfเส้นทางโหลดของคุณ
Quentin Skousen

0

เธรดStackOverflowนี้มีประโยชน์ ...

/programming/41134785/how-to-solve-mysql-warning-innodb-page-cleaner-1000ms-intended-loop-took-xxx

นี่หมายความว่าฐานข้อมูลของคุณได้รับการเขียนมากเกินไปทำให้BufferPoolเติมค่าสกปรก สิ่งนี้จะกระตุ้นให้PageCleanerทำหน้าที่และล้างหน้าสกปรก เนื่องจากมีเพจสกปรกมากเกินกว่าปกติจึงใช้เวลานานกว่านี้เพื่อให้PageCleanerทำการล้างบัฟเฟอร์

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.