MySQL 5.1 InnoDB-Konfiguration / 24 GB RAM - Bi-Xeon-Hochlast


10

Ich betreibe eine Facebook-App, die derzeit 300 - 600 Benutzer gleichzeitig hat (und wächst). Um die Hardware für das Wachstum vorzubereiten, habe ich meinen i7 / 12 GB RAM / 2x 80 GB Intel x25 SSD (Debian 5.0 / MySQL 5.0 / 64 Bit) in einen Bi-Xeon / 24 GB RAM / 2x 120 GB Intel 320 SSD (Ubuntu 10.10 / MySQL 5.1 /) geändert. 64bit).

Jetzt stehe ich vor dem Problem, dass die Leistung schlechter ist als bei der "kleineren Box". Auf beiden Servern habe ich nginx / php fcgi verwendet, um den Inhalt bereitzustellen.

Ich benutze nur innodb und habe Reads / Writes von ungefähr 65% / 35%. Etwa 800 - 1000 qps, aber alle Abfragen sind einfach und verbinden niemals mehr als eine zusätzliche Tabelle. Alle Indizes sind festgelegt und es wird keine einzelne Abfrage im langsamen Protokoll (> 2s) protokolliert. Im Moment habe ich ungefähr 400 MB Daten (ungefähr 1 GB mit Indizes) und erwarte, dass sie sich jeden Monat verdoppeln.

Ich würde jeden lieben, der mir einen Hinweis geben könnte, was ich ändern soll, damit es reibungsloser läuft.

Die alte Konfiguration auf der i7-Box war wie folgt (gemischtes Myisam / Innodb) und lief bis zu 800+ Benutzern ziemlich gut.

alt 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

Die neue Konfiguration der Bi-Xeon-Box ist wie folgt (pure innodb) und verursacht bei über 300 Benutzern eine hohe Auslastung. Rund 30 MySQL-Prozesse stehen ganz oben auf der Prozessliste.

Festplatten-E / A:

    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, ist skip-name-resolvedeaktiviert und kann es aktiviert werden?
Wrikken

Antworten:


7

Ich habe einige Beiträge in der StackExchnage geschrieben

  1. Optimieren von MySQL für InnoDB und MyISAM
  2. So halten Sie InnoDB Diskspace unter Kontrolle
  3. Ein weiterer Gesichtspunkt zum MySQL Diskspace Managament
  4. Standpunkt zur InnoDB-Optimierung
  5. InnoDB Feinabstimmung

Bitte lesen Sie diese für die Anleitung, die Sie benötigen.

Nun zu dringlicheren Problemen: Sie haben erwähnt, dass Sie 400 MB Daten haben, 1 GB mit Indizes. Diese Art von Angst macht mir Angst, dass Ihre Indizes 50% größer sind als die Daten. Da jedoch alle Ihre Daten InnoDB sind und Sie mit der aktuellen Abfrageleistung zufrieden sind, sind Ihre Einstellungen mehr als ausreichend, insbesondere die 16384 MB von innodb_buffer_pool_size. Das sind 16 GB. Sie sind alle dort eingestellt. Aber warte !!! Ihre innodb_log_file_size ist 128M? Angesichts des 16-GB-Pufferpools viel zu klein. Sie sollten die Größe der ib_logfile-Dateien ändern (setzen Sie innodb_log_file_size auf 2047M).

Möglicherweise wird die Belastung pro Thread festgestellt. Versuchen Sie, Ihre Verbindungspuffer festzulegen (join_buffer_size, sort_buffer_size, read_buffer_size, read_rnd_buffer_size).

Von mir: Warum sagt MySQL, dass mir der Speicher ausgeht?

Von @DTest: Wie berechnet man die Variable mysql max_connections?

Versuche es !!!


Es ging nur darum, einige Indizes festzulegen ... jetzt habe ich einige Spalten, die in anderen Kombinationen doppelt indiziert sind ... und ich habe jetzt 35 GB Daten und 10'000qps ... und es funktioniert glatt wie Seide.
Kilian

0
  • Haben Sie einige Tabellen von MyISAM in InnoDB konvertiert?
    Wenn ja, suchen Sie unter http://mysql.rjweb.org/doc.php/myisam2innodb nach subtilen Leistungsverbesserungen / -verschlechterungen
  • innodb_flush_log_at_trx_commit = 1
    - bewirkt nach jeder Transaktion ein Schreiben in das Protokoll . Erwägen Sie die Verwendung = 2.
  • max_connections- SHOW GLOBAL STATUS LIKE 'max_used_connections'
    - das zeigt Ihnen, wie viele Sie seit dem Start benötigt haben.
  • Abfrage-Cache:

    query_cache_size        = 128M
    query_cache_type        = 1

    Diese können weh tun. Darüber hinaus 50Mverbringt die Qualitätskontrolle zu viel Zeit mit der Wartung. Es ONkann auch verschwenderisch sein. Haben ihre SHOW GLOBAL STATUS LIKE 'Qc%'Wirksamkeit zu überprüfen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.