Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Utrata połączenia z serwerem MySQL podczas wysyłania losowych zapytań prostych

Połączenie z MySQL może zostać przerwane na wiele sposobów, ale sugerowałbym ponowne zapoznanie się z odpowiedzią Mario Carriona, ponieważ jest to bardzo mądra odpowiedź.

Wydaje się prawdopodobne, że połączenie jest zakłócone, ponieważ jest współdzielone z innymi procesami, powodując błędy protokołu komunikacyjnego...

...może to łatwo się zdarzyć, jeśli pula połączeń jest powiązana z procesem, co moim zdaniem jest w ActiveRecord, co oznacza, że ​​to samo połączenie może być "pobrane" kilka razy jednocześnie w różnych procesach.

Rozwiązaniem jest to, że połączenia z bazą danych muszą być nawiązywane dopiero PO fork oświadczenie na serwerze aplikacji.

Nie jestem pewien, którego serwera używasz, ale jeśli używasz warmup funkcja - nie.

Jeśli uruchamiasz jakiekolwiek wywołania bazy danych przed pierwszym żądaniem sieci - nie rób tego.

Każda z tych akcji może potencjalnie zainicjować pulę połączeń przed fork , powodując, że pula połączeń MySQL jest dzielona między procesy, podczas gdy system blokowania nie jest.

Nie twierdzę, że jest to jedyny możliwy powód problemu, jak stwierdził @sloth-jr, istnieją inne opcje... ale większość z nich wydaje się mniej prawdopodobna, zgodnie z twoim opisem.

Przypis:

Każdy proces może posiadać pewną liczbę połączeń. W Twoim przypadku możesz mieć do 500X36 połączeń . (patrz edycja)

Ogólnie liczba połączeń w puli często może być taka sama jak liczba wątków w każdym procesie (nie powinna być mniejsza niż liczba wątków, w przeciwnym razie rywalizacja spowolni Cię). Czasami dobrze jest dodać jeszcze kilka w zależności od aplikacji.

EDYTUJ:

Przepraszam za zignorowanie faktu, że licznik procesów odwołuje się do danych MySQL, a nie danych aplikacji.

Pokazana liczba procesów to dane serwera MySQL, które wydaje się używać schematu IO wątku na połączenie . Dane „Process” faktycznie liczą aktywne połączenia a nie rzeczywiste procesy lub wątki (chociaż powinno to również przekładać się na liczbę wątków).

Oznacza to, że z możliwych 500 połączeń na procesy aplikacji (tj. jeśli używasz 8 procesów dla swojej aplikacji, będzie to 8X500=4000 dozwolonych połączeń) Twoja aplikacja otworzyła do tej pory tylko 36 połączeń.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL - jak przechowywać czas z prawidłową strefą czasową? (z Javy)

  2. Warunkowy SELECT MySQL w SELECT

  3. Czy połączenie z bazą danych powinno być otwarte przez cały czas, czy powinno być otwierane tylko w razie potrzeby?

  4. Wyodrębnienie tylko daty z pola datetime (mysql) i przypisanie jej do zmiennej php

  5. Przygotowana instrukcja MySql Connector przesyła tylko 64 bajty