Mysql
 sql >> Database >  >> RDS >> Mysql

Come risolvere l'avviso di MySQL:InnoDB:page_cleaner:il ciclo previsto di 1000 ms ha richiesto XXX ms. Le impostazioni potrebbero non essere ottimali?

Il problema è tipico di un'istanza MySQL in cui si ha un'elevata percentuale di modifiche al database. Eseguendo l'importazione da 5 GB, crei rapidamente pagine sporche. Quando vengono create pagine sporche, il thread di pulizia della pagina è responsabile della copia delle pagine sporche dalla memoria al disco.

Nel tuo caso, presumo che tu non esegua sempre importazioni da 5 GB. Quindi questo è un tasso di caricamento dei dati eccezionalmente alto ed è temporaneo. Probabilmente puoi ignorare gli avvisi, perché InnoDB raggiungerà gradualmente il ritardo.

Ecco una spiegazione dettagliata degli elementi interni che portano a questo avviso.

Una volta al secondo, la pulitura pagine esegue la scansione del pool di buffer alla ricerca di pagine sporche da scaricare dal pool di buffer al disco. L'avviso che hai visto mostra che ha molte pagine sporche da svuotare e ci vogliono più di 4 secondi per scaricarne un batch sul disco, quando dovrebbe completare quel lavoro in meno di 1 secondo. In altre parole, sta mordendo più di quanto possa masticare.

L'hai modificato riducendo innodb_lru_scan_depth da 1024 a 256. Ciò riduce la distanza nel pool di buffer in cui il thread di pulizia della pagina cerca le pagine sporche durante il suo ciclo una volta al secondo. Gli stai chiedendo di prendere morsi più piccoli.

Nota che se hai molte istanze di pool di buffer, lo svuotamento farà più lavoro. Morde innodb_lru_scan_depth quantità di lavoro per ciascuna istanza del pool di buffer. Quindi potresti aver inavvertitamente causato questo collo di bottiglia aumentando il numero di pool di buffer senza diminuire la profondità di scansione.

La documentazione per innodb_lru_scan_depth dice "Un'impostazione inferiore a quella predefinita è generalmente adatta per la maggior parte dei carichi di lavoro". Sembra che abbiano assegnato a questa opzione un valore troppo alto per impostazione predefinita.

Puoi porre un limite all'IOPS utilizzato dallo svuotamento in background, con innodb_io_capacity e innodb_io_capacity_max opzioni. La prima opzione è un limite morbido sul throughput di I/O richiesto da InnoDB. Ma questo limite è flessibile; se lo svuotamento è al di sotto del tasso di creazione di nuove pagine sporche, InnoDB aumenterà dinamicamente il tasso di svuotamento oltre questo limite. La seconda opzione definisce un limite più rigoroso su quanto InnoDB potrebbe aumentare il tasso di svuotamento.

Se il tasso di svuotamento può tenere il passo con il tasso medio di creazione di nuove pagine sporche, allora starai bene. Ma se crei costantemente pagine sporche più velocemente di quanto possano essere svuotate, alla fine il tuo pool di buffer si riempirà di pagine sporche, finché le pagine sporche non superano innodb_max_dirty_page_pct del buffer pool. A questo punto, il tasso di svuotamento aumenterà automaticamente e potrebbe nuovamente causare l'invio di avvisi da parte di page_cleaner.

Un'altra soluzione sarebbe quella di mettere MySQL su un server con dischi più veloci. Hai bisogno di un sistema I/O in grado di gestire il throughput richiesto dallo svuotamento della pagina.

Se vedi questo avviso continuamente con traffico medio, potresti provare a eseguire troppe query di scrittura su questo server MySQL. Potrebbe essere il momento di ridimensionare e dividere le scritture su più istanze MySQL, ciascuna con il proprio sistema di dischi.

Maggiori informazioni sul pulitore di pagine: