2017-08-03 3 views
0

J'ai 2 administrateurs gearman avec l'adresse IP diffrent, et j'ai 40 ouvriers dans deux clients, chaque client a 20 ouvriers là-dessus.
Voici le problème, je vérifie l'état de 2 admins pour chaque 10 minutes, et ils ont le même nombre de tâches au début, mais leur nombre chute à une vitesse différente, admin2 est 3 fois plus rapide que admin1.
Cette situation aboutit finalement à un problème, si 2 types de gros travaux, par exemple, job1 a 400000 jobs, job2 a 400000 jobs, et job2 est déclenché une heure plus tard que job1, alors chacun d'eux terminera la moitié d'entre eux d'abord, parce qu'une autre moitié tenait serré dans la main de admin1, seulement si admin2 fait dispatching peut admin1 envoyer ses travaux, et ceci est un désastre, parce que je veux job1 finir, mais pas finir la moitié d'entre eux et continuer à attendre la moitié des autres travaux à terminer.Gearman - déséquilibrée dans la répartition

ceci est un exemple:
enter image description here

+1

Ainsi, ils diffèrent en vitesse. Mais quel est le * problème *? –

Répondre

0

donc j'ai trouvé la raison. Dans le serveur gearman, il enverrait seulement noop msg quand un worker est marqué dormant et non is_noop_sent, et après l'envoi du msg noop, le is_noop_sent a été mis à false, et ne définira vrai que lorsque la commande get grab job. Mais dans python gearman, il utilise un verrou pour contrôler la boucle recv, s'il ne peut pas obtenir le verrou, si passera ou enverra la commande pre_sleep - et conduira à un résultat que le serveur ne supprimera plus jamais le worker.