2015-11-27 32 views
6

Mam MySQL 5.6.27-0ubuntu0.14.04.1, które działają na instancji Google Compute z 4 procesorami.CPU MySQL wzrasta, gdy mam połączenie Sleeping, które pozostaje otwarte

Zauważyłem, że jeśli mam połączenie przez długi czas z Uśpieniem, to procesor serwera zwiększy się liniowo. Nie rozumiem dlaczego? Jeśli zabiję połączenie Sleep, to CPU po prostu przywróci poprawne użycie.

Więc Podsumowując Mam następujący: zauważam CPU mojego instancji rośnie: enter image description here

Potem sprawdź processlist na moim serwerze

mysql> show processlist 
-> ; 
+-------+--------+-------------------+----------------+---------+------+-------+------------------+ 
| Id | User | Host    | db    | Command | Time | State | Info    | 
+-------+--------+-------------------+----------------+---------+------+-------+------------------+ 
| 85949 | nafora | paper-eee-2:58461 | state_recorder | Sleep | 1300 |  | NULL    | 
| 85956 | nafora | paper-eee-2:58568 | state_recorder | Sleep | 64 |  | NULL    | 
| 85959 | root | localhost   | NULL   | Query | 0 | init | show processlist | 
+-------+--------+-------------------+----------------+---------+------+-------+------------------+ 

Widać mam tylko 2 połączenie, które Sleep i jeden jest tutaj od 1300 sekund (ponieważ mam proces, który utknął przy otwartym połączeniu)

Więc zabiję połączenie 85949, a procesor po prostu fa w dół. enter image description here

Czy ktoś może mi wyjaśnić, dlaczego pojedyncze połączenie, które śpi, może mieć wpływ na moją bazę danych w ten sposób.

Dzięki.

+0

Dziwny problem. Czy możesz dodać trochę więcej informacji o systemie? Wersja MySQL? Może InnoDB lub MyISAM? W przypadku wyjścia InnoDB programu 'SHOW ENGINE INNODB STATUS'? Umożliwienie monitorowania może być również przydatne: http://dev.mysql.com/doc/refman/5.0/en/innodb-monitors.html. Jakieś tło na połączeniach? Czy dużo czytali/zapisywali, zanim stali się bezczynni. Czy są autopowiadomieni? itp. –

+1

Powinieneś spróbować dowiedzieć się, co robi ten proces. Może ten artykuł pomaga: https://www.percona.com/blog/2007/02/08/debugging-sleeping-connections-with-mysql/ – fancyPants

Odpowiedz

2

Niektóre niezamknięte połączenia lub długo działające powolne zapytania mogą powodować takie zachowanie. Można ograniczyć połączenia niezamknięte, konfigurując zmienną globalną wait_timeout jako rozsądną wartość, a także ustawiając inną powiązaną zmienną interactive_timeout, zgodnie z najlepszą praktyką.

Aplikacje stanowe korzystające z puli połączeń (Java, .NET itp.) Będą musiały dostosować wartość wait_timeout, aby była zgodna z ich ustawieniami puli połączeń. Domyślne 8 godzin (wait_timeout = 28800) działa dobrze w przypadku prawidłowo skonfigurowanych pul połączeń.

Skonfiguruj wartość parametru wait_timeout , aby była nieco dłuższa niż oczekiwany czas życia połączenia aplikacji w puli połączeń. To jest dobra kontrola bezpieczeństwa. Również profiluj zapytania, aby obserwować wydajność instancji MySQL, pomoże ci uniknąć I/O bottlenecks.