Сколько потоков я должен использовать в своей программе Java?

Порт 9300 является двоичным протоколом (не http) и используется для связи узла. Только порт 9200 предоставил Rest Api

Из документации :

Оба клиента Java общаются с кластером через порт 9300, используя собственный транспортный протокол Elasticsearch. Узлы в кластере также связываются друг с другом через порт 9300. Если этот порт не открыт, ваши узлы не смогут сформировать кластер.

BLOCKQUOTE>

15
задан Andrew 24 September 2008 в 23:24
поделиться

7 ответов

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

конкуренция Кэша является очень важным аспектом использования много центральных процессоров для обработки высоко параллелизированного алгоритма: Удостоверьтесь, что Вы принимаете свое использование памяти во внимание. Если можно создать объекты данных, таким образом, каждый поток имеет свою собственную память, что это продолжает работать, можно значительно уменьшить конкуренцию кэша между центральными процессорами. Например, может быть легче иметь большой массив ints и иметь различные потоки, работающие над различными частями того массива - но в Java, граничные проверки на том массиве будут попыткой получить доступ к тому же адресу в памяти, которая может заставить данный ЦП должным быть перезагружать данные из L2 или кэша L3.

Разделение данных в свои собственные структуры данных, и настраивает те структуры данных, таким образом, они - локальный поток (могло бы даже быть более оптимальным для использования ThreadLocal - который на самом деле использует конструкции в ОС, которые обеспечивают гарантии, что ЦП может использовать для оптимизации кэша.

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

16
ответ дан 1 December 2019 в 02:02
поделиться

Число, в котором нужно Ваше приложение; не больше, и не меньше.

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

, Если Ваш алгоритм не может быть параллелизирован, то никакое количество дополнительных потоков не собирается помочь.

3
ответ дан 1 December 2019 в 02:02
поделиться

количество процессоров является хорошим началом; но если те потоки делают много i/o, то могли бы быть лучше с больше... или меньше.

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

иногда могло быть лучше, если Вы выделяете поток или два к каждому i/o ресурсу, и другие борются за ЦП. analisys обычно легче на этих проектах.

1
ответ дан 1 December 2019 в 02:02
поделиться

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

Как со многими вопросами со словом "должен" в них, ответ, "Это зависит". Если Вы думаете, что можно получить лучшую производительность, скорректировать количество потоков или вниз и сравнить производительности приложения. Также примите во внимание любые другие факторы, которые могли бы влиять на решение (если Ваше приложение съест 100% доступной лошадиной силы компьютера, то производительность других приложений будет уменьшена).

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

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

0
ответ дан 1 December 2019 в 02:02
поделиться

Да, это - совершенно разумный подход. Один поток на процессор/ядро максимизирует вычислительную мощность и минимизирует контекстное переключение. Я, вероятно, оставил бы это как есть, если я не нашел проблему через сравнительное тестирование/профилирование.

Одна вещь отметить состоит в том, что JVM не гарантирует availableProcessors(), будет постоянным, так технически, необходимо проверить его сразу прежде, чем породить потоки. Я сомневаюсь, что это значение, вероятно, изменится во времени выполнения на типичных компьютерах, все же.

P.S., Поскольку другие указали, если Ваш процесс не будет зависящим от ЦП, то этот подход вряд ли будет оптимален. Так как Вы говорите, что эти потоки используются для генерации изображений, тем не менее, я предполагаю, что Вы зависящие от ЦП.

1
ответ дан 1 December 2019 в 02:02
поделиться

С одной стороны, требуется думать Потоки ==, ЦП/ядра имеет смысл. Почему имеет поток, если нет ничего для выполнения его?

деталь сводит к, "что является выполнением потоков". Поток это - неактивное ожидание сетевого пакета или дискового блока, является потраченным впустую процессорным временем.

, Если Ваши потоки являются тяжелым ЦП, то 1:1 корреляция имеет некоторый смысл. Если у Вас есть единственное "чтение DB" поток, который подает другие потоки и единственный "Дамп данные" поток и вытягивает данные из потоков ЦП, и создайте вывод, те два могли, скорее всего, легко совместно использовать ЦП, в то время как ЦП тяжелые потоки держит взбалтывание отдельно.

реальный ответ, как со всеми видами вещей, должен измерить его. Так как число настраивается (по-видимому), настройте его! Выполните его с 1:1 потоки к центральным процессорам, 2:1, 1.5:1, безотносительно, и время результаты. Быстро каждый побеждает.

10
ответ дан 1 December 2019 в 02:02
поделиться

После наблюдения Вашего редактирования довольно возможно, что один поток на ЦП так хорош, как это добирается. Ваше приложение кажется довольно parallelizable. Если у Вас есть дополнительное оборудование, можно использовать GridGain для сетки - включают приложение и имеют его, работает на нескольких машинах. Это, вероятно, о единственной вещи вне покупки быстрее / больше ядер, которые ускорят ее.

0
ответ дан 1 December 2019 в 02:02
поделиться
Другие вопросы по тегам:

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