Pengaturan page_cleaner MySQL InnoDB mungkin tidak optimal


16

Lihat catatan ini di 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.)

Tampaknya ada yang menyebutkan sesuatu seperti ini di sini: Contoh MySQL berhenti "melakukan indeks SYNC"

Pertanyaan saya adalah: tindakan apa yang harus diambil, jika ada, ketika catatan ini terlihat di log?

Versi MySQL dan OS:
mysql-community-server- 5.7.9 -1.el7.x86_64
centos-release-7-1.1503.el7.centos.2.8.x86_64

Menjalankan SHOW VARIABEL SEPERTI 'innodb%'; seperti yang disarankan menunjukkan:

innodb_page_cleaners | 1

Jawaban:


10

Nilai default innodb_page_cleaners diubah dari 1 menjadi 4 di MySQL 5.7.8. Jika jumlah utas pembersih halaman melebihi jumlah instance buffer pool, innodb_page_cleaners secara otomatis disetel ke nilai yang sama dengan innodb_buffer_pool_instances

Periksa innodb_buffer_pool_inances dengan:

mysql> SHOW GLOBAL VARIABLES LIKE 'innodb_buffer_pool_instances'

Anda hanya dapat menetapkan innodb_page_cleanerssetinggi innodb_buffer_pool_instances. Jika Anda mau innodb_page_cleaners=4maka Anda juga perlu innodb_buffer_pool_instances=4.


2
baik saya memiliki innodb_buffer_pool_instances dan innodb_page_cleaners diatur ke 8 dan saya melihat peringatan sesekali. Ini hanya sekelompok disk kelas desktop berputar selama i / o ops berat seperti mengoptimalkan tabel dan sejenisnya, saya kira itu hanya cara halus mysql untuk memberitahu Anda disk Anda terlalu lambat;)
Aleksandar Ivanisevic

5

Kami mengalami masalah yang sama di berbagai klien dan menemukan bahwa masalahnya adalah karena menetapkan nilai innodb_lru_scan_depth dari default 1024 ke level 128. Meskipun menurunkan nilai mengurangi waktu yang dibutuhkan untuk memproses transaksi terutama dalam beban kerja tulis terikat Saya percaya bahwa pengaturan nilai terlalu rendah akan membuat buffer pool tidak dapat terus membersihkan beberapa buffer dan buffer pool halaman kotor.

Dalam kasus kami, kami telah melihat peningkatan drastis dengan meningkatkan nilai dari 128 menjadi 256 tetapi umumnya nilai yang tepat tergantung pada perangkat keras dan jenis beban. Caranya adalah dengan menemukan nilai yang tepat antara meningkatkan kinerja OLTP dan membiarkan MySQL menjaga buffer pool tetap bersih agar tidak perlu page_cleaner perlu melakukan banyak pekerjaan, seperti yang dinyatakan oleh pesan di atas ( "InnoDB: page_cleaner: 1000ms loop yang dimaksudkan mengambil 15888ms " ).

Nilai dapat diubah secara dinamis tanpa me-restart MySQL, misalnya

SET GLOBAL innodb_lru_scan_depth=256;

1
Jika saya me-restart MySQL innodb_lru_scan_depth kembali ke 1024 jadi bagaimana cara mengubahnya secara permanen?
Karim Samir

@KarimSamir Tambahkan innodb_lru_scan_depth = 256suatu tempat di my.cnfjalur muat Anda .
Quentin Skousen

0

Utas StackOverflow ini dapat bermanfaat ...

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

Ini pada dasarnya berarti, DB Anda terlalu banyak menulis sehingga BufferPool diisi dengan nilai-nilai kotor. Ini memicu PageCleaner untuk bertindak dan menghapus halaman kotor. Karena ada terlalu banyak halaman kotor dari biasanya, butuh lebih banyak waktu bagi PageCleaner untuk menghapus buffer.

innodb_lru_scan_depthvariabel tertentu mengontrol berapa banyak pemindaian kumpulan buffer yang harus dilakukan untuk pembersihan. Ini bisa menjadi nilai yang besar atau menulis throughput sistem sangat tinggi menyebabkan sejumlah besar halaman kotor.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.