MySQL: come posso ridurre il "massimo utilizzo possibile della memoria"?


16

Di recente ho avuto problemi con il thrashing a causa dell'esaurimento della memoria. (Il mio VPS ha un totale di 256M)

Sto cercando di ottimizzare MySQL utilizzando mysqltuner.pl e ottenere i seguenti risultati:

-------- Statistiche generali ---------------------------------------- ----------
[-] Controllo versione saltata per lo script MySQLTuner
[OK] Attualmente in esecuzione MySQL versione 5.0.51a-3ubuntu5.4-log supportata
[OK] Operativo su architettura a 64 bit

-------- Statistiche del motore di archiviazione --------------------------------------- ----
[-] Stato: + Archivio -BDB -Federated -InnoDB -ISAM -NDBCluster 
[-] Dati nelle tabelle MyISAM: 114M (Tabelle: 454)
[!!] Totale tabelle frammentate: 34

-------- Metriche delle prestazioni ---------------------------------------- ---------
[-] Fino a: 40s (570 q [14.250 qps], 23 conn, TX: 154K, RX: 23K)
[-] Letture / Scritture: 100% / 0%
[-] Buffer totali: 338,0 M globali + 2,7 M per thread (20 thread max)
[!!] Utilizzo massimo di memoria possibile: 392,9 M (153% della RAM installata)
[OK] Query lente: 0% (5/570)
[OK] Massimo utilizzo delle connessioni disponibili: 15% (3/20)
[!!] Dimensione buffer chiave / indici MyISAM totali: 8,0 M / 9,4 M
[!!] Percentuale di hit del buffer chiave: 57,1% (7 cache / 3 letture)
[OK] Efficienza cache query: 21,9% (7 cache / 32 selezioni)
[OK] Query cache prunes al giorno: 0
[OK] Ordinamenti che richiedono tabelle temporanee: 0% (0 ordinamenti temporanei / 1 ordinamenti)
[OK] Tabelle temporanee create su disco: 0% (0 su disco / 32 in totale)
[OK] Percentuale di hit della cache del thread: 86% (3 connessioni create / 23)
[OK] Percentuale di riscontri nella cache della tabella: 26% (128 aperti / 484 aperti)
[OK] Limite file aperto utilizzato: 25% (259 / 1K)
[OK] Blocchi tabella acquisiti immediatamente: 100% (492 blocchi immediati / 492 blocchi)

-------- Consigli ----------------------------------------- ------------
Raccomandazioni generali:
    Esegui OPTIMIZE TABLE per deframmentare le tabelle per prestazioni migliori
    MySQL è stato avviato nelle ultime 24 ore - i consigli potrebbero essere inaccurati
    Riduci il tuo footprint di memoria MySQL complessivo per la stabilità del sistema
Variabili da regolare:
  *** L'utilizzo massimo della memoria di MySQL è pericolosamente alto ***
  *** Aggiungi RAM prima di aumentare le variabili del buffer MySQL ***
    key_buffer_size (> 9.4M)

Ma sono un po 'confuso su come ottenere il massimo utilizzo della memoria? Sembra essere basato su key_buffer e max_connections, ma ci deve essere anche qualcos'altro coinvolto?

my.cnf:

key_buffer = 8M
max_allowed_packet = 12M
thread_stack = 128K
thread_cache_size = 8
max_connections = 20
table_cache = 128
tmp_table_size = 256M
max_heap_table_size = 256M
join_buffer_size = 256 KB
query_cache_limit = 8M
query_cache_size = 64M

Ho cercato di leggere gli articoli di tuning di MySQL, ma sembrano orientati verso le persone che sanno già cosa stanno facendo! Qualsiasi aiuto sarebbe apprezzato. Grazie!


1
Ho seguito il consiglio del commentatore e l'ho portato a un livello ragionevole, ma sono ancora curioso di sapere quali siano i sani ballparks per quei valori? Alcuni articoli online usano 64 K e altri raccomandano 512 M per lo stesso valore!
Nick,

Risposte:


10

Hai un server con 256M, ma non puoi usare tutto questo - ricorda che c'è un sovraccarico del sistema operativo. Aggiungilo a ciò con il fatto che stai finendo di impegnarti come hanno già detto altre persone e sicuramente ti sbatterai qui. 256M sono sufficienti solo per un DB di piccole dimensioni, 20 connessioni sono molte con ciò che hai configurato.

1) riduci le tue connessioni massime a 4 (stai usando 3 su 20)

2) ottimizzare meglio la cache delle query; 8M è davvero grande e 64M in totale sono molto basati sui tuoi colpi / prugne secche; prova una combo 4/32 e guarda come va. Penso davvero che una combinazione 2/24 funzionerebbe per te.

3) non hai alcun tipo che richieda tabelle temporanee, perché c'è quel verbo max_heap_table_size lì dentro? Commentalo, usa le impostazioni predefinite

4) hai effettivamente 128 tavoli? Prova a tagliare quel table_cache a metà a 64 o 48

5) riduci thread_cache_size a 4

6) ottimizzare quelle tabelle per ridurre la frammentazione

Queste sono alcune cose per cominciare. Sembra che tu abbia lanciato un mucchio di numeri in una configurazione senza alcuna profilazione effettiva per sapere di cosa hai bisogno e aver creato un pasticcio; se tutto il resto fallisce, torna alle impostazioni predefinite e sbarazzati delle tue impostazioni personalizzate e ricomincia da capo usando alcune guide di ottimizzazione delle prestazioni che puoi trovare su Google. Ottieni l'output di SHOW VARIABLES e SHOW STATUS, trova uno qualsiasi dei bajillion tuning guide e collega i tuoi numeri reali e reali nelle loro equazioni e ti dirà i numeri esatti che devi inserire nel tuo file di configurazione.


3
Questa è una vecchia risposta a una vecchia domanda, ma vorrei sottolineare che nel risultato mysqltuner pubblicato dall'asker il server è rimasto attivo solo per 40 secondi, il che non è abbastanza tempo per giudicare con precisione i carichi che il server vedrà . Idealmente, dovresti eseguire mysqltuner alcune volte nel corso di uno o più giorni, quindi analizzare i risultati. A parte questo, i tuoi suggerimenti sono validi.
instanceofTom

8

Non sono un guru di MySQL e non riesco a diagnosticare il problema con queste informazioni, ma ho provato a cercare la formula nel codice sorgente. Ecco qui:

server_buffers + total_per_thread_buffers * max_connections

Dove:

server_buffers = key_buffer_size + innodb_buffer_pool_size + innodb_additional_mem_pool_size + innodb_log_buffer_size + query_cache_size

e:

total_per_thread_buffers = read_buffer_size + read_rnd_buffer_size + sort_buffer_size + thread_stack + max_allowed_packet + join_buffer_size

Ora devi controllare ciascuno di questi valori e capire quale è responsabile di questo numero enorme. E non fidarti di questo script senza riserve - ho provato a eseguirlo su uno dei miei server DB e ho calcolato che la memoria massima è il 140% della quantità totale di memoria fisica, ma il sistema è in esecuzione da anni senza problemi di stabilità.

In bocca al lupo!


0

Se ricordo bene, MySQL Tuner utilizza la seguente formula per stimare l'utilizzo massimo:

read_buffer_size + read_rnd_buffer_size + sort_buffer_size + thread_stack + join_buffer_size

Tieni presente che questo non è corretto al 100% ed è in realtà solo una stima, poiché alcune impostazioni in MySQL non hanno limiti definiti.

Puoi iniziare ad attenuare alcune delle impostazioni nel tuo file di configurazione ed eseguire nuovamente il sintonizzatore, ma ti consiglierei di chiedere l'aiuto di un esperto se non hai tempo da perdere cambiando my.cnf, riavviandolo ed eseguendo il sintonizzatore.


0

L'uso del software mysqlcalculator.com può farti risparmiare molte ore.

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.