Wie kann ich einen Ruby-Prozess debuggen, der immer weiter ansteigt?

Wie kann ich einen Ruby-Prozess debuggen, der immer weiter ansteigt?

Vor ein paar Tagen begannen alle meine 4 App-Server Probleme zu haben. Das geschah, nachdem ich Code bereitgestellt hatte, aber ich hatte nur eine lokale Datenbankdatei aktualisiert, in der einige IP-Adressen gespeichert sind, also habe ich keine tatsächlichen Codeänderungen vorgenommen. Es scheint, als würden meine Ruby-Prozesse ungefähr zu dieser Zeit außer Kontrolle geraten. Sie laufen eine Weile einwandfrei, aber dann steigen sie plötzlich schnell auf 100 % CPU-Auslastung auf einer CPU. Da ich Passenger verwende, wird irgendwann ein anderer Thread dasselbe tun und eine andere CPU maximal auslasten, und so weiter und so fort, bis der Webserver den Datenverkehr nicht mehr verarbeiten kann und nicht mehr reagiert.

Ich habe viel recherchiert (was ich nicht besonders gut kann), aber ich habe zumindest herausgefunden, dass die Prozesse beim Ausführen eines Strace zu Beginn ziemlich normal aussehen, und wenn sie dann wie oben beschrieben verrücktspielen, ist es nur eine ununterbrochene Flut von clock_gettime(CLOCK_REALTIME, {1518938625, 9566131}) = 0Anrufen. Der normale Prozess spuckt, wie ich sagte, nicht ständig Dinge aus, nur wenn zum Beispiel eine Web-Anfrage eingeht, aber dann löst ihn etwas aus und er spielt einfach verrückt, bis ich den Prozess beende, Passenger neu starte oder den Server neu starte. Dann treten innerhalb von ein oder zwei Stunden wieder Probleme auf.

Ich bin schon seit ein paar Tagen dabei, es zu überwachen und ständig neu zu starten, damit es weiterläuft, aber ich brauche dringend ein paar Ideen. Mir sind ein paar wirklich alte Posts aus dem Jahr 2013 aufgefallen, in denen von einem 100%igen CPU-Problem mit dieser clock_gettime-Sache die Rede ist, und ich habe beide Vorschläge ausprobiert, die mit den wenigen Posts in Zusammenhang stehen, die ich gesehen habe. Einer ist das Festlegen einer TZ-Variable, und der andere soll einen Schaltsekunden-Bug irgendeiner Art beheben. Ich verstehe die Gründe für die vorgeschlagenen Korrekturen nicht, aber leider haben sie nicht funktioniert.

Ich verwende den folgenden Stack: Ruby 2.2.0 Passenger Standalone: ​​Gem Version: 4.0.58 (und habe auf einem Server versucht, auf 5.2.0 zu aktualisieren, ohne dass sich das Verhalten geändert hat) MySQL CentOS 6.9

verwandte Informationen