Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Fragmentacja danych - problem z wydajnością
tomerro
post
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 24.05.2013

Ostrzeżenie: (0%)
-----


Witam,

Mam duży problem z wydajnością bazy danych Mysql InnoDB.

Mam ostatnio duży ruch. I co parę godzin (nawet co 2-3) działanie strony drastycznie zwalnia. Okazuje się że mam fragmentowane wszystkie tabele.
Gdy zauważę to zwolnienie robię OPTIMAZE na wszystkich tabelach i działanie znów jest bardzo szybkie, aż do kolejnego zwolnienia.

Co może być przyczyną fragmentacji?

Podejrzewam że naprawdę bardzo duża liczba UPDATEÓW I INSERTÓW.
Aplikacja często robi UPDATE na tych samym wierszach. Np. mam tabelę POST i tabelę COMMENTS oraz POST_POINTS. Liczbę komentarzy i punktów przechowuję w wierszu tabeli POST tak aby mieć do nich szybki dostęp bez konieczności JOIN i COUNT. Za każdym razem gdy ktoś doda komentarz lub oceni POST muszę robić UPDATE nowej liczby komentarzy i punktów. Czy to może być przyczyna?

Jak zapobiec tej sytuacji?

Robienie co 2-3 godziny OPTIMAZE to zapewne okropnie zły pomysł, bo z tego co czytałem dopisuje dane do ibdata1.
Czytałem to: http://gagor.pl/2011/12/mysql-proste-metody-optymalizacji/
Czy powinienem zrobić kompaktowanie plików, dodać do my.cnf zapis innodb_file_per_table i rozdzielić ibdata1? Czy może problem leży gdzie indziej?
Czytałem że innodb_log_file_size powinien wynosić 25% innodb_buffer_pool_size, ale maksymalnie mogę ustawić 2GB zamiast 10GB (przez 32 bit).
Baza danych stoi na dedykowanym serwerze, przeznaczonym tylko pod bazę danych z 64GB RAM. Mój my.cnf:

  1. key_buffer = 3G
  2. key_buffer_size = 3G
  3. max_allowed_packet = 1M
  4. thread_stack = 192K
  5. thread_concurrency = 32
  6. thread_cache = 8
  7. thread_cache_size = 500
  8. join_buffer_size = 64M
  9. myisam-recover = BACKUP
  10. max_connections = 150
  11. table_open_cache = 4096
  12. table_cache = 2000
  13. query_cache_type = 1
  14. query_cache_limit = 4M
  15. query_cache_size = 1G
  16. sort_buffer_size = 16M
  17. read_buffer_size = 16M
  18. tmp_table_size = 512M
  19. max_heap_table_size = 512M
  20. open_files_limit = 65536
  21. innodb_buffer_pool_size = 40G
  22. innodb_additional_mem_pool_size = 20M
  23. innodb_flush_log_at_trx_commit = 2
  24. innodb_log_file_size = 2000M
  25. innodb_log_buffer_size = 8M
  26. innodb_thread_concurrency = 32
  27. innodb_flush_method = O_DIRECT

Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
alegorn
post
Post #2





Grupa: Zarejestrowani
Postów: 341
Pomógł: 40
Dołączył: 23.06.2009

Ostrzeżenie: (0%)
-----


ha, trudno odpowiedzieć czy zajmuje się tym zawodowo.
i tak - i nie.

może najlepiej będzie jeśli powiem że zajmowałem się tym od czasu do czasu w zeszłej firmie, poza tym interesowałem się optymalizacją.
nie jestem adminem, choć trochę zostałem przeszkolony w pracy.

QC - query cache (cache zapytań)
jeśli jest zbyt wiele zapytań, i jest przekroczony rozmiar buforu - jest wykonywany zrzut pamięci... czyli operacja o jednym z najwyższych priorytetów (co oznacza że cała baza sobie czeka aż proces się zakończy)

ilość połączeń - nie jest źle wobec tego, sporo mniej niż max.

procesy - ok, czyli mysql ci zabija serwer ale mi chodziło o polecenie : http://dev.mysql.com/doc/refman/5.1/en/show-processlist.html
wyświetli ci to listę poleceń jakie się właśnie wykonują, wraz z czasem ich wykonywania
możesz też doraźie je ubijać.

bez skrupułów zabijaj te które są powyżej 30 sec. http://dev.mysql.com/doc/refman/5.1/en/kill.html
przeglądarka i tak nie wyświetli już odpowiedzi
są narzędzia które to ułatwiają, nie pamiętam niestety(a nie mam tutaj) phpmyadmina... pewnie też coś takiego ma.


szukaj tych które trwają więcej niż kilka sec. jak masz ich dużo - to masz także poblokowane procesory (zakładam że masz min. 8 rdzeni)
zapisz je sobie i przeanalizuj te zapytania, trzeba koniecznie je przebudować. (explain itp)

podejrzewam ze wykonujesz cyklicznie jakaś kosztowna (czaso i zasobochlonna) operacje na tej dużej tabeli. musisz sprawdzić jakie operacje są na niej wykonywane, być może uda się je prosto zoptymalizować (np dodać jakiś index)


przeanalizuj, co się stało, co zostało zmienione, że serwer nie wyrabia.

zmiana kodu?
przyrost danych?
zwiększenie ruchu?

być może nie da się tego ominąć bez zmian sprzętowych (czasem ruch, ilość danych na tyle wzrasta, że nie ma opcji, sprzęt nie daje rady)

to tak na początek.


EDIT ważne
tak przyszło mi do głowy.
z ubijaniem bez skrupułów to tylko SELECT, nad insert/update to lepiej sie dwa razy zastanowić
slow loga włącz jedynie na jakiś czas. bo on także daje dodatkowe obciążenie



Ten post edytował alegorn 24.05.2013, 14:00:08
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 16.10.2025 - 01:34