Как получить дамп потока Java-приложения в Cloud Foundry?

Я попробовал пару вариантов

а. cf java thread-dump myapp -i0(Только 1 экземпляр, поэтому 0)
Ответ - ничего. журналы myapp показывают 2019-12-13T14:52:41.15+0800 [SSH/0] OUT Успешный удаленный доступ с 10.xxx:35764 2019-12-13T14:52:41.84+0800 [SSH/0] OUT Удаленный доступ завершен для 10.xxx:35764

б. я сделалcf ssh myapp

/home/vcap/app/.java-buildpack/open_jdk_jre/bin/ не имеет jstack, и команда jmap также не работает /home/vcap/app/.java-buildpack/open_jdk_jre/bin/ имеет следующие компоненты

Java
orbd servertool
Java-buildpack-память-калькулятор-3.13.0_RELEASE
pack200
tnameserv
JJS
policytool
unpack200 jvmkill-1.16.0_RELEASE
RMID
Keytool
rmiregistry

Вопрос-> Как получить java threaddump?

2 ответа

Я считаю, что самый простой вариант - запустить cf logsдля просмотра журналов приложений. Затем во втором терминалеcf ssh в приложение и запустите ps auxи найдите идентификатор процесса Java. Тогда бегиkill -3 <pid>. Ваш Java-процесс поймает этот сигнал и выдаст дамп потока. Он перейдет в STDOUT, который удобно перейдет в поток журнала вашего приложения, поэтому он должен отображаться в первом терминале.

Самое неприятное в этом то, что cf logsбудет вставлять дополнительный текст в начало каждой строки, что затрудняет загрузку дампа потока в инструменты. Обычно вы можете снять это с помощьюcut или awk, или вы можете перенаправить cf logs в файл, откройте текстовый редактор и найдите / замените начальный текст.

Кроме того, у вас есть еще несколько вариантов:

  • Если вы используете Spring, включите Spring Boot Actuators. Затем вы можете использовать/actuator/threaddump конечная точка для генерации и загрузки дампа потока (обратите внимание, что это JSON, а не стандартный формат)

  • Используйте инструмент APM или профилировщик, например NewRelic, AppDynamics, Dynatrace или YourKit. Они хорошо поддерживаются пакетом сборки Java, и большинство из них просто работают.

  • Используйте JMX. Достаточно просто включить пакет сборки Java, просто установите переменную envJBP_CONFIG_JMX к '{enabled: true}'и перезапустите приложение. После включения вы можете открыть туннель с помощьюcf ssh -N -T -L 5000:localhost:5000 <APP_NAME>. Затем откройтеjvisualvm, создайте новое "локальное" JMX-соединение с "localhost:5000" и подключитесь. Щелкните вкладку "Threads" и нажмите кнопку "Thread Dump". Он может быть немного медленным, поскольку он проходит через туннель, но дайте ему несколько секунд на завершение, и вы получите дамп потока.

Что не будет работать в Cloud Foundry: jstack а также jcmd. Пакет сборки Java на момент написания устанавливает JRE, и эти инструменты больше не поставляются с OpenJDK JRE и по юридическим причинам не могут быть включены в него. Если бы вы были к этому склонны, вы могли быscpинструменты и необходимые общие библиотеки от JDK до контейнера вашего приложения и запускать их, но это много работы, а не удовольствия. Я не очень хорошо знаком сcf java плагин, но я подозреваю, что он пытается использовать эти инструменты, которые раньше были доступны, а их больше нет.

Надеюсь, это поможет!

Вы должны иметь возможность получать ThreadDumps с помощью kill -3 <PID>и откройте его в анализаторе кучи, таком как анализатор памяти eclipse (MAT), и выберитеThread Stacks

Другие вопросы по тегам