Я пишу утилиту, которая должна делать тысячи сетевых запросов. Каждый запрос получает только один небольшой пакет в ответ (аналогично ping), но может занять несколько секунд для завершения. Обработка каждого ответа завершается одной (простой) строкой кода.Как определить оптимальное количество потоков для сетевых запросов с высокой задержкой?
Сетевой эффект от этого заключается в том, что компьютер не привязан к IO, привязан к файловой системе или связан с ЦП, он связан только с задержкой ответов.
Это похоже, но не такой же, как и There is a way to determine the ideal number of threads?Java best way to determine the optimal number of threads [duplicate] ... Основное отличие заключается в том, что я связан только с задержкой.
Я использую ExecutorService
объект для запуска потоков и с Queue<Future<Integer>>
для отслеживания потоков, которые необходимо иметь результаты получены:
ExecutorService executorService = Executors.newFixedThreadPool(threadPoolSize);
Queue<Future<Integer>> futures = new LinkedList<Future<Integer>>();
for (int quad3 = 0 ; quad3 < 256 ; ++quad3) {
for (int quad4 = 0 ; quad4 < 256 ; ++quad4) {
byte[] quads = { quad1, quad2, (byte)quad3, (byte)quad4 };
futures.add(executorService.submit(new RetrieverCallable(quads)));
}
}
... Я тогда Dequeue всех элементов в очереди и поместить результаты в необходимой структуре данных:
int[] result = int[65536]
while(!futures.isEmpty()) {
try {
results[i] = futures.remove().get();
} catch (Exception e) {
addresses[i] = -1;
}
}
Первый вопрос: является ли это разумным способом отслеживать все темы? Если поток X займет некоторое время, многие другие потоки могут завершиться до выполнения X. Будет ли сам пул потоков исчерпать себя, ожидая открытых слотов, или объект ExecutorService
управляет пулом таким образом, чтобы потоки, которые были завершены, но еще не обработаны, были перемещены из доступных слотов, чтобы начать другие потоки?
Мой второй вопрос - какие рекомендации я могу использовать для поиска оптимального количества потоков для выполнения этих вызовов? Я даже не знаю руководства по порядку величины. Я знаю, что он отлично работает с 256 потоками, но, похоже, занимает примерно одинаковое общее время с 1024 потоками. Загрузка процессора колеблется около 5%, так что это не проблема. С этим большим количеством потоков, каковы все показатели, на которые я должен смотреть, сравнивать разные числа? Очевидно, общее время для обработки партии, среднее время на поток ... что еще? Здесь проблема памяти?
Это правильно. Единственная проблема заключается в том, что требуется создать структуру поверх NIO2. –
@ Андрей, я вижу. Другое дело, создание фейерверка поверх актеров. Это не требует создания рамки поверх Актеров. Могу я это сказать? – Val
Ну, это упрямая тема. И я считаю, что потоки более интуитивно понятны для этого типа работы. А актеры - зеленые, легкие нитки. –