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
źródło
skip-name-resolve
wyłączony i czy można go włączyć?Odpowiedzi:
Napisałem kilka postów w StackExchnage
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 !!!
źródło
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ń:
Mogą być bolesne. Powyżej, powiedzmy,
50M
QC poświęca zbyt wiele czasu na konserwację. Posiadanie goON
może być również marnotrawstwem. CzySHOW GLOBAL STATUS LIKE 'Qc%'
sprawdzić skuteczność.źródło