2010-08-01 4 views
2

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

Простой расчет ставит это на тысячи потоков, даже до 10000 потоков. Если мы отложим штраф за процессор для переключения потоков и т. Д., Сколько потоков может работать на Java 5 на 64-разрядной ручке CentOS? Это просто вопрос ОЗУ или есть что-то еще, что мы должны рассмотреть?

Спасибо!

+0

Вы полностью ошибаетесь, если считаете, что * «огромное количество сетевых операций ввода-вывода» * [sic] подразумевает огромное количество потоков, требуемых одновременно, как вы прокомментировали YoK. Там много систем, производящих и потребляющих гигантское количество сетевых операций ввода-вывода без использования тысяч потоков. – NoozNooz42

+0

@ NoozNooz42 10k соединений - это огромное количество и, конечно, нетривиальные потоки или нет, даже если это было сделано раньше. – nos

+0

@ NoozNooz42 За исключением NIO (который я прокомментировал ниже, для нас не представляется возможным), и учитывая, что IO сети (и обработка на удаленных серверах) занимает много времени, как бы вы достигли лучшей производительности? – Yon

ответ

0

Я думаю, что до 65k потоков в порядке с Явы, единственное, что вам нужно рассмотреть в стек пространство - Linux по умолчанию выделяет 48k на поток/процесс как стека, который является расточительным для Java (который не имеет объектов, распределенных по стеклу, поэтому использует гораздо меньше пространства стека). Это будет легко использовать 500 мегабайт для потоков 10k.

1

В такой ситуации всегда рекомендуется использовать объединение потоков.

Пулы потоков адресуют две различные проблемы: они обычно обеспечивают улучшенную производительность при выполнении большого количества асинхронных задач из-за сокращения служебных издержек на одну задачу и обеспечивают средства для ограничения и управления ресурсами, включая потоки, потребляемые, когда выполнение набора задач. Каждый ThreadPoolExecutor также поддерживает некоторую базовую статистику, такую ​​как количество завершенных задач.

ThreadPoolExecutor - класс, который вы должны использовать.

http://www.javamex.com/tutorials/threads/ThreadPoolExecutor.shtml

+0

На самом деле используется пул потоков. Это количество потоков, требуемых одновременно из-за количества выполняемых сетевых операций ввода-вывода. – Yon

+0

@Yon Итак, вы имеете в виду, что вы открываете несколько соединений сокетов на одном устройстве? В этом случае вам также понадобится объединение пулов для одного устройства, чтобы ограничить количество сокетов на устройство. Обычно количество ограничений на соты зависит от количества доступных inodes в файловой системе. – YoK

+1

Если у вас есть 20-30 подключений к устройству, попробуйте использовать NIO для взаимодействия с устройством - это приведет вас к 1, возможно, 2 потокам на устройство, и довести поток до уровня управления. – nos

0

Если это действительно абсолютное требование, вы можете взглянуть на язык, который специально создан для решения этого уровня параллельных потоков, таких как erlang.

0

Как и другие, вы должны использовать NIO. У нас было приложение, которое использовало много (но намного меньше, чем вы планируете) потоков (например, 1000), и оно было уже очень неэффективным. Если вам нужно использовать THAT много потоков, то определенно пора рассмотреть использование NIO.

Для сети, если ваши приложения используют HTTP, один очень простой инструмент будет Async-HTTP-client автором 2 в этом поле.

Если вы используете другой протокол, рекомендуется использовать базовую реализацию Async-HTTP-клиента (netty).

+0

Мы не можем использовать NIO - это потому, что связь обрабатывается сторонней библиотекой, которая не использует NIO. К сожалению, на данный момент у нас нет лучшего варианта, чем эта сторонняя библиотека. – Yon

Смежные вопросы