sql >> Databasteknik >  >> RDS >> Mysql

Hur man löser mysql-varning:InnoDB:page_cleaner:1000ms avsedd loop tog XXX ms. Inställningarna kanske inte är optimala?

Problemet är typiskt för en MySQL-instans där du har en hög frekvens av ändringar i databasen. Genom att köra din 5GB-import skapar du smutsiga sidor snabbt. När smutsiga sidor skapas ansvarar trådrenaren för att kopiera smutsiga sidor från minnet till disken.

I ditt fall antar jag att du inte importerar 5GB hela tiden. Så det här är en exceptionellt hög databelastning, och den är tillfällig. Du kan förmodligen bortse från varningarna, eftersom InnoDB gradvis kommer ikapp.

Här är en detaljerad förklaring av det interna som leder till denna varning.

En gång per sekund skannar sidrenaren buffertpoolen efter smutsiga sidor att spola från buffertpoolen till disken. Varningen du såg visar att den har massor av smutsiga sidor att spola, och det tar över 4 sekunder att spola en sats av dem till disken, när den ska slutföra det arbetet på under 1 sekund. Med andra ord, den biter av sig mer än den kan tugga.

Du justerade detta genom att minska innodb_lru_scan_depth från 1024 till 256. Detta minskar hur långt in i buffertpoolen som tråden för sidrensare söker efter smutsiga sidor under sin cykel en gång per sekund. Du ber den att ta mindre tuggor.

Observera att om du har många buffertpoolsinstanser kommer det att göra att spolningen gör mer arbete. Den biter av innodb_lru_scan_depth mängd arbete för varje buffertpoolsinstans. Så du kan ha orsakat denna flaskhals av misstag genom att öka antalet buffertpooler utan att minska skanningsdjupet.

Dokumentationen för innodb_lru_scan_depth säger "En inställning som är mindre än standardinställningen är i allmänhet lämplig för de flesta arbetsbelastningar." Det låter som att de gav det här alternativet ett värde som är för högt som standard.

Du kan sätta en gräns för IOPS som används av bakgrundsspolning, med innodb_io_capacity och innodb_io_capacity_max alternativ. Det första alternativet är en mjuk gräns för I/O-genomströmningen som InnoDB kommer att begära. Men denna gräns är flexibel; om spolningen faller efter takten för att skapa nya smutsiga sidor, kommer InnoDB dynamiskt att öka spolningshastigheten utöver denna gräns. Det andra alternativet definierar en strängare gräns för hur långt InnoDB kan öka spolningshastigheten.

Om hastigheten för spolning kan hålla jämna steg med den genomsnittliga hastigheten för att skapa nya smutsiga sidor, kommer du att klara dig. Men om du konsekvent skapar smutsiga sidor snabbare än de kan tömmas, kommer buffertpoolen så småningom att fyllas med smutsiga sidor, tills de smutsiga sidorna överstiger innodb_max_dirty_page_pct av buffertpoolen. Vid denna tidpunkt kommer spolningshastigheten att öka automatiskt och kan återigen få page_cleaner att skicka varningar.

En annan lösning skulle vara att lägga MySQL på en server med snabbare diskar. Du behöver ett I/O-system som kan hantera den genomströmning som krävs av din sidspolning.

Om du ser den här varningen hela tiden under genomsnittlig trafik, kanske du försöker göra för många skrivfrågor på den här MySQL-servern. Det kan vara dags att skala ut och dela upp skrivningarna över flera MySQL-instanser, var och en med sitt eget disksystem.

Läs mer om sidrensaren:



  1. MySQL Välj WHERE IN given ordning

  2. Hur lägger man till kommentarer till en tabell i Oracle SQL Developer?

  3. Hur CONVERT() fungerar i MariaDB

  4. UniVers tips