Вопрос по web-services, threadpool, concurrency, java – Разумное количество потоков для пула потоков, выполняющих запросы веб-службы

16

При создании объекта FixedThreadPool Executor в Java вам нужно передать аргумент, описывающий количество потоков, которые Executor может выполнить одновременно. Я создаю класс обслуживания, в обязанности которого входит обработка больших наборов телефонных номеров. Для каждого телефонного номера мне нужно выполнить веб-службу (что является моим узким местом), а затем сохранить ответ в хэш-карте.

Чтобы сделать это узкое место менее вредным для производительности моего сервиса, я решил создать класс Worker, который выбирает необработанные элементы и обрабатывает их. Класс Worker реализует интерфейс Runnable, и я запускаю Workers с помощью Executor.

Количество рабочих, которые могут быть запущены одновременно, зависит от размера Executor FixedThreadPool. Какой безопасный размер для ThreadPool? Что может произойти, когда я создаю FixedTheradPool с большим числом в качестве аргумента?

Здравствуйте, Майкл, некоторые моменты: что вы считаете "большой коллекцией телефонных номеров"? Каковы характеристики системы, с которой будет работать ваше приложение? Когда работает с пакетными потоками, объем используемой памяти. к куче и скорости процессора также учитываются при расчете. С наилучшими пожеланиями, Кам. Diego Magalhães
В дополнение к этому, пожалуйста, прочитайте приведенную здесь аналогию:java.sun.com/docs/books/tutorial/essential/concurrency/… чтобы увидеть, подходит ли ваше приложение дыре в FixedThread Pools. Diego Magalhães

Ваш Ответ

9   ответов
6

то количество потоков в вашем пуле должно сильно зависеть от того, сколько одновременных запросов может обработать ваша веб-служба. Больше потоков, чем это не будет делать ничего, кроме как разрушить веб-сервис.

Поведение http похоже на его FixedThreadPool, не нужно беспокоиться о вызовах и получать ответы. Основная проблема - это размер массовой обработки данных, использование памяти. до кучи и скорости машины, берущей работу.
2

что оптимальное количество потоков - это количество ядер * 25. Похоже, что .NET использует это по умолчанию для ThreadPool. Однако, если у вас большое количество вызовов веб-служб, вам лучше использовать один поток и проверить список вызовов веб-служб для получения ответа. Когда ответ получен, просто обработайте запись и удалите ее из списка.

Он соберет больше ответственности, в которой нуждается его программа, а ему нужна большая пропускная способность для его процесса.
informit.com/guides/content.aspx?g=dotnet&seqNum=588 для ядер * 25 шт.
0

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

Этот размер стека настраивается через-Xss (похожий на-Xmx так далее.). Я считаю, что по умолчанию 512Kb на поток. В настоящее время я не могу найти какого-либо авторитетного лица, подтверждающего это.

Да, в Linux каждый поток получает свой собственный стек с размером по умолчанию 512 КБ.
Я не смог найти актуальную справку, подробно описывающую это для нескольких платформ. Если вы можете найти один, я изменю ответ соответствующим образом.
8

Runtime.getRuntime().availableProcessors()

который дает некоторое представление о том, сколько потоков будет иметь смысл для системы.

Вызов веб-службы, скорее всего, будет в основном ожидать ввода-вывода, поэтому не имеет прямого отношения к числу процессоров.
2

рассмотрите возможность создания пакетной функции для проверки нескольких телефонных номеров за один звонок.

В более новых .NET есть ThreadPool, который может расти и уменьшаться в зависимости от его собственного профиля производительности. К сожалению, версия Java либо является фиксированной, либо увеличивается до предела в зависимости от поступающей работы.

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

Для определения размера пула операций ввода / вывода могут учитываться некоторые свойства сети и данных: пропускная способность сети, размеры сообщений, время обработки и стиль веб-службы, количество локальных ядер.

2

вам следует учитывать, какую нагрузку вы оказываете на эту службу / сколько одновременных подключений эта служба будет терпеть или будет позволять службам & apos; владельцы. Большинство общедоступных сервисов ожидают только одно такое соединение от любого отдельного пользователя за раз. Если возможно, обратитесь в службы & apos; владельцы для их политики использования. Количество таких соединений будет определять количество потоков, которые вы можете использовать.

1

что веб-сервис является бесконечно масштабируемым, и что никто не будет заботиться о том, что вы рассылаете его по спаму. Также предположим, что ответы веб-службы находятся в диапазоне 1 секунда, тогда как время локальной обработки составляет 5 миллисекунд.

Пропускная способность максимальна, когда у вас столько же занятых потоков, сколько у процессорных ядер.

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

Обратите внимание, что стековая память, зарезервированная для каждого созданного потока, фактически просто зарезервированаaddress space, не фактическая выделенная или зафиксированная память. По мере того, как стек пытается расти, генерируются исключения, в результате чего память стека фиксируется по требованию. Следствием этого является то, что это действительно актуально только для 32-битных менеджеров памяти. Для 64-битной памяти у вас есть огромное адресное пространство, даже если вы зарезервировали только небольшую часть этого пространства физической памятью. По крайней мере, я так понимаю, что Windows работает, я не уверен в мире Unix.

0

лучше ли вам использовать NIO, а не потоки, поскольку вашим ограничивающим фактором будет сервер веб-службы + узкое место в сети, а не клиентский ЦП.

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

Да, это хорошее направление, однако можете ли вы предложить достойную реализацию клиента NIO Web Services?
0

скажем, для параллельных манипуляций с массивами, то практическое правило имеет количество потоков для числа процессоров.

Похожие вопросы