Probleme mit Mongrel Threads

Beim Durchsehen unserer Logs fiel uns in den letzten Tagen auf, dass sich Apache zunehmend drüber beschwerte, einzelne Mongrel-Instanzen nicht mehr connecten zu können (unser Setup: Apache 2.2, mod_proxy_balancer und dahinter eine Armee aus sechs Mongrels). Im Apache error.log macht sich das folgendermaßen bemerkbar:

proxy: error reading status line from remote server 127.0.0.1:PORTNR

Guckt man sich darauf hin das mongrel.log zum Mongrel auf dem jeweiligen Port an, so findet man folgendes:

Reaping x threads for slow workers because of 'shutdown'

Beim danach googlen haben wir wenig gefunden, was uns wirklich weitergeholfen hat, daher haben wir es einfach mal mit der Lösung versucht, di in diesem Thread angepriesen wird: Das MySQL-Gem neu installieren bzw. konfigurieren (mit den Optionen --with-mysql-config[=/path/to/mysql_config] und --with-mysql-dir=/mysql/dir). Es gibt zwar keinerlei Hinweis darauf, warum das Problem grade damit zusammenhängt, aber es hat geholfen, so dass ich es nicht unerwähnt lassen wollte, falls sich jemand mit ähnlichen Problemen auf die Suche begibt.

Falls jemand genaueres weiss, bitte melden, wir sind für wietere Hinweise sehr dankbar!

UPDATE

Okay, ich hätte das lieber nicht zu früh sagen sollen. Gestern Abend hatten wir das Problem erneut und es scheint eher zufällig unter erhöhter Last aufzukommen. Eine lange Runde googlen später fand ich dann mehrere Hinweise darauf, dass es wohl mit einem MySQL-Verbindungsabbruch zusammenhängen könnte, wie auch schon die Jungs von Upstream bemerkt haben.

Das deckt sich auch mit Erklärungen in der Mongrel-FAQ, wo es heisst:

If you find that Mongrel stops working after a long idle time and you’re using MySQL then you’re hitting a bug in the MySQL driver that doesn’t properly timeout connections. What happens is the MySQL server side of the connection times out and closes, but the MySQL client doesn’t detect this and just sits there. What you have to do is set: `ActiveRecord::Base.verification_timeout = 14400` Or to any value that is lower than the MySQL server’s interactive_timeout setting. This will make sure that ActiveRecord checks the connection often enough to reset the connection.

Macht Mongrel erst einmal “Sitz!” um auf die MySQL-Verbindung zu warten, dann bleibt er auch da, bis die Verbindung kommt. Da das MySQL-Gem ihm aber scheinbar nicht sagt, dass da keine Verbindung mehr kommt, bleibt er einfach  sitzen… also lassen wir ihn jetzt mal per ActiveRecord wieder aufstehen. Erneutes Aportieren der Verbindung kann übrigens über das mysql_retry_lost_connection Gem befohlen werden… sorry, aber diese wahnwitzige Analogie musste ich jetzt einfach mal ausnutzen, hoffe es hilft ;)

iOS app for GitHub

iOctocat

ist GitHub für die Hosentasche - deine Projekte und das was dort passiert immer dabei mit deinem iPhone und iPod Touch.
Die App ist