Проблема
У меня есть кусок java-кода (JDK 1.6.0._22, если это уместно), который реализует свободную функцию без состояния без побочных эффектов без каких-либо мьютексов. Однако он использует много памяти (я не знаю, насколько это важно).
В прошлом я посетил Sun Laboratories и собрал стандартную кривую "производительность против числа потоков". Поскольку эта функция не имеет мьютексов, у нее есть хороший граф, хотя сбор мусора взлетел по мере увеличения количества потоков. После некоторой настройки сбора мусора я смог сделать эту кривую почти плоской.
Теперь я делаю тот же эксперимент на оборудовании Intel. Аппаратное обеспечение имеет 4 процессора каждый с 8 ядрами и гиперпоточность. Это дает 64 доступныхпроцессора(). К сожалению, кривая "производительность против числа потоков" хорошо масштабируется для 1, 2, 3 нитей и колпачков на 3 потоках. После 3 потоков я могу поставить столько потоков, сколько хочу, и производительность не улучшится
Попытки исправить проблему
Моя первая мысль заключалась в том, что я был глупым и где-то вводил какой-то синхронизированный код. Обычно для решения этой проблемы я запускаю JConsole или JVisualVM и смотрю на стек стека. Если у меня есть 64 потока, работающих со скоростью 3, я ожидаю, что 61 из них будет сидеть, ожидая входа в мьютекс. Я этого не нашел. Вместо этого я нашел все потоки: очень медленно.
Вторая мысль заключалась в том, что, возможно, временная структура вводит проблемы. Я заменил свою функцию фиктивной функцией, которая насчитывает миллиард, используя AtomicLong. Это прекрасно масштабируется с количеством потоков: я смог сосчитать до миллиарда 10 000 раз в 64 раза быстрее с 64 потоками, чем с 1 потоком.
Я подумал (отчаяние), возможно, сбор мусора занимает действительно очень много времени, поэтому я изменил параметры сбора мусора. Хотя это улучшило мою вариацию латентности, это не повлияло на пропускную способность: у меня все еще есть 64 потока, работающих на скорости, которую я ожидаю, чтобы 3 выполнялись.
Я загрузил инструмент Intel VTunes, но мое умение с ним слабое: это сложный инструмент, и я пока этого не понимаю. У меня есть инструкция по заказу: интересный рождественский подарок для меня, но это слишком поздно, чтобы помочь моей текущей проблеме.
Вопрос
- Какие инструменты (умственные или программные) можно использовать для улучшения понимания того, что происходит?
- Какие механизмы, кроме мьютексов или сбора мусора, могут замедлить мой код?