В Java Mission Control указано несколько примеров профилирования, почему и каковы другие варианты?

Я профилирую приложение Java с помощью Java Mission Control, и на главной странице записи полета говорится, что «Эта запись содержит несколько образцов профилирования, хотя загрузка ЦП высока. Таким образом, данные профилирования, вероятно, не имеют отношения к делу».

Кажется, это правда. Я попросил его выполнять выборку каждые 10 мс в течение 3 минут, что должно быть 18000 выборок, но я вижу только 996 выборок.

Далее объясняется: «Таким образом, данные профилирования, вероятно, не имеют отношения к делу. Это может быть связано с тем, что приложение выполняет много кода JNI или что JVM тратит много времени на сборку мусора, загрузку классов, JIT-компиляцию и т. Д.»

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

Мы использовали hprof для профилирования этого продукта, и с большим успехом. Hprof очень помог в выяснении того, где мы полагаемся на выполнение основного потока, поэтому мы могли распараллелить горячие точки на несколько потоков. Но этот инструмент больше не поддерживается в Java 9, поэтому мы переходим к Java Mission Control. В нем много чего, но если он не может определить, на каких номерах строк находятся потоки виртуальной машины в случайное время выборки, это не очень полезно. Есть еще какой-нибудь инструмент? Или есть способ отладить это дальше из Java Mission Control? Также похоже, что JVisualVM больше не включен в Java 9.


person music_and_cities    schedule 24.09.2017    source источник
comment
Чтобы увидеть номера строк: щелкните значок белого перевернутого треугольника в правом верхнем углу представления «Трассировка стека», выберите «Различать кадры по», а затем «Номер строки».   -  person Klara    schedule 25.09.2017
comment
На самом деле, у вас должно быть еще больше выборок, так как выборка производится сразу из нескольких потоков.   -  person Klara    schedule 25.09.2017
comment
К вашему сведению: JVisualVM доступен для отдельной загрузки visualvm.github.io   -  person Klara    schedule 25.09.2017
comment
Поскольку я работаю в команде Java Mission Control, я очень заинтересован в улучшении автоматизированного анализа. Я был бы очень рад взглянуть на этот конкретный файл JFR, результаты которого не соответствуют вашему пониманию приложения. Если хотите, подпишитесь на меня в твиттере (@klaraward), и мы сможем обсудить дальше.   -  person Klara    schedule 25.09.2017
comment
Спасибо @klara, я напишу тебе в твиттере. Эта последняя трассировка действительно потратила дополнительное время на сборку мусора, похоже, примерно 2 секунды паузы на каждые 10 секунд времени выполнения. Но я все равно ожидал бы больше образцов! И с помощью hprof я получал образцы, показывающие, какой номер строки вызвал выделение, которое запустило сборщик мусора, так что это было полезно.   -  person music_and_cities    schedule 25.09.2017
comment
Я сократил количество потоков до 8 вместо сотен (у меня есть четырехъядерный компьютер с гиперпоточностью), и теперь Java Mission Control дает мне более полезную информацию.   -  person music_and_cities    schedule 26.09.2017


Ответы (2)


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

person Kire Haglin    schedule 18.10.2017
comment
Да, я думал об этом, но у меня не было возможности поиграться с настройкой потоков ‹ядер. Я купил 16-ядерный Ryzen Threadripper, поэтому я могу установить его на 12 или около того. - person music_and_cities; 19.10.2017

Ответ, вероятно, столь же прост, как если бы у вас было больше потоков, чем ядер, и, следовательно, большинство из них не были запланированы на ЦП во время выборки. Сэмплер метода JFR будет сохранять только образцы потоков, фактически находящихся в ЦП. Идея состоит в том, чтобы дать вам представление о том, где вы на самом деле проводите время, выполняя свой Java-код.

Теперь мы знаем, что есть случаи, когда вы хотите получить случайные выборки всех потоков, независимо от того, что они делают. Мы добавляем новые возможности / события профилирования в JDK 10.

person Hirt    schedule 23.10.2017
comment
Спасибо. Вы правы, диагностика однозначно хуже, когда у меня потоков больше, чем ядер. Но даже когда я устанавливаю потоки немного меньше, чем ядра, я все равно не понимаю, на что тратится время. Я надеюсь вернуться к этому снова на следующей неделе, было бы неплохо получить определенный ответ относительно того, что происходит. - person music_and_cities; 24.10.2017