Segmentazione della Cache degli Indici
Informazioni generali
Una chiave degli indici segmentata (Segmented Key Cache) è una collezione di strutture per le normali cache degli indici di MyISAM, chiamate segmenti di cache. Le cache segmentate mitigano uno dei maggiori problemi della cache semplice: la contenzione dei thread causata dai lock sulla cache degli indici (mutex). Con le consuete cache degli indici, ogni chiamata ad una funzione dell'interfaccia della cache deve acquisire un lock. Perciò i thread competono per ottenere questo lock, anche nel caso in cui hanno acquisito dei lock condivisi sul file e le pagine che vogliono leggere si trovano nei buffer della cache degli indici.
Quando si lavora con una cache degli indici segmentata, le funzioni dell'interfaccia della cache che accedono a una certa pagina devono acquisire il lock solo su quei segmenti a cui la pagina è assegnata. Questo diminuisce le probabilità che i thread debbano competere per lo stesso lock.
Tutte le pagine di un file possono essere poste in un buffer composto da un solo segmento. Il numero dei segmenti è dato dal numero di file e dalla posizione della pagina nel file, ed è sempre lo stesso per ogni pagina. Le pagine sono distribuite in maniera uniforme tra i segmenti.
L'idea e il codice originale della cache degli indici segmentata sono di Fredrik Nylander di Stardoll.com. Il codice è stato pesantemente modificato, migliorato e infine unito a MariaDB da Igor Babaev di Monty Program (ora SkySQL).
Alcuni risultati dei benchmark, che comparano le varie configurazioni della key_cache_segments
, sono disponibili alla pagina Segmented Key Cache Performance,
Sintassi della cache segmentata
Nuova variabile globale: key_cache_segments
. Specifica il numero di segmenti nella cache delle chiavi. I valori ammessi sono i numeri interi tra 0
e 64
. Se il numero dei segmenti è impostato a un valore superiore a 64
, esso verrà ridotto a 64 e si otterrà un warning.
Un valore "0
" indica che la cache degli indici è una cache regolare (cioé non segmentata). Questo è il default. Se key_cache_segments
è "1
" (o maggiore), allora verrà usato il codice relativo alla segmentazione. In pratica, non esistono ragioni per utilizzare una cache segmentata con un singolo frammento, se non per scopi di test. Per tutti gli altri fini, impostare key_cache_segments = 1
dovrebbe essere più lento rispetto a qualsiasi altra configurazione, e non dovrebbe essere utilizzato in produzione.
Anche le altre variabili globali utilizzate con le normali cache degli indici non segmentate, si applicano anche alla cache segmentata: key_buffer_size
,
key_cache_age_threshold
, key_cache_block_size
e
key_cache_division_limit
. Si veda la pagina Server System Variables per informazioni su queste variabili.
Statistiche sulla cache degli indici segmentata
Le statistiche sulla cache degli indici segmentata si trovano nella tabella KEY_CACHES
, nel database INFORMATION_SCHEMA
. Le colonne di questa tabella sono:
Nome Colonna | Spiegazione |
---|---|
KEY_CACHE_NAME | Il nome della cache |
SEGMENTS | Totale dei segmenti (impostato a NULL per le cache regolari) |
SEGMENT_NUMBER | Numero dei segmenti (impostato a NULL per le cache regolari e per le righe che contengono dati statistici aggregati) |
FULL_SIZE | Memoria per i buffer e le strutture ausiliarie |
BLOCK_SIZE | Dimensioni dei blocchi |
USED_BLOCKS | Numero dei blocchi attualmente in uso |
UNUSED_BLOCKS | Numero dei blocchi attualmente inutilizzati |
DIRTY_BLOCKS | Numero dei blocchi attualmente sporchi |
READ_REQUESTS | Numero delle richieste di lettura |
READS | Numero delle effettive letture dei file nei buffer |
WRITE_REQUESTS | Numero delle richieste di scrittura |
WRITES | Numero delle effettive scritture dai buffer ai file |