Il buffer di memoria di XtraDB/InnoDB
Il buffer di memoria (Memory Buffer) di XtraDB/InnoDB è un componente chiave di MariaDB. Registra i dati e gli indici, e solitamente è desiderabile mantenere in memoria la maggior quantità possibile di dati ed indici, riducendo l'IO su disco, che è il principale collo di bottiglia.
Come funziona il buffer di memoria
Il memory buffer tenta di mantenere nel buffer i blocchi utilizzati di frequente, perciò essenzialmente lavora come due sottoliste: una sottolista new delle informazioni utilizzate più recentemente, e una sottolista old di informazioni più datate. Per default, il 37% della lista è utilizzato dalla sottolista old.
Quando avviene un accesso a nuove informazioni che non compaiono nella lista, queste vengono piazzate in cima, la voce più vecchia della lista viene rimossa e tutte le altre slittano di una posizione.
Quando avviene un accesso a vecchie informazioni che figurano nella lista old, queste vengono spostate verso la cima della lista e tutte le altre slittano di una posizione.
innodb_buffer_pool_size
La variabile server di sistema più importante è innodb_buffer_pool_size, che si può impostare al 70-80% della memoria totale disponibile su un database server dedicato che utilizza solamente, o principalmente, tabelle XtraDB/InnoDB.
Occorre ricordarsi che la memoria effettivamente allocata è maggiore del 10% circa rispetto alle dimensioni specificate, perché uno spazio aggiuntivo viene riservato per le strutture di controllo e i buffer. La memoria inoltre deve essere contigua. Se si esegue un sistema Windows che carica alcune DLL da indirizzi specifici, questo potrebbe provocare delle difficoltà.
Più grandi sono le dimensioni, maggiore sarà il tempo che occorre per inizializzare. Su un server moderno a 64 bit con un pool di memoria di 10GB, potrebbero occorrere cinque secondi o più.
Bisogna anche accertarsi che le dimensioni non siano troppo grandi, perché causerebbero uno swapping. Il beneficio di un grande buffer di memoria è negativamente compensato in abbondanza dallo swapping.
Se innodb_buffer_pool_size è impostato a più di 1GB, innodb_buffer_pool_instances divide il buffer pool di InnoDB nel numero specificato di istanze. Il valore predefinito è 1, ma per i sistemi con dei buffer pool di parecchi gigabyte, molte istante possono aiutare a ridurre la concorrenza del contenimento. Ogni istanza gestisce le sue strutture dati e occupa un'uguale porzione delle dimensioni del buffer pool, quindi se ad esempio innodb_buffer_pool_size è di 4GB e innodb_buffer_pool_instances è impostato a 4, ogni istanza sarà di 1GB. Ogni istanza dovrebbe idealmente avere dimensioni di almeno 1GB.
innodb_old_blocks_pct e innodb_old_blocks_time
La parte riservata alla lista old, per default il 37% del totale, può essere modificata cambiando il valore della variabile innodb_old_blocks_pct. Essa accetta un qualsiasi valore tra 5% e 95%.
La variabile innodb_old_blocks_time indica l'attesa prima che un blocco venga spostato dalla sottolista old a new. '0', il default, significa che non c'è alcuna attesa.
Prima di modificare uno qualsiasi di questi valori, occorre essere certi di capire quale sarà l'impatto e in che modo il sistema attualmente utilizza il buffer. La ragione principale per la loro esistenza è riducce l'impatto delle scansioni complete delle tabelle, che normalmente non sono frequenti, ma sono costose, e in precedenza potevano eliminare tutte le voci presenti nel buffer. Impostare una attesa diversa da zero può aiutare in alcune situazioni in cui alcune scansioni complete delle tabelle vengono effettuate in rapida successione.