Номер потока и производительность приложения Java - PullRequest
6 голосов
/ 18 июля 2011

Привет: у меня есть многопоточное Java-приложение. Текущий размер потока уже равен 100. В настоящее время мы используем 4-ядерный процессор. Но, как видно в ближайшем будущем, ядро ​​процессора будет удвоено, или даже до 32 ядер. Чтобы полностью использовать ядра, нам нужно увеличить размер пула потоков. Но, как вы, возможно, знаете (возможно, я ошибаюсь), Java хорош, когда имеется 100 сотен потоков, но может быть проблема с производительностью, когда поток равен 200, 500, 1000 потоков. Тогда мы будем использовать другой язык программирования, например, Scala. Мое беспокойство разумно?

Ответы [ 4 ]

10 голосов
/ 18 июля 2011

В современных JVM процесс Java может создавать столько потоков, сколько позволяет операционная система. Сможет ли ваше приложение эффективно использовать эти потоки, зависит от дизайна вашего приложения.

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

1 голос
/ 18 июля 2011

Я однажды провел эксперименты с потоками, чтобы выяснить, есть ли существенная разница между Linux и Windows, и наткнулся на своего рода барьер примерно в 2000 потоков на обеих платформах. Тесту несколько лет, и я не повторял его, но позже я нашел то же число, упомянутое другими, но я не сохранил ссылку.

Без тестирования, я думаю, вы правы насчет скалы. Используемые там приемы - актеры - работают с более мелкими объектами, аааик, но я не могу дать вам цифры.

1 голос
/ 18 июля 2011

Если у вас 4 ядра, оптимальный размер пула потоков может быть 4, так как это минимальное количество потоков, необходимое для работы всех процессоров. Тем не менее, вы можете иметь любое количество незанятых / ожидающих потоков примерно до 10K. Это переломный момент в библиотеке потоков JVM, поэтому переход на Scala не будет иметь никакого значения. Примечание: у вас может быть намного больше тем, я бы не рекомендовал это.

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

Я выполнил тест, создав на моей машине множество потоков с обновлением 26 для Java 6, 32-битным и 64-битным в Ubuntu 11. Первые 1000 потоков заняли 72 мс, для перехода от 31 к 32 КБ - 3861 мс, чтобы создать. Приблизительно в 32K потоков я получил эту ошибку

Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:640)
0 голосов
/ 19 июля 2011

@ user84592: не уверен насчет моего ответа, просто мозговой штурм.Как насчет того, чтобы установить программное обеспечение виртуальной машины на эту машину, распределив на них ядра ЦП, это сделает много машин вместо одной физической машины, а затем вы можете разделить рабочую нагрузку приложения Java на каждую из них ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...