Почему моя многопоточная Java-программа не использует все мои ядра на моей машине? - PullRequest
3 голосов
/ 08 апреля 2010

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

I 'я запускаю это на 64-битном сервере Windows 2003 с 2-мя четырехъядерными процессорами, и, глядя на диспетчер задач Windows, они не достигают максимума (и при этом они не выглядят так, как будто они особенно облагаются налогом), когда я запускаю с 10 потоками,Это нормальное поведение?

Похоже, что все 7 потоков выполняют одинаковый объем работы за одинаковое количество времени, поэтому вы бы порекомендовали вместо этого работать с 7 потоками?

Должен ли я его запуститьс большим количеством потоков? ... Хотя я предполагаю, что это может быть вредно, так как JVM будет больше переключать контекст между потоками.

В качестве альтернативы, следует ли мне запускать его с меньшим количеством потоков?

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

Обратите внимание, что сервер также работает под управлением SQL Server 2005 (это может или не может иметь значение), но ничегомногое происходит в этой базе данных, когда я запускаю свою программу.

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

Ответы [ 2 ]

5 голосов
/ 08 апреля 2010

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

Если это предположение верно, единственное, что вы можете сделать (кроме получения сервера с большей пропускной способностью памяти), это попытаться увеличить доступ к вашей памяти, чтобы лучше использовать кэши; но в зависимости от деталей приложения это может быть невозможно. Использование большего количества потоков может фактически привести к снижению производительности из-за того, что ядра разделяют кеш-память.

2 голосов
/ 08 апреля 2010

Не видя реального кода, трудно дать правильный совет.Но убедитесь, что потоки не блокируются на общих ресурсах, так как это, естественно, помешает им всем работать максимально эффективно.Кроме того, когда вы говорите, что они не выполняют никаких операций ввода-вывода, они тоже не читают ввод или не пишут вывод?это также может быть узким местом.

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

...