Problem został rozwiązany po rozpoczęciu ponownego nawiązywania połączeń z bazą danych. Używaliśmy sequel
w projekcie, a Pasażer sam zajmuje się tym problemem tylko wtedy, gdy używany jest ActiveRecord.
Aby to rozwinąć, domyślnie pasażer używa inteligentnego spawnowania dla aplikacji rubinowych. Najpierw uruchamia proces preloadera, który ładuje framework i wszystkie biblioteki. Po tym procesie wstępnego ładowania, gdy zajdzie taka potrzeba, odradzają się procesy robocze, które obsługują żądania. Podczas tworzenia procesów roboczych wszystkie deskryptory plików są dziedziczone z procesu wstępnego ładowania. Jeśli więc nie nawiążesz ponownie połączenia z bazą danych, wszystkie procesy robocze współdzielą jedno, ustanowione przez preloader. Co prowadzi do różnego rodzaju dziwnych zachowań. Lubię żądania, które trwają zbyt długo.
Wcześniej przenieśliśmy również obsługę połączeń WebSocket do osobnego procesu. Nie jestem jednak pewien, czy przyczyniło się to do problemu.
Więcej na ten temat tutaj:
Odłącz, jeśli używasz serwera Forking Webserver ze wstępnym ładowaniem kodu
Niezamierzone udostępnianie deskryptorów plików
Uruchamianie serwera Action Cable na tym samym hoście i porcie, pod sub-URI