Распределение запланированных задач с эффективным использованием процессора - PullRequest
0 голосов
/ 05 сентября 2011

Предположим, что 50К Runnables должны выполняться бесконечно каждые 30 минут. Каждый Runnable займет 1-5 секунд и выполнит одну операцию Socket. TheadPool имеет размер 200

Теперь Как определить начальную задержку вызова для каждых 50K Runnables с помощью scheduleWithFixedDelay (или) как спланировать эти Runnables эффективным образом.

Существует ли какой-либо стандартный алгоритм для распределения такого рода планирования.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 05 сентября 2011

Если у вас есть 50K Runnables, которые занимают до 5 секунд каждый, что составляет 250 000 секунд работы.Если вы хотите запускать это каждые 30 * 60 секунд, вам нужно запустить его как минимум из 139 потоков.Если вы используете 200 потоков, их выполнение может занять 20 минут.Вам может понадобиться больше потоков, если вы хотите, чтобы эти задачи выполнялись, скажем, за 5 минут.

Простое чтение или запись не должны занимать 1-5 секунд.Под одной операцией Socket вы подразумеваете чтение или запись, или вы имеете в виду открыть сокет, отправить некоторые данные и получить ответ?Последнее может включать много накладных расходов.

Несмотря на то, что 50K - это много, у меня было бы столько запланированных заданий, если только вам не нужно запускать задания как можно ближе к 30-минутному интервалу.Если у вас есть независимые задачи 50 КБ, они будут запускаться примерно каждые 30 минут, но выполняются в разное время.В какой-то степени это неизбежно, так как у вас нет ядер 50К, но насколько вы обеспокоены тем, чтобы запускать их как можно ближе?

0 голосов
/ 05 сентября 2011

Распределение расписаний на основе вашего ограничения по времени - это, вероятно, лучший способ.

Если у вас есть 30 минут, это 1800 секунд, чтобы запланировать и выполнить все 50000 заданий.

Итак, учетна время завершения последнего раунда заданий у вас есть 50000 / (1800-5).

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

Очевидно, что реализациятакой график будет простым циклом for от 0 до 1794 в качестве времени задержки для планирования заданного количества заданий, в данном случае 28. Затем следует задержка для округления до 30-минутной отметки перед повторным запуском.

...