Configurazione MySQL 5.1 InnoDB / 24 GB di RAM - carico elevato bi-xeon


10

sto eseguendo un'app di Facebook che attualmente ha 300 - 600 utenti simultanei (e in crescita). Per preparare l'hardware per la crescita ho cambiato il mio i7 / 12gb ram / 2x 80 gb Intel x25 ssd (debian 5.0 / mysql 5.0 / 64bit) in un bi-xeon / 24 gb ram / 2x 120 gb Intel 320 ssd (ubuntu 10.10 / mysql 5.1 / 64bit).

ora sto affrontando il problema che le prestazioni sono peggiori rispetto alla "scatola più piccola". Su entrambi i server ho usato nginx / php fcgi per servire il contenuto.

sto usando solo innodb, avendo letture / scritture circa il 65% / 35%. Circa 800 - 1000 qps, ma tutte le query sono semplici e non partecipano mai a più di 1 tabella aggiuntiva. Vengono impostati tutti gli indici e nessuna query singola viene registrata nel registro lento (> 2s). Al momento ho circa 400 MB di dati (circa 1 GB con indici) che mi aspetto di raddoppiare ogni mese.

Adorerei tutti quelli che potrebbero darmi un suggerimento su cosa cambiare per renderlo più fluido.

La vecchia configurazione sulla scatola i7 era così (mista myisam / innodb), eseguita abbastanza bene fino a oltre 800 utenti.

vecchio my.cnf

   key_buffer              = 3000M
   max_allowed_packet      = 128M
   thread_stack            = 192K
   thread_cache_size       = 8
   max_connections        = 400
   table_cache            = 8000
   thread_concurrency     = 16
   query_cache_limit       = 8M
   query_cache_size        = 128M
   wait_timeout            = 10
   interactive_timeout     = 10
   connect_timeout         = 600
   low_priority_updates    = 1
   join_buffer_size        = 8M
   read_buffer_size        = 2M
   sort_buffer_size        = 3M
   myisam_sort_buffer_size = 32M
   read_rnd_buffer_size    = 4M
   innodb_buffer_pool_size = 3G
   innodb_log_buffer_size  = 8M

La nuova configurazione sulla scatola bi-xeon è così (innodb puro), causando un carico elevato con oltre 300 utenti. Circa 30 processi mysql si trovano in cima all'elenco dei processi.

I / O del disco:

    avg-cpu:  %user   %nice %system %iowait  %steal   %idle
              36.28    0.00    1.60    0.17    0.00   61.95

my.cnf

    key_buffer              = 64M
    max_allowed_packet      = 1M
    thread_stack            = 192K
    thread_cache_size       = 128
    max_connections        = 500
    table_cache            = 512
    #thread_concurrency     = 10
    sort_buffer_size        = 256K
    read_buffer_size        = 256K
    read_rnd_buffer_size    = 256K
    tmp_table_size          = 32M
    max_heap_table_size     = 32M
    query_cache_limit       = 1M
    query_cache_size        = 128M
    query_cache_type        = 1

    innodb_file_per_table = 1
    innodb_data_file_path = ibdata1:1000M:autoextend
    innodb_buffer_pool_size = 16384M
    innodb_additional_mem_pool_size = 8M
    innodb_flush_log_at_trx_commit = 1
    innodb_support_xa = 0
    innodb_lock_wait_timeout = 50
    innodb_flush_method=O_DIRECT
    innodb_log_files_in_group = 2
    innodb_log_file_size = 128M
    innodb_log_buffer_size = 8M
    innodb_thread_concurrency = 12

Hmmm, è skip-name-resolvedisabilitato e può essere abilitato?
Wrikken,

Risposte:


7

Ho scritto alcuni post in StackExchnage

  1. Ottimizzazione di MySQL per InnoDB e MyISAM
  2. Come tenere sotto controllo Diskspace di InnoDB
  3. Un altro punto di vista su MySQL Diskspace Managament
  4. Punto di vista sull'ottimizzazione di InnoDB
  5. Sintonia fine di InnoDB

Si prega di leggere questi per la guida di cui hai bisogno.

Ora, per problemi più urgenti: hai detto che hai 400 MB di dati, 1 GB con indici. Questo tipo di mi fa paura che i tuoi indici siano più grandi del 50% rispetto ai dati. Tuttavia, poiché tutti i tuoi dati sono InnoDB e sei soddisfatto delle prestazioni della query corrente, le tue impostazioni sono più che adeguate, soprattutto i 16384 MB di innodb_buffer_pool_size. Sono 16 GB. Sei pronto lì. Ma aspetta !!! La tua innodb_log_file_size è 128M? Troppo piccolo dato il pool di buffer da 16 GB. È necessario ridimensionare i file ib_logfile (impostare innodb_log_file_size su 2047M).

È possibile che si verifichi un caricamento in base al thread. Prova a impostare i buffer di connessione (join_buffer_size, sort_buffer_size, read_buffer_size, read_rnd_buffer_size)

Da parte mia: Perché MySQL dice che ho esaurito la memoria?

Da @DTest: come si calcola la variabile mysql max_connections?

Provaci !!!


si trattava solo di impostare alcuni indici ... ora ho alcune colonne che sono doppie indicizzate in altre combinazioni ... e ora ho 35 GB di dati e 10'000qps ... e funziona liscio come la seta.
Kilian,

0
  • Hai convertito alcune tabelle da MyISAM a InnoDB?
    In tal caso, verificare la presenza di miglioramenti / riduzioni delle prestazioni sottili in http://mysql.rjweb.org/doc.php/myisam2innodb
  • innodb_flush_log_at_trx_commit = 1
    - provoca una scrittura nel registro dopo ogni transazione. Prendi in considerazione l'utilizzo = 2.
  • max_connections- SHOW GLOBAL STATUS LIKE 'max_used_connections'
    - questo ti dirà quanti ne avevi bisogno dall'avvio.
  • cache delle query:

    query_cache_size        = 128M
    query_cache_type        = 1
    

    Questi potrebbero essere dolorosi. Sopra, diciamo, 50Mil controllo qualità impiega troppo tempo per la manutenzione. Anche averlo ONpotrebbe essere uno spreco. Fare SHOW GLOBAL STATUS LIKE 'Qc%'per verificare l'efficacia.

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.