Il processo MySQL supera il 100% dell'utilizzo della CPU


10

Sto riscontrando alcuni problemi con il mio server LAMP. Recentemente tutto è diventato molto lento, anche se il conteggio dei visitatori sui miei siti Web non è cambiato molto. Quando eseguo il topcomando, si dice che il processo MySQL ha assorbito oltre il 150-200% della CPU. Com'è possibile, ho sempre pensato che il 100% fosse un massimo?

Sto eseguendo Ubuntu 9.04 Server Edition con 1,5 GB di RAM.

my.cnf impostazioni:

key_buffer      = 64M
max_allowed_packet  = 16M
thread_stack        = 192K
thread_cache_size       = 8

myisam-recover         = BACKUP
max_connections        = 200
table_cache            = 512
table_definition_cache = 512
thread_concurrency     = 2

read_buffer_size = 1M
sort_buffer_size = 4M
join_buffer_size = 1M

query_cache_limit   = 1M  # the maximum size of individual query results
query_cache_size    = 128M

Ecco l'output di MySQLTuner :

Uscita MySQLTuner

Il topcomando:

massima resa

Quale potrebbe essere la causa di questo problema? Posso apportare modifiche al mio my.cnfper evitare che il server si blocchi?

Risposte:


15
  1. Aumenta Key Buffer (il tuo è attualmente 64 MB, ma gli indici totali sono 116 MB, quindi metti almeno 128 MB). Dovrebbe aiutare immediatamente.
  2. Esegui mysqloptimize e mysqlrepair sui tuoi tavoli
  3. Aumentare la cache delle tabelle / ridurre il numero totale di tabelle per aumentare la percentuale di riscontri nella cache delle tabelle. Forse hai alcune tabelle inutilizzate o vecchie che potrebbero essere eliminate.

Altre opzioni di confugrazione consigliate:

  • log_slow_queries = /var/log/mysql/mysql-slow.log
  • long_query_time = 4
  • log-query-non-uso-indici

Controlla il file di registro dopo qualche tempo.


Grazie per i consigli, li proverò e ti farò sapere se ha aiutato.
Temnovit,

dimmi per favore, come hai calcolato che gli indici totali sono 116M?
Temnovit,

capito da solo :)
Temnovit,

5

Hai un processore che ha più di un core o hai più processori. Se si dispone di due core e un processo utilizza il 100% di entrambi i core, verrà visualizzato il 200% in cima.

Allo stesso modo, probabilmente sta funzionando come previsto: nulla è sbagliato nella configurazione. Se riscontri frequenti blocchi, da quello che hai pubblicato, potresti voler esaminare l'aggiunta di indici adeguati alle tue tabelle (o l'ottimizzazione delle tue query).


5

Esegui top -Hper vedere tutti i thread in esecuzione e non solo l'intero processo. Inoltre, se premi il 1tasto mentre sei in alto, ti mostrerà l'utilizzo della cpu per le singole CPU / core.


Grazie, questo mi ha davvero aiutato - ho usato top per anni e non sapevo che avesse questa capacità. Ho scoperto che esiste un thread mysql "eterno" che consuma sempre il 60% di CPU utente, mentre i thread di query vanno e vengono in cima a questo. Ora per scoprire cosa sta realmente facendo questo thread ...
scipilot,

1

Mysql ha più processi (thread) che funzionano in modo indipendente, uno, ad esempio, è responsabile della scrittura dei dati dalla memoria sul disco. Con più core nella CPU (e / o più CPU), funziona più di un thread e quindi può eseguire più del 100% di un singolo core - a un livello semplicistico, forse il 75% di ciascuno dei due core è in esecuzione , dando il 150%.


1

Ho notato un problema, non correlato alla CPU. Se stai usando apache e MySQL sullo stesso server puoi raggiungere cattive condizioni ( RAM ) quando aumenta l'attività di apache.

MySQLTunner ti dice che usando le 200 connessioni disponibili (la tua impostazione di connessione massima) riempirai la RAM. Supponiamo che tu abbia limitato apache a 150 processi e di certo non avrai abbastanza RAM quando MySQL e apache proveranno ad usare 150 connessioni (dato che anche Apache è un buon mangiatore di RAM).

Quindi si tratta di RAM e forse non sei ancora colpito :-) I comandi principali mostrano solo 15 processi di apache (ma sei in carico in media il 3/6/16, quindi ciò significa che la tempesta è stata 15 minuti fa ed è ora in in partenza).

Per quanto riguarda il problema della CPU, a complemento della buona risposta di shakalandy , ciò può essere dovuto a una singola query. Può trovarsi su una tabella enorme, o fare molte attività di reindicizzazione o usare molti file temporanei, un indice mancante (rimosso?), Ecc. L'unico modo per rilevarlo è attivare il registro delle query lente (forse con un passo alto, come 8s). Quindi utilizzare lo strumento mysqlsla per analizzare questo registro delle query lente ed eseguire alcune spiegazioni sulle query identificate.


Grazie, infatti, mysql non è l'unico processo in circolazione :)
Temnovit,
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.