2010-10-25 5 views
2

J'ai un modèle maître/travailleur implémenté avec des processus python distincts. Le processus maître contient des listes de tâches/résultats protégées par des mutex. Beaucoup de travailleurs fonctionnent sur de nombreuses machines (environ 200 processus de travail). J'ai remarqué que sur chaque machine, les ouvriers ont tendance à faire 0-20% de travail en plus ou en moins que les autres processus de travail et que les machines font 0-20% plus ou moins de travail que les autres. Les travailleurs et les machines les plus rapides/les plus lents sont différents chaque jour.Est-ce que l'échelle maître/travailleur est?

S'agit-il d'un problème conceptuel du modèle maître/travailleur, fait-il allusion à une implémentation problématique ou est-ce que tout va bien?

+0

À quelle fréquence les collisions surviennent-elles lorsque les travailleurs cherchent leur prochaine unité de travail? Les unités de travail sont-elles homogènes en ce qui concerne les tailles de données d'entrée et de sortie et le temps de traitement prévu? Y a-t-il des E/S lourdes ou est-ce que tout est lié au processeur? –

Répondre

3

L'explication la plus simple pour la chose +/- 20% est que vous voyez un problème d'équilibrage de charge; certains travailleurs obtiennent juste 20% de plus de travail que certains de leurs pairs. Cela pourrait représenter un problème de mise en œuvre, ou tout simplement être discret; Si vous avez 200 processus de travail mais 1040 tâches à peu près égales, alors 1/5 des processus de travail auront 20% de travail supplémentaire à faire, et il n'y a rien à faire à moins que vous ne puissiez subdiviser le travail plus finement.

Le maître/travailleur met à l'échelle (et traite ces problèmes d'équilibrage de charge aussi bien et facilement que toute autre chose) jusqu'au point où la contention pour les ressources partagées dans le processus maître commence à devenir non triviale. Vous pouvez pousser un peu plus loin en réduisant les sections critiques (celles protégées par des mutex) à un minimum absolu; en agrégeant les unités de travail de sorte qu'il y ait moins de demandes (mais notez que cela fonctionne dans le sens opposé d'améliorer l'équilibrage de charge); ou en ayant plusieurs maîtres (potentiellement une hiérarchie de maîtres). Si cela ne fonctionne pas, vous devez commencer à envisager plus d'algorithmes de planification de travail peer-to-peer, où il n'y a plus un seul goulot d'étranglement. Un analogue peer-to-peer de maître/travailleur est appelé work stealing, qui est l'une de ces choses qui (IMHO) ne semble pas que cela devrait fonctionner jusqu'à ce que quelqu'un vous le montre; il a été récemment popularisé par Cilk. L'idée est que chacun reçoive une liste de tâches, et si les pairs ont besoin de plus de travail, ils les volent les uns aux autres de manière aléatoire et continuent de s'enfuir jusqu'à ce qu'ils aient terminé. Il est plus compliqué à implémenter que master/worker, mais évite le goulot d'étranglement single-master.