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
tomerro
post
Post #2





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

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


Odpaliłem mysqltuner.pl i oto wiersze oznaczone [(IMG:style_emoticons/default/exclamation.gif) !]:

[(IMG:style_emoticons/default/exclamation.gif) ] Total fragmented tables: 42 -moja baza ma 28 tabel (czyli pewnie wszystkie są fragmentowane)
[(IMG:style_emoticons/default/exclamation.gif) ] Maximum possible memory usage: 58.7G (93% of installed RAM) -serwer jest tylko pod MySQL wiec to chyba nie problem
[(IMG:style_emoticons/default/exclamation.gif) ] Query cache efficiency: 19.0% (618K cached / 3M selects) -zapytania mam dla każdego zalogowanego użytkownika bardzo indywidualne, przez parametry, filtry, więc może to dla tego
[(IMG:style_emoticons/default/exclamation.gif) ] Joins performed without indexes: 150
[(IMG:style_emoticons/default/exclamation.gif) ] Table cache hit rate: 8% (189 open / 2K opened)

Dodatkowo odpaliłem doradcę w PHPMyAdmin, oto screen podpowiedzi: http://i.imgur.com/CHG1npc.png

Locki są na pewno (tak myślę), ale jak mówię przez 2-3 godziny wszystko jest super, a obciążenie ruchu jest ciągle takie samo. Wygląda jakby coś się zapychało aż osiągnie krytyczny stan i się zawiesza, ale to tylko moje przypuszczenie, dlatego Panowie proszę o pomoc, sprawa bardzo pilna.


EDIT:

Odświeżałem SHOW PROCESSLIST co pół sekundy oto co zauważyłem:

Wszystkie zapytania SQL pojawiają się i przy następnym odświeżeniu znikają, żadne nie czekają, tak jest nawet gdy strona zwolni bo już obserwowałem wcześniej. Zresztą swojego czasu optymalizowałem zapytania tak aby wykonywały się na indeksach i nie dłużej niż 0,1s.

Natomiast co każde odświeżenie pojawiaja się 1-3 procesów SLEEP, niektóre znikają od razu a inne nawet są przez 10 sekund.

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

Posty w temacie


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

 



RSS Aktualny czas: 16.10.2025 - 04:46