Cosa impostare innodb_buffer_pool e perché ..?


20

Ho 170 GB di InnoDBindice e dati.

Devo riadattare la dimensione innodb_buffer_pool per prestazioni migliori. La dimensione massima della tabella di una tabella InnoDB (indice + dati) è di 28 GB.

Quindi quale dovrebbe essere la dimensione ottimale di innodb_buffer_pool.

AGGIORNARE

eseguiremo la migrazione di questo nostro database locale su ec2, quindi imposteremo la RAM in base alle statistiche correnti di innodb, per questo motivo ho bisogno delle dimensioni del pool di buffer in modo da poter disporre di RAM disponibile lì.

File per tabella è abilitato.

Sto usando una macchina Linux.


Qual è la RAM disponibile sulla macchina non utilizzata da altri processi? Stai usando Windows, Linux o qualcos'altro? Quale versione di MySQL stai usando? Perché la dimensione del tavolo è limitata a 28 GB?
Craig Efrein,

Le dimensioni del tavolo non sono limitate .. Ho dato le dimensioni del tavolo fino a un certo punto. Aumenterà in quanto ci saranno inserti in futuro ..
Abdul Manaf

Risposte:


25

La tabella più grande che hai rappresenta il 16,47% (28/170) dei dati totali. Anche se la tabella era altamente scritta e altamente letta, non tutti i 28G della tabella vengono caricati nel pool di buffer in un dato momento. Quello che devi calcolare è la quantità del pool di buffer InnoDB che viene caricata in un dato momento sul server DB corrente .

Ecco un modo più granulare per determinare innodb_buffer_pool_size per un nuovo DB Server dato il set di dati attualmente caricato nel pool di buffer InnoDB del DB Server corrente.

Eseguire quanto segue sull'istanza MySQL corrente (server da cui si sta eseguendo la migrazione)

SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_data';  -- IBPDataPages 
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_total'; -- IBPTotalPages
SHOW GLOBAL STATUS LIKE 'Innodb_page_size'; -- IPS

Esegui la formula IBPPctFull = IBPDataPages * 100.0 / IBPTotalPages.

SET @IBPDataPages = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_data'); -- SELECT @IBPDataPages;
SET @IBPTotalPages = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_total'); -- SELECT @IBPTotalPages;
SET @IBPPctFull = CAST(@IBPDataPages * 100.0 / @IBPTotalPages AS DECIMAL(5,2));
SELECT @IBPPctFull;

Se IBPPctFull è pari o superiore al 95%, è necessario impostare innodb_buffer_pool_size al 75% della RAM del DB Server.

Se IBPPctFull è inferiore al 95%, eseguire questa formula: IBPSize = IPS X IBPDataPages / (1024*1024*1024) X 1.05.

SET @IBPSize = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_page_size'); -- SELECT @IBPSize;
SET @IBPDataPages = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_data'); -- SELECT @IBPDataPages;
SET @IBPSize = concat(ROUND(@IBPSize * @IBPDataPages / (1024*1024*1024) * 1.05, 2), ' GB' );
SELECT @IBPSize;

Il numero per IBPSize (in GB) è il numero che si adatta meglio al set di dati di lavoro effettivo.

Ora, se IBPSize è ancora troppo grande per la più grande configurazione RAM di Amazon EC2, usa il 75% della RAM per Amazon EC2 DB Server.


Questa è davvero una grande informazione ... Un'altra cosa che devo sapere come il server MySQL carica i dati e gli indici nel pool di buffer ho esaminato la documentazione e ho ottenuto che utilizza LRU ma come li carica in memoria come se avessi 2 GB per pool di buffer ma la dimensione della tabella richiesta nella query è molto più di questo .. ??
Abdul Manaf,

Solo i dati e le pagine indice necessarie per soddisfare la query vengono caricati nel pool buffer, non nell'intera tabella. Le pagine dei dati e degli indici precedenti vengono ruotate in base all'algoritmo LRU elencato in dev.mysql.com/doc/refman/5.5/it/innodb-buffer-pool.html
RolandoMySQLDBA

Abdul, dovresti andare con la risposta di Rolando che risponde alla tua domanda meglio della mia. Riscriverò la mia risposta solo perché devo essere più chiaro.
Craig Efrein,

13

Sto fornendo questa risposta come informazioni complementari alla risposta di Rolando di seguito.

Prima che il server sia in produzione

Calcola innodb_buffer_pool_size in base alle tabelle più grandi utilizzate più spesso da MySQL. Per identificare le tabelle più grandi in base alle loro dimensioni nel database è possibile utilizzare questo script:

select table_schema, table_name, round(data_length/1024/1024,2) as size_mb 
from information_schema.tables where table_schema like 'my_database' 
order by size_mb desc;


+--------------+-------------------------+---------+
| table_schema | table_name              | size_mb |
+--------------+-------------------------+---------+
| heavybidder     | user                 |   522.55|
| heavybidder     | bid                  |   121.52|
| heavybidder     | item_for_sale        |    10.52|
| heavybidder     | account_user         |    5.02 |
| heavybidder     | txn_log              |    4.02 |
| heavybidder     | category             |    0.02 |
+--------------+-------------------------+---------+

Ora che sappiamo quali sono le tabelle più grandi nel nostro database, dobbiamo determinare quali sono le più utilizzate. Per fare ciò, vorrei utilizzare un programma di profilazione come Jet Profiler (JP) per vedere quali tabelle hanno più accesso. JP ti mostrerà a quali tabelle accedi più frequentemente. Ecco uno screenshot da quella sezione in JP

inserisci qui la descrizione dell'immagine

Quindi, con questo in mente, ora so che le tabelle degli utenti e delle offerte occupano circa 640 MB di spazio su disco, sono molto frequentemente utilizzate secondo JP e ciò significa che MySQL memorizzerà i loro indici e dati nel pool di buffer come Rolando menzioni di seguito nei suoi commenti.

Per assicurarmi che MySQL avesse memoria sufficiente per archiviare i dati per le mie tabelle più grandi e utilizzate più frequentemente, definirei innodb_buffer_pool_size a 640 MB.

Ci sono alcune considerazioni aggiuntive, ma non si applicano a innodb_buffer_pool_size.

È un sistema a 32 bit o 64 bit? In un sistema a 32 bit, sei limitato a 4 GB a meno che non attivi PAE. In Windows, ciò significa eseguire le versioni di Windows Enterprise o Datacenter.

Di quanta memoria hanno bisogno gli altri processi in esecuzione sul sistema? Su un server MySQL dedicato, lascerò tra il 5% e il 10% per il sistema operativo. In Windows è possibile utilizzare Process Explorer per analizzare l'utilizzo della memoria. In Linux, hai sysstat, free, htop, top e vmstat.

Il database è composto solo da tabelle Innodb o da una combinazione di Innodb e MyISAM? Se si tratta di una combinazione dei due, accantonerò la memoria per key_cache, unirò le variabili, interrogherai la cache, ecc. Successivamente potrai calcolare il tuo hit ratio di MyISAM una volta che il server è in produzione.

Dopo che il server è in produzione

Qual è l'attuale hit ratio di Innodb?

1 - (innodb_buffer_pool_reads / innodb_buffer_pool_read_requests).

Qual è il rapporto di hit della cache chiave

1 - (Key_reads / Key_read_requests)

In genere cerco di ottenere il rapporto il più vicino possibile al 100%.

In che misura le tabelle si adattano al pool di buffer

Puoi anche vedere come i tuoi dati della tabella si adattano al tuo buffer_pool facendo riferimento a questo link, che fornisce un modo per mostrare "quante pagine sono nel pool di buffer per una data tabella (cnt), quante sono sporche (sporche) e qual è la percentuale di indice adatta nella memoria (fit_pct). " Si applica solo al server Percona

http://www.mysqlperformanceblog.com/2010/12/09/how-well-does-your-table-fits-in-innodb-buffer-pool/

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.