Problém je typický pro instanci MySQL, kde máte vysokou míru změn v databázi. Spuštěním importu 5 GB rychle vytváříte špinavé stránky. Při vytváření špinavých stránek je vlákno pro čištění stránek odpovědné za kopírování špinavých stránek z paměti na disk.
Ve vašem případě předpokládám, že neprovádíte import 5GB neustále. Jedná se tedy o mimořádně vysokou rychlost zatížení dat a je to dočasné. Varování pravděpodobně můžete ignorovat, protože InnoDB to postupně dožene.
Zde je podrobné vysvětlení vnitřních prvků vedoucích k tomuto varování.
Čistič stránek jednou za sekundu prohledá fond vyrovnávacích pamětí, zda neobsahuje špinavé stránky, aby je vyprázdnil z fondu vyrovnávacích pamětí na disk. Varování, které jste viděli, ukazuje, že má spoustu špinavých stránek k vyprázdnění a vyprázdnění dávky z nich na disk trvá déle než 4 sekundy, přičemž by to mělo dokončit práci za méně než 1 sekundu. Jinými slovy, ukusuje víc, než dokáže rozkousat.
Upravili jste to zmenšením innodb_lru_scan_depth
z 1024 na 256. To snižuje, jak daleko ve fondu vyrovnávacích pamětí vlákno čističe stránek vyhledává špinavé stránky během cyklu jednou za sekundu. Žádáte, aby si vzala menší sousta.
Všimněte si, že pokud máte mnoho instancí fondu vyrovnávacích pamětí, způsobí to vyprázdnění, aby bylo více práce. Ukousne innodb_lru_scan_depth
množství práce pro každou instanci fondu vyrovnávacích pamětí. Toto úzké hrdlo jste tedy mohli neúmyslně způsobit zvýšením počtu fondů vyrovnávacích pamětí, aniž byste snížili hloubku skenování.
Dokumentace pro innodb_lru_scan_depth
říká "Nastavení menší než výchozí je obecně vhodné pro většinu úloh." Zdá se, že této možnosti dali hodnotu, která je ve výchozím nastavení příliš vysoká.
Pomocí innodb_io_capacity
můžete nastavit limit na IOPS používané proplachováním na pozadí a innodb_io_capacity_max
možnosti. První možností je měkké omezení I/O propustnosti, kterou InnoDB požaduje. Ale tato hranice je flexibilní; pokud vyplachování zaostává za rychlostí vytváření nových nečistých stránek, InnoDB dynamicky zvýší rychlost vyplachování nad tento limit. Druhá možnost definuje přísnější limit, jak daleko může InnoDB zvýšit rychlost proplachování.
Pokud rychlost splachování dokáže držet krok s průměrnou rychlostí vytváření nových špinavých stránek, budete v pořádku. Pokud však soustavně vytváříte špinavé stránky rychleji, než je lze vyprázdnit, nakonec se váš zásobník vyrovnávací paměti zaplní špinavými stránkami, dokud špinavé stránky nepřekročí innodb_max_dirty_page_pct
buffer poolu. V tomto okamžiku se rychlost splachování automaticky zvýší a může znovu způsobit, že page_cleaner bude odesílat varování.
Dalším řešením by bylo umístit MySQL na server s rychlejšími disky. Potřebujete I/O systém, který zvládne propustnost vyžadovanou splachováním vaší stránky.
Pokud se toto varování zobrazuje stále při průměrném provozu, možná se pokoušíte provést na tomto serveru MySQL příliš mnoho dotazů na zápis. Možná je čas škálovat a rozdělit zápisy do více instancí MySQL, z nichž každá má svůj vlastní diskový systém.
Přečtěte si více o čističi stránek:
- Představujeme vlákno page_cleaner v InnoDB (archivovaná kopie)
- MySQL-5.7 zlepšuje pracovní zátěže orientované na DML