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

Sådan løses mysql-advarsel:InnoDB:page_cleaner:1000ms tilsigtet loop tog XXX ms. Indstillingerne er måske ikke optimale?

Problemet er typisk for en MySQL-instans, hvor du har en høj hastighed af ændringer i databasen. Ved at køre din 5GB-import opretter du hurtigt beskidte sider. Efterhånden som snavsede sider oprettes, er siderensetråden ansvarlig for at kopiere beskidte sider fra hukommelsen til disken.

I dit tilfælde går jeg ud fra, at du ikke importerer 5GB hele tiden. Så dette er en usædvanlig høj hastighed af databelastning, og den er midlertidig. Du kan sikkert se bort fra advarslerne, for InnoDB vil gradvist indhente det.

Her er en detaljeret forklaring af de interne elementer, der fører til denne advarsel.

En gang i sekundet scanner siderenseren bufferpuljen for snavsede sider, der skylles fra bufferpuljen til disken. Advarslen, du så, viser, at den har masser af snavsede sider at skylle, og det tager over 4 sekunder at skylle en batch af dem til disken, når den skulle fuldføre det arbejde på under 1 sekund. Med andre ord, den bider mere fra sig, end den kan tygge.

Du har justeret dette ved at reducere innodb_lru_scan_depth fra 1024 til 256. Dette reducerer, hvor langt inde i bufferpuljen siderens tråden søger efter beskidte sider i løbet af sin cyklus én gang pr. sekund. Du beder den om at tage mindre bidder.

Bemærk, at hvis du har mange bufferpool-forekomster, vil det medføre, at skylningen udfører mere arbejde. Den bider innodb_lru_scan_depth af mængden af ​​arbejde for hver bufferpuljeforekomst. Så du har måske utilsigtet forårsaget denne flaskehals ved at øge antallet af bufferpuljer uden at formindske scanningsdybden.

Dokumentationen for innodb_lru_scan_depth siger "En indstilling, der er mindre end standarden, er generelt velegnet til de fleste arbejdsbelastninger." Det lyder som om de gav denne mulighed en værdi, der er for høj som standard.

Du kan sætte en grænse for den IOPS, der bruges af baggrundsskylning, med innodb_io_capacity og innodb_io_capacity_max muligheder. Den første mulighed er en blød grænse for den I/O-gennemstrømning, som InnoDB vil anmode om. Men denne grænse er fleksibel; hvis skylningen falder bagud hastigheden for oprettelse af nye beskidte sider, vil InnoDB dynamisk øge skyllehastigheden ud over denne grænse. Den anden mulighed definerer en strengere grænse for, hvor langt InnoDB kan øge skyllehastigheden.

Hvis skylningshastigheden kan holde trit med den gennemsnitlige hastighed for at skabe nye beskidte sider, så er du okay. Men hvis du konsekvent opretter beskidte sider hurtigere, end de kan skylles, vil din bufferpulje til sidst fyldes op med beskidte sider, indtil de beskidte sider overstiger innodb_max_dirty_page_pct af bufferpuljen. På dette tidspunkt vil skyllehastigheden automatisk stige og kan igen få page_cleaner til at sende advarsler.

En anden løsning ville være at sætte MySQL på en server med hurtigere diske. Du har brug for et I/O-system, der kan håndtere den gennemstrømning, der kræves af din sideskylning.

Hvis du ser denne advarsel hele tiden under gennemsnitlig trafik, prøver du måske at lave for mange skriveforespørgsler på denne MySQL-server. Det kan være tid til at skalere ud og dele skrivningerne over flere MySQL-instanser, hver med deres eget disksystem.

Læs mere om siderens:



  1. Gemmer filer som blob i databasen ajax php pdo

  2. MySql, opdel en streng og indsæt i tabellen

  3. Konvertering af cifre/tal i ord til INR-valuta (indiske rupier) i Oracle PL/SQL

  4. Sammenligning af midlertidige tabeller til PostgreSQL og Oracle GTT