Le migliori impostazioni della cache di MySQL per server MySQL dedicato alla RAM da 8 GB utilizzando solo InnoDB (database da 5 GB)


20

Sono un grande sostenitore della configurazione di MySQL per le prestazioni. E onestamente non sono preoccupato della messa a punto per spremere ogni ultimo bit di prestazioni da MySQL, ma so che la cosa più importante da fare che fornisce alcuni dei migliori risultati è impostare correttamente cache / buffer.

Ho cercato di semplificare le cose utilizzando solo InnoDB come motore di archiviazione. E ho un server dedicato per MySQL. Ha 8 GB di RAM, come dovrei allocarlo per massimizzare le prestazioni? Mi piacerebbe poter adattare il mio intero database alla memoria per le migliori prestazioni. Il database è di circa 5 GB. È possibile?

Quanta memoria devo allocare alla cache delle query? Quanto al pool di buffer InnoDB? Quanto per il resto del computer (ovvero processi non correlati a MySQL)? Eccetera.

Dal momento che non sto usando MyISAM non ho davvero bisogno di mettere molta memoria nella cache delle chiavi corretta?

Risposte:


25

Questo è difficile senza sapere molto sul database stesso. Ci sono alcuni strumenti di cui dovresti essere a conoscenza;

Informazioni sulla memorizzazione dell'intero database in memoria; Tutte le query che stanno apportando modifiche al database rimarranno aperte fino a quando la scrittura non viene eseguita sul disco. L'unica cosa che può evitare che il disco sia un collo di bottiglia, è un controller del disco con una cache di scrittura.

Vorrei iniziare con le seguenti modifiche rispetto alle impostazioni predefinite:

key_buffer_size = 128M
thread_stack = 128K
thread_cache_size = 8
table_cache = 8192
max_heap_table_size = 256M
query_cache_limit = 4M
query_cache_size = 512M

innodb_buffer_pool_size = 4G 

# This is crucial to avoid checkpointing all the time:
innodb_log_file_size = 512M

# If you have control on who consumes the DB, and you don't use hostnames when you've set up permissions - this can help as well.
skip_name_resolve

Poi vedrei come vanno le cose e provo diverse cose in base (tra le altre cose) all'output degli strumenti sopra menzionati. Vorrei anche assicurarmi di rappresentare graficamente le tendenze con uno strumento di monitoraggio, come Munin o Cacti , per vedere con quale tipo di carico di lavoro sto effettivamente gestendo. Personalmente, ho una grande esperienza con i plugin MySQL forniti con Munin.


Grazie, ci proverò e vedrò se posso imparare qualcosa di nuovo.
billmalarky,

@billmalarky Benvenuti in serverfault! :) Ricorda di votare o contrassegnare la domanda come corretta, se sei soddisfatto della risposta che hai ricevuto.
Kvisle,

+1 per raccomandare mysqltuner.pl !!!
RolandoMySQLDBA,

@Kvisle Grazie per il benvenuto! Sono stato su StackOverflow per un po '(beh ... qualche mese che è ...) ma sono nuovo di serverfault. Ospito effettivamente con voxel.net e il loro hosting promanaged (supporto del sistema IE) è davvero fantastico, ma ho pensato che sarebbe stato opportuno cercare anche una visione esterna, quindi non mi sembrava uno strumento completo quando ne parlavo con loro.
billmalarky,

1
@Kvisle Inoltre, segnerò una risposta corretta ma voglio che questo stufi un po 'per ottenere un buon brainstorming.
billmalarky,

9

IMHO dovresti essere in grado di andare con

innodb_buffer_pool_size=5G

Sarebbe il 62,5% di RAM con una quantità sufficiente di RAM per il SO del server più memoria per DB Connections

@kvisle ha raccomandato di utilizzare mysqltuner.pl. Questo script è eccellente per giudicare la quantità di RAM da dedicare a join_buffer_size, sort_buffer_size, read_buffer_size e read_rnd_buffer_size. Quei 4 buffer sommati vengono moltiplicati per max_connections. Tale risposta viene aggiunta ai buffer statici (innodb_buffer_pool_size + key_buffer_size). Vengono riportate le somme combinate. Se tale somma combinata supera l'80% della RAM, è allora che è necessario ridurre le dimensioni del buffer. mysqltuner.pl sarà molto utile in questo senso.

Poiché tutti i tuoi dati sono InnoDB, puoi rendere key_buffer_size (buffer cache chiave per indici MyISAM) molto basso (consiglio 64M).

Ecco un post che ho scritto in StackExchange DBA per calcolare una dimensione consigliata di innodb_buffer_pool_size .

AGGIORNAMENTO 2011-10-15 19:55 EDT

Se sai che avrai 5 GB di dati, la mia prima raccomandazione è stata OK. Tuttavia, ho dimenticato di aggiungere una cosa:

[mysqld]
innodb_buffer_pool_size=5G
innodb_log_file_size=1280M

La dimensione del file di registro deve essere il 25% del pool di buffer InnoDB

AGGIORNAMENTO 2011-10-16 13:36 EDT

La regola del 25% si basa esclusivamente sull'utilizzo di due file di registro. Sebbene sia possibile utilizzare più file di registro innodb, due di solito funzionano meglio.

Altri hanno espresso usando il 25%

Tuttavia, in tutta onestà, qualcuno della società originale InnoBase Oy ha espresso di non utilizzare la regola del 25% a causa del pool di buffer InnoDB più grande .

Naturalmente, la regola del 25% non può funzionare se si dispone di enormi quantità di RAM. In effetti, il più grande innodb_log_file_size consentito usando solo 2 file di registro è 2047M, poiché la dimensione combinata del file di registro deve essere inferiore a 4G (4096M)

CASO IN PUNTO: Uno dei clienti del mio datore di lavoro ha un server DB con 192 GB di RAM. Non è possibile avere file di registro 48G. Uso semplicemente la dimensione massima del file per un file di registro innodb, 2047M. Il commento di Kvisle sulla mia risposta fornisce semplicemente un link in cui si afferma che non è necessario limitarsi a due file di registro. Se hai N file di registro, non possono totalizzare 4G. La mia regola del 25% è proprio in un mondo perfetto (DB Server con 8 GB o meno).


Grazie, userò sicuramente mysqltuner.pl. Tuttavia, devo chiedere, quello script sarà ancora accurato se il mio database è vuoto in questo momento? Ho tutte le tabelle e lo schema impostati correttamente, ma nessun dato reale. Ho usato il 5 GB come esempio di dimensione che avrei usato sul mio attuale server dedicato (cioè, una volta che il DB diventerà più grande di quello, probabilmente passerò a un server dedicato migliore). Attualmente il database è vuoto (è un sito nuovo di zecca che non è stato avviato) ma voglio ottimizzare mysql per gestire bene il ridimensionamento prima del lancio.
billmalarky,

Aggiornato la mia risposta !!!
RolandoMySQLDBA,

Voglio commentare il "Deve essere il 25% del pool di buffer InnoDB". Perché non è vero al 100%. Leggi dev.mysql.com/doc/refman/5.0/en/… per una risposta più elaborata. Per quanto riguarda le prestazioni, aiuta molto ad aumentare un po 'le dimensioni rispetto al valore predefinito, ma non è necessario aumentarle al massimo.
Kvisle,

Rolando, grazie per l'aiuto. Ho inserito questa discussione tra i segnalibri come riferimento. Inoltre, sto usando quello script mysqltuner ora.
billmalarky,
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.