Самое простое объяснение +/- 20% состоит в том, что вы видите проблему с балансировкой нагрузки;Некоторые рабочие получают на 20% больше работы, чем некоторые из их сверстников.Это может представлять проблему реализации, или это может быть просто дискретность;если у вас есть 200 рабочих процессов, но 1040 примерно одинаковых заданий, то у 1/5 рабочих процессов будет 20% дополнительной работы, и с этим ничего не поделаешь, если вы не можете поделить работуболее точно.
Мастер / рабочий масштабируется (и обрабатывает эти проблемы балансировки нагрузки примерно так же легко, как и все остальное) до момента, когда конкуренция за общие ресурсы в главном процессе начинает становиться нетривиальной.Вы можете немного увеличить масштабирование, уменьшив критические секции (защищенные мьютексами) до абсолютного минимума;путем объединения рабочих единиц таким образом, чтобы было меньше запросов (но обратите внимание, что это работает в противоположном направлении улучшения балансировки нагрузки);или имея несколько мастеров (потенциально иерархию мастеров).Если это не сработает, вы должны начать рассматривать больше одноранговых алгоритмов планирования работы, где больше нет единого узкого места.Одноранговый аналог мастера / работника называется кража работы , что является одной из тех вещей, которые (IMHO), похоже, не должны работать, пока кто-то не покажет вам, что работает;это было недавно популяризировано Cilk .Идея состоит в том, что каждый получает список задач, и если коллегам требуется больше работы, они крадут его друг у друга случайным образом и продолжают пыхтеть, пока не выполнят.Это сложнее реализовать, чем мастер / рабочий, но позволяет избежать узкого места с одним мастером.