2010-12-03 4 views
8

Nous avons ~ 300 processus de celeryd fonctionnant sous Ubuntu 10.4 64 bits, dans tous les processus ralenti prend ~ 19MB RES, ~ 174MB Virt, donc - il est environ 6 Go de RAM au ralenti pour tous les processus. À l'état actif - processus prend jusqu'à 100mb de RES et ~ 300mb VIRTCéleri - réduire la consommation de mémoire

Chaque processus utilise minidom (fichiers xml sont < 500kb, structure simple) et urllib.

Quetions est - comment pouvons-nous réduire RAM consuption - au moins pour les travailleurs inactifs, probablement quelques options de céleri ou python peut aider? Comment déterminer quelle partie prend le plus de mémoire?

UPD: thats agents de recherche de vol, un travailleur pour une agence/date. Nous avons 10 agences, une recherche d'utilisateur == 9 dates, ainsi nous avons 10 * 9 agents par recherche d'un utilisateur.

Est-il possible de démarrer des processus celeryd à la demande pour éviter les travailleurs inactifs (quelque chose comme MaxSpareServers sur Apache)?

UPD2: cycle de vie de l'agent est - envoyer requête HTTP, attendez la réponse ~ 10-20 sec, analyser xml (prend moins de 0,02 s), enregistrer le résultat de MySQL

+0

avez-vous essayé serverfault.com ou #celery sur irc.freenode.net? – Unreason

+0

serverfault est vide, malheureusement – Andrew

+1

Pourquoi tant de serveurs 'celeryd' inactifs? –

Répondre

5

Lire ceci:

http://docs.celeryproject.org/en/latest/userguide/workers.html#concurrency

Il semble que vous avez un travailleur par celeryd. Cela semble faux. Vous devriez avoir des douzaines de travailleurs par céleri. Continuez à augmenter le nombre de travailleurs (et à diminuer le nombre de celeryd) jusqu'à ce que votre système soit très occupé et très lent.

+2

chaque travailleur engendre une nouvelle instance de celeryd. –

+0

@Paulo Scardine: "chaque ouvrier engendre une nouvelle instance de celeryd". Ne semble pas juste, quand la documentation suggère "par exemple 3 celeryd avec 10 processus de travail chacun". –

+1

Je cours 'ps' sur mon serveur, au moins avec djcelery je vois une instance principale de celeryd + une pour chaque ouvrier. –

2

S. Lott a raison. L'instance principale consomme des messages et les délègue aux processus de pool de travail. Il n'y a probablement aucun intérêt à exécuter 300 processus de pool sur une seule machine! Essayez 4 ou 5 multiplié par le nombre de cœurs du processeur. Vous pouvez gagner quelque chose en exécutant plus que celeryd avec quelques processus chacun, certaines personnes ont, mais vous devrez expérimenter pour votre application.

Voir http://celeryq.org/docs/userguide/workers.html#concurrency

Pour la prochaine version 2.2, nous travaillons sur le soutien de la piscine eventlet, cela peut être une bonne alternative pour les tâches liées IO, qui vous permettra d'exécuter 1000 threads avec mémoire minimale frais généraux, mais il est encore expérimental et les bugs sont en cours de correction pour la version finale.

Voir http://groups.google.com/group/celery-users/browse_thread/thread/94fbeccd790e6c04

La prochaine version 2.2 ont également un soutien pour autoscale, ce qui ajoute/supprime processus sur demande. Voir le Changelog: http://ask.github.com/celery/changelog.html#version-2-2-0 (ce journal n'est pas encore écrit completly)

+0

Nous exécutons 300 travailleurs car tous font de longues requêtes http, ils sont donc occupés jusqu'à ce que la réponse http soit reçue. Y a-t-il une manière plus correcte de résoudre ce problème? – Andrew

+0

Comme je l'ai dit, le support d'eventlet en céleri est beaucoup mieux à ce genre d'application. Les chances sont que vous n'obtiendrez pas plus de demandes avec 300 processus qu'avec 15 processus. (si vous avez 8 cœurs), il est plus probable que vous ayez moins de performances car il s'agira d'un changement de contexte. – asksol

1

Le nombre naturel de travailleurs est proche du nombre de cœurs que vous avez. Les travailleurs sont là pour que les tâches gourmandes en cpu puissent utiliser efficacement tout un noyau. Le courtier est là pour que les demandes qui n'ont pas de travailleur en main pour les traiter soient gardées en file d'attente. Le nombre de files d'attente peut être élevé, mais cela ne signifie pas que vous avez besoin d'un nombre élevé de courtiers non plus. Un seul courtier devrait suffire, ou vous pourriez envoyer des files d'attente à un courtier par machine s'il s'avère plus tard que l'interaction rapide entre le travailleur et la file d'attente est bénéfique.

Votre problème ne semble pas lié à cela.Je devine que vos agences ne fournissent pas une file d'attente de messages, et vous devez garder beaucoup de demandes. Si c'est le cas, vous avez besoin de quelques processus événementiels (pas trop nombreux), par exemple twisted ou node.js.

Questions connexes