Как получить дамп потока 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, просто установите переменную env
JBP_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