2010-06-28 5 views
5

J'utilise collectiveidea's delayed_job avec mon application Ruby on Rails (v2.3.8), et exécute environ 40 tâches en arrière-plan sur une machine Slicehost RAM de 8 Go (Ubuntu 10.04 LTS, Apache 2). Disons que je ssh dans mon serveur sans les travailleurs en cours d'exécution. Quand je fais free -m, je vois que j'utilise généralement environ 1 Go de RAM sur 8. Ensuite, après le démarrage des travailleurs et d'attendre environ une minute pour qu'ils soient utilisés par le code, je suis à environ 4 Go. Si je reviens dans une heure ou deux, je serai à 8 Go et dans la mémoire d'échange, et mon site Web générera 502 erreurs. Jusqu'à présent, je venais de tuer les travailleurs et de les redémarrer, mais je préfère régler la racine du problème. Des pensées? Est-ce une fuite de mémoire? Ou, comme un ami l'a suggéré, ai-je besoin de trouver un moyen d'exécuter la collecte des ordures?Travaux retardés fuite de mémoire?

+0

Cela ressemble à une fuite de mémoire, mais il peut être dans votre code qui est exécuté par deleayed_job, il ne doit pas être dans delayed_job. du code à réviser pourrait aider. – jigfox

+0

gardez également à l'esprit que 1.9 et 1.8 ne rendront jamais la mémoire au système d'exploitation. – tliff

Répondre

-3

À peu près chaque fois que quelqu'un pose une question à ce sujet, le problème est dans leur code. Essayez d'utiliser l'un des outils de profilage disponibles pour trouver où votre travail fuit. (https://github.com/wycats/ruby-prof ou similaire.)

Déclencher GC à la fin de chaque travail réduira votre utilisation maximale de la mémoire au prix de réduire votre débit. Cela n'empêchera pas Ruby de gonfler à la taille maximale requise par un travail individuel, cependant, puisque Ruby ne peut pas libérer de la mémoire au système d'exploitation. Je ne recommande pas cette approche.