Tadeusz Nowak

Tadeusz Nowak IT, Ekologia.pl

Temat: Problem z Mysql

Mam problem z pracą MySQL na systemie FreeBSD 8.0

serwer1 www Six-Core AMD Opteron(tm) Processor 2425 HE 4GB
serwer2 mysql Six-Core AMD Opteron(tm) Processor 2425 HE 4GB

Przy instalacji nie było problemu serwer pracuje, nie widać żeby skakało obciążenie.

Problem się pojawił jak sprawdziłem jak wykonują się zapytania na stronie.
Okazało się że pierwsze zapytanie, które pobiera rekordy z bazy przystaje na jakieś 100 milisekund i jest tak za każdym razem następne zapytania chodzą dobrze.

Dla przykładu zapytanie 'select * from tabela limit 100' 0.10176205635071s
a w logach serwera
# Query_time: 0.000239 Lock_time: 0.000045 Rows_sent: 90 Rows_examined: 90

Po kilku testach zauważyłem że jeśli wykonam przed nim zapytanie np.
'select * from tabela limit 33' jest już ok ale to jakieś chore jest.

Mysql jest w wersji 5.1.50 próbowałem też z innymi wersjami 5.0.x i 5.55.x
było to samo. Pomyślałem że coś może jest z clientem i modulem php_mysql
ale w przypadku mysql i mysqli jest to samo zmieniałem wersję php i też nic obecnie jest 5.3.x, spróbowalem z perlem i było to samo. Mysql postawiony w jailu. Postawiłem mysql poza jailem i to samo. Połączylem się bezpośrednio z serwera (umieściłem skrypt perla na serwerze mysql) na początku TCP i to samo dopiero przez socket poszło z mniejszym opóźnieniem ale i tak wolno.

Wykonałem zapytanie z flagą MYSQLI_USE_RESULT i wykonyjąc mysqli_fetch
przy 33 rekordzie bum jest opóźnienie 100 milisekund

przykład:

Odbieranie rekordów:
1. Time: 0.00083708763122559
2. Time: 0.00085806846618652
3. Time: 0.0008699893951416
4. Time: 0.00088095664978027
5. Time: 0.00089097023010254
6. Time: 0.0009009838104248
7. Time: 0.00091409683227539
8. Time: 0.00092411041259766
9. Time: 0.00093412399291992
10. Time: 0.00094413757324219
11. Time: 0.00095415115356445
12. Time: 0.00096416473388672
13. Time: 0.00097393989562988
14. Time: 0.00098299980163574
15. Time: 0.00099301338195801
16. Time: 0.0010030269622803
17. Time: 0.0010130405426025
18. Time: 0.0010230541229248
19. Time: 0.0010330677032471
20. Time: 0.0010430812835693
21. Time: 0.0010571479797363
22. Time: 0.0010671615600586
23. Time: 0.0010771751403809
24. Time: 0.001086950302124
25. Time: 0.0010981559753418
26. Time: 0.0011081695556641
27. Time: 0.0011179447174072
28. Time: 0.001129150390625
29. Time: 0.0011391639709473
30. Time: 0.0011489391326904
31. Time: 0.0011589527130127
32. Time: 0.001168966293335
33. Time: 0.0011789798736572 w tym miejscu jakieś 3K danych
34. Time: 0.10146808624268
35. Time: 0.10149717330933
...

Co też okazuje się dziwne łącząc się z innego serwera przez phpmyadmin
(freebsd 7.0 mysql_client 5.0.x) jest wszytko ok. Łączac się phpmyadminem z innym serwerem mysql (freebsd 7.0 mysql 5.0.x) przez 'serwer1' też jest ok. Tylko przy łączeniu serwer1 -> serwer2 występuje te opóźnienie.

Co to może być??????????Tadeusz Nowak edytował(a) ten post dnia 31.08.10 o godzinie 23:00
Stanisław P.

Stanisław P. Software designer

Temat: Problem z Mysql

Tadeusz Nowak:
Okazało się że pierwsze zapytanie, które pobiera rekordy z bazy przystaje na jakieś 100 milisekund i jest tak za każdym razem następne zapytania chodzą dobrze.

Cache cache cache, cache purge, etc.
Odpal sobie mysql_tuner i sprawdź gdzie Ci brakuje pamięci. ( http://mysqltuner.pl/ )
Tadeusz Nowak

Tadeusz Nowak IT, Ekologia.pl

Temat: Problem z Mysql

Cache mogę sobie ustawić nawet na 100M i tak jest tak samo
Nie ma znaczenia jaka jest wersja mysql czy jest to 5.0.x,5.1.x,5.5.x,5.6.x
cały czas jest to samo.

Po kolejnych testach wynika że przy trwałych połączeniach nie ma tego problemu.

w tcpdump wygląda jakby po obieraniu z sql coś było nie tak

09:01:59.394272 IP serwerhttp://26156 > serwerMYSQLl.3306: Flags [S], seq 4271121648, win 65535, options [mss 1460,nop,wscale 3,sackOK,TS val 35878077 ecr 0], length 0
09:01:59.394457 IP serwerMYSQLl.3306 > serwerhttp://26156: Flags [S.], seq 829674850, ack 4271121649, win 65535, options [mss 1460,nop,wscale 3,sackOK,TS val 1477586526 ecr 35878077], length 0
09:01:59.394487 IP serwerhttp://26156 > serwerMYSQLl.3306: Flags [.], ack 1, win 8326, options [nop,nop,TS val 35878077 ecr 1477586526], length 0
09:01:59.395191 IP serwerMYSQLl.3306 > serwerhttp://26156: Flags [P.], ack 1, win 8326, options [nop,nop,TS val 1477586527 ecr 35878077], length 64
09:01:59.395622 IP serwerhttp://26156 > serwerMYSQLl.3306: Flags [P.], ack 65, win 8326, options [nop,nop,TS val 35878078 ecr 1477586527], length 78
09:01:59.396070 IP serwerMYSQLl.3306 > serwerhttp://26156: Flags [P.], ack 79, win 8326, options [nop,nop,TS val 1477586528 ecr 35878078], length 11
09:01:59.396242 IP serwerhttp://26156 > serwerMYSQLl.3306: Flags [P.], ack 76, win 8326, options [nop,nop,TS val 35878079 ecr 1477586528], length 63

09:01:59.400755 IP serwerMYSQLl.3306 > serwerhttp://26156: Flags [.], ack 142, win 8326, options [nop,nop,TS val 1477586533 ecr 35878079], length 1448

:( 100ms

09:01:59.501010 IP serwerhttp://26156 > serwerMYSQLl.3306: Flags [.], ack 1524,
win 8326, options [nop,nop,TS val 35878184 ecr 1477586533], length 0

09:01:59.501221 IP serwerMYSQLl.3306 > serwerhttp://26156: Flags [.], ack 142, win 8326, options [nop,nop,TS val 1477586633 ecr 35878184], length 1448
09:01:59.501234 IP serwerMYSQLl.3306 > serwerhttp://26156: Flags [P.], ack 142, win 8326, options [nop,nop,TS val 1477586633 ecr 35878184], length 242
09:01:59.501243 IP serwerhttp://26156 > serwerMYSQLl.3306: Flags [.], ack 3214, win 8295, options [nop,nop,TS val 35878184 ecr 1477586633], length 0
09:01:59.501393 IP serwerhttp://26156 > serwerMYSQLl.3306: Flags [P.], ack 3214, win 8326, options [nop,nop,TS val 35878184 ecr 1477586633], length 5
09:01:59.501420 IP serwerhttp://26156 > serwerMYSQLl.3306: Flags [F.], seq 147, ack 3214, win 8326, options [nop,nop,TS val 35878184 ecr 1477586633], length 0
09:01:59.501661 IP serwerMYSQLl.3306 > serwerhttp://26156: Flags [.], ack 148, win 8325, options [nop,nop,TS val 1477586633 ecr 35878184], length 0
09:01:59.501809 IP serwerMYSQLl.3306 > serwerhttp://26156: Flags [F.], seq 3214, ack 148, win 8325, options [nop,nop,TS val 1477586634 ecr 35878184], length 0
09:01:59.501822 IP serwerhttp://26156 > serwerMYSQLl.3306: Flags [.], ack 3215, win 8325, options [nop,nop,TS val 35878184 ecr 1477586634], length 0
Stanisław P.

Stanisław P. Software designer

Temat: Problem z Mysql

Próbujesz znajdywać nazwy dns dla łączących się klientów? Jeśli tak to wyłącz: http://dev.mysql.com/doc/refman/5.0/en/server-options....
Tadeusz Nowak

Tadeusz Nowak IT, Ekologia.pl

Temat: Problem z Mysql

skip name resolve jest włączone
Tadeusz Nowak

Tadeusz Nowak IT, Ekologia.pl

Temat: Problem z Mysql

Zauważyłem że jak zmienię tabelę o krótszej nazwie zapytanie pójdzie ok jak wrócę do poprzedniej nazwy znowu opóżnienie ciekawe że to opóźnienie zawsze wynosi tyle samo czyli te 100 milisekund.

w tcpdump przed tym opóźnieniem mysql wysyła schemat danych tak przypuszczam bo w zawartości tcpdump widać nazwę tabeli (kilka razy się pojawia) i kolumny może coś z ustawieniami buforów sieciowych jest nie tak. Tak jakbym nie mógł przesłać więcej bo jak skracam nazwy tabel to zapytanie śmiga.

Zmiejszanie ilości rekordów też pomaga tyle że przy dużych tabela tzn o dużej ilości kolumn mogę pobrać np tylko jeden rekord. Nie ma znaczenie czy tabela jest MyISAM czy InnoDB.
Stanisław P.

Stanisław P. Software designer

Temat: Problem z Mysql

- Z czego to konkretnie tcpdump? Bo nie wygląda to na 33'ci rekord - bez danych trudno powiedzieć, ale ogólnie:

serwer26156 > serwerMYSQLl.3306: length 0
serwerMYSQLl.3306 > serwer26156: length 64
serwer26156 > serwerMYSQLl.3306: length 78
serwerMYSQLl.3306 > serwer26156: length 11
- pewnie się tutaj zalogowałeś)
serwer26156 > serwerMYSQLl.3306: length 63
- i to pewnie było Twoje zapytanie)
serwerMYSQLl.3306 > serwer26156: length 1448
- to pewnie pierwszy pakiet danych - to po nim jest przerwa na Twój ack

Co trochę nie pasuje do sytuacji którą opisujesz - jeśli dostajesz paczkę danych, to pewnie Twój skrypt nie dociąga następnych, aż dojdziesz do końca tego co masz.

Na oko to wygląda na problem z algorytmem TCP-nagle. W danych tcpdumpa wynika że wynik z mysql'a to pierwszy pakiet bez push'a. Może możesz NAGLE wyłączyć gdzieś w opcjach?

- No i pytanie finałowe:

"Okazało się że pierwsze zapytanie, które pobiera rekordy z bazy przystaje na jakieś 100 milisekund i jest tak za każdym razem następne zapytania chodzą dobrze."

Jeśli masz opóźnienie tylko i wyłącznie na pierwszym zapytaniu, to... czy naprawde jest się czym martwić?
Tadeusz Nowak

Tadeusz Nowak IT, Ekologia.pl

Temat: Problem z Mysql

Poszło faktycznie.

Tylko pytanie czy tak powinno być można to wyłączyć?
Czy coś innego nie siądzie?

Te 100ms przy każdej stronie to była by lipa a to tylko jedno zapytanie sql teraz dołożyć silnik stronki i wtedy już słabo to wypada.

Do tego proste skrypty które np zapisują statystyki odsłon reklam itp powinny szybko śmigać a tu byłaby lipa.Tadeusz Nowak edytował(a) ten post dnia 02.09.10 o godzinie 00:35
Tadeusz Nowak

Tadeusz Nowak IT, Ekologia.pl

Temat: Problem z Mysql

Wielkie dzięki za pomoc.
Tadeusz Nowak

Tadeusz Nowak IT, Ekologia.pl

Temat: Problem z Mysql

Dziwi mnie tylko że wyłączenie acl delay działa tylko na serwerze z www
a sądziłem że powinno wystarczyć jak wyłącze na serwerze z mysql.

Może wyłączenie tego ack delay nie do końca rozwiązuje problem i jest on gdzieś indziej.Tadeusz Nowak edytował(a) ten post dnia 02.09.10 o godzinie 20:50

Następna dyskusja:

Dziwny problem z userem MySQL




Wyślij zaproszenie do