Konfiguracja MySQL 5.1 InnoDB / 24 GB RAM - wysokie obciążenie bi-xeon

10

Korzystam z aplikacji na Facebooku, która obecnie ma 300 - 600 równoczesnych użytkowników (i stale rośnie). Aby przygotować sprzęt do rozwoju, zmieniłem mój i7 / 12GB RAM / 2x 80GB Intel X25 SSD (Debian 5.0 / MySQL 5.0 / 64bit) na bi-Xeon / 24GB RAM / 2x 120GB Intel 320 SSD (Ubuntu 10.10 / MySQL 5.1 / 64bit).

teraz mam problem z tym, że wydajność jest gorsza niż na „mniejszym pudełku”. Na obu serwerach korzystałem z nginx / php fcgi do obsługi zawartości.

używam tylko innodb, mając Odczyt / Zapis około 65% / 35%. Około 800 - 1000 qps, ale wszystkie zapytania są proste i nigdy nie dołączają do więcej niż 1 dodatkowej tabeli. Wszystkie indeksy są ustawione i żadne pojedyncze zapytanie nie jest rejestrowane w wolnym logu (> 2s). W tej chwili mam około 400 MB danych (około 1 GB z indeksami), oczekując, że podwoi się co miesiąc.

Uwielbiam wszystkich, którzy mogliby mi podpowiedzieć, co mam zmienić, aby działało płynniej.

Stara konfiguracja na i7 boxie była taka (mieszany myisam / innodb), działała całkiem dobrze do ponad 800 użytkowników.

stary 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

Nowa konfiguracja na bi-xeon box jest taka (czysta innodb), powodując duże obciążenie dla ponad 300 użytkowników. Około 30 procesów mysql znajduje się na szczycie listy procesów.

Dysk I / O:

    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
Kilian
źródło
Hmmm, jest skip-name-resolvewyłączony i czy można go włączyć?
Wrikken

Odpowiedzi:

7

Napisałem kilka postów w StackExchnage

  1. Tuning MySQL dla InnoDB i MyISAM
  2. Jak zachować kontrolę nad dyskiem InnoDB
  3. Kolejny punkt widzenia na MySQL Diskspace Managament
  4. Punkt widzenia na temat optymalizacji InnoDB
  5. Dostrajanie InnoDB

Przeczytaj je, aby uzyskać potrzebne wskazówki.

Teraz, dla bardziej palących problemów: Wspomniałeś, że masz 400 MB danych, 1 GB z indeksami. Ten rodzaj przeraża mnie, że twoje indeksy są o 50% większe niż dane. Ponieważ jednak wszystkie twoje dane to InnoDB i jesteś zadowolony z bieżącej wydajności zapytań, twoje ustawienia są więcej niż wystarczające, zwłaszcza 16384 MB innodb_buffer_pool_size. To 16 GB. Wszyscy jesteście tam osadzeni. Ale poczekaj !!! Twój rozmiar pliku dziennika_wpisu wynosi 128 mln? Zbyt mały, biorąc pod uwagę pulę buforów 16 GB. Powinieneś zmienić rozmiar plików ib_logfile (ustaw rozmiar innodb_log_file_sile na 2047M).

Być może występują obciążenia dla poszczególnych wątków. Spróbuj ustawić bufory połączeń (rozmiar_łączenia_buforu, rozmiar_buforu sortowania, rozmiar_bufera odczytu, rozmiar_bufera_dysku)

Ode mnie: Dlaczego MySQL mówi, że brakuje mi pamięci?

Od @DTest: Jak obliczyć zmienną mysql max_connections?

Spróbuj !!!

RolandoMySQLDBA
źródło
chodziło o ustawienie niektórych indeksów ... teraz mam kilka kolumn, które są podwójnie indeksowane w innych kombinacjach ... i mam teraz 35 GB danych i 10'000qps ... i to działa gładko jak jedwab.
Kilian
0
  • Czy przekonwertowałeś niektóre tabele z MyISAM na InnoDB?
    Jeśli tak, sprawdź subtelne ulepszenia / obniżenia wydajności w http://mysql.rjweb.org/doc.php/myisam2innodb
  • innodb_flush_log_at_trx_commit = 1
    - powoduje zapis do dziennika po każdej transakcji. Rozważ użycie = 2.
  • max_connections- SHOW GLOBAL STATUS LIKE 'max_used_connections'
    - to powie ci ile potrzebujesz od uruchomienia.
  • pamięć podręczna zapytań:

    query_cache_size        = 128M
    query_cache_type        = 1

    Mogą być bolesne. Powyżej, powiedzmy, 50MQC poświęca zbyt wiele czasu na konserwację. Posiadanie go ONmoże być również marnotrawstwem. Czy SHOW GLOBAL STATUS LIKE 'Qc%'sprawdzić skuteczność.

Rick James
źródło