2011-12-18 1 views
0

Я очень часто сталкиваюсь с ситуациями, когда у меня есть большое количество небольших операций, которые я хочу выполнять независимо. В этих случаях количество операций настолько велико по сравнению с фактическим временем, которое требуется каждой операции, поэтому простое создание задачи для каждой операции неуместно из-за накладных расходов, хотя накладные расходы GCD обычно низки.Как определить подходящее количество задач с помощью GCD или аналогичного?

Итак, что вы хотите сделать, это разделить количество операций на красивые куски, где каждая задача работает на куске. Но как я могу определить соответствующее количество задач/кусков?

ответ

0

Тестирование и профилирование. Что имеет смысл, и то, что хорошо работает, относится к конкретным приложениям.

В основном вам нужно принять решение о двух вещах:

  1. Число рабочих процессов/потоков для создания
  2. Размер кусков они будут работать на

Play с два номера и рассчитывать их пропускную способность (количество выполненных за каждую секунду числа рабочих). Где-то вы найдете хорошее равновесие между скоростью, количеством рабочих и количеством задач в куске.

Вы можете сделать поиск правильного баланса еще проще, подав своим работникам кучу тестовых данных, по существу, эталонный тест и автоматически измеряя их пропускную способность при настройке этих двух переменных. Запишите пропускную способность для каждой комбинации размера рабочего места/размера задачи и выведите ее в конце. Самая высокая пропускная способность - ваша лучшая комбинация.

Наконец, если, как долго конкретная задача занимает действительно зависит от самой задачи (например, некоторые задачи требуют X времени, и в то время как некоторые берут X*3 время, то вы можете можете занять несколько подходов. В зависимости от характера ваша входящая работа, вы можете попробовать одно из следующих действий:

  • Кормите бенчмарк исторических данных - куча реальных данных, подлежащую обработке, что представляет реальные такую ​​работу, которая будет приходить в ваши рабочих сетки, и измерьте пропускную способность, используя данные примера.
  • Генерировать задачи случайного размера, которые пересекают спектр w как вы думаете, вы увидите, и выберите комбинацию, которая, как представляется, лучше всего работает в среднем по множеству задач.
  • Если вы можете прочитать данные в задаче, и данные предоставят вам представление о том, эта задача займет X, или X*3 (или что-то среднее) вы можете использовать эту информацию перед обработкой самих задач, чтобы динамически корректировать размер рабочего/задачи для достижения максимальной пропускной способности в зависимости от текущей рабочей нагрузки. Этот подход применяется с Amazon EC2, где клиенты будут отжимать дополнительные виртуальные машины, когда это необходимо для работы с более высокой нагрузкой, и, например, отбрасывают их обратно при снижении нагрузки.

Независимо от того, что вы выбрали, любая неизвестная проблема скорости должна почти всегда включать какой-то демонстрационный бенчмаркинг, если скорость, с которой она выполняется, имеет решающее значение для успеха вашего приложения (иногда время для обработки настолько мало, что это незначительно).

Удачи вам!