1. Glossario/

Pagina dirty

Dirty page, pagina sporca

Nel buffer pool di InnoDB, una pagina dirty è una pagina da 16 KB che è stata modificata in memoria — da un INSERT, UPDATE o DELETE — ma il cui contenuto aggiornato non è ancora stato scritto nel file dati su disco. La versione su disco è quindi obsoleta rispetto a quella in RAM.

Come funziona #

Ogni volta che una transazione modifica una riga, InnoDB aggiorna la pagina corrispondente nel buffer pool e la marca come dirty. In parallelo, il thread di flush in background (page_cleaner) scrive periodicamente le pagine dirty sui file .ibd, seguendo due politiche principali:

  • Fuzzy checkpoint: flush continuo e incrementale per mantenere la percentuale di pagine dirty sotto innodb_max_dirty_pages_pct (default 90%).
  • Flush adattivo: accelera il flush quando il ritmo di scrittura nel redo log si avvicina alla capacità massima, per evitare che InnoDB debba bloccare le scritture utente per fare spazio.
-- Monitorare le pagine dirty in tempo reale
SELECT VARIABLE_NAME, VARIABLE_VALUE
FROM performance_schema.global_status
WHERE VARIABLE_NAME IN (
    'Innodb_buffer_pool_pages_dirty',
    'Innodb_buffer_pool_pages_total'
);

Contesto operativo #

Un numero di pagine dirty stabile e contenuto è normale. Il segnale di allarme è una crescita sostenuta e monotona: significa che il flush non riesce a smaltire le scritture in arrivo. Le cause più frequenti sono un buffer pool sovradimensionato rispetto alla velocità del disco, un innodb_io_capacity troppo basso, o un carico di scrittura improvvisamente elevato.

In caso di crash, InnoDB usa il redo log per ripristinare le pagine dirty non ancora flushate: più pagine dirty ci sono, più lungo sarà il crash recovery al riavvio.