问题描述
使用Azure App Service,也可以部署一个Java程序作为Web Job运行。运行一个 .Jar 文件只需要以下4步:
1)打包一个 .jar 文件
2)创建一个 run.bat文件,并在文件中设置PATH 和 java -har运行命令,内容如下:
set PATH=%PATH%;%JAVA_HOME%/bin java -jar filename.jar
3)把 run.bat 和 .jar文件打包为一个 .zip 文件。
4)在App Service的Web Job页面中创建Job后,上传 .zip 文件。
如何在App Service中创建 Web Job可以参考官网: https://docs.azure.cn/zh-cn/app-service/webjobs-create#overview
在创建 Java .jar的web job成功运行后,在App Service的CPU监控中发现,实例CPU一直处于100%。如何来定位到具体线程?发现具体的故障呢?答案是:需要抓取消耗CPU高的进程的DUMP文件。本文就是介绍如何在App Service中,抓取Java版Web Job的DUMP文件
问题分析
因为Java的DUMP文件需要在JDK的运行环境中才能通过 jstack 命令来抓取,而App Service默认使用的是 jre。在App Service的高级管理工具(Kudu)可以查看到当前的Java_Home查看到所使用的Jre版本。
所以第一步就是需要修改Java的运行时版本。
第一步:需要修改run.bat文件,使用JDK来运行Java Web Job。把此前所使用的相对路径(依赖JAVA_HOME)变为绝对路径 "D:\Program Files\Java\jdk1.8.0_172\bin\java.exe" -jar filename.jar
第二步:等待 .jar Web Job运行后,到进程浏览器中查询相关java进程的id (注意是web job的javb 进程)。
(如上图中显示,Web Job的Java进程号为12996)
第三步:进入到 Logfiles 目录下,使用以下命令抓取 DUMP,查看进程内部的线程情况(输出内容在thread.txt文件中)。
"C:\Program Files\Java\jdk1.8.0_172\bin\jstack" 12996 >> D:\home\LogFiles\thread.txt
参考资料
在 Azure 应用服务中使用 WebJobs 运行后台任务: https://docs.azure.cn/zh-cn/app-service/webjobs-create#overview
Uploading a JAR file as WebJob in a WebApp:https://social.msdn.microsoft.com/Forums/azure/en-US/65669732-14f1-431a-b74a-36630bf800a4/uploading-a-jar-file-as-webjob-in-a-webapp?forum=windowsazurewebsitespreview
Executing Java Web Jobs on Azure: https://docs.microsoft.com/zh-cn/archive/blogs/azureossds/executing-java-web-jobs-on-azure
如何为 Web 应用配置自定义 Tomcat 环境: https://docs.azure.cn/zh-cn/articles/azure-operations-guide/app-service-web/aog-app-service-web-howto-configure-custom-tomcat-environment