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ń.