问题描述
在日常开发中,经常需要在测试环境进行定位接口速度慢,服务整体响应慢,需要观察应用程序的整体调度情况,而大部分环境上都部署在k8s的pod内,只能使用jdk原生的jps
jstack
jmap
等进行堆大小,线程执行状态的查看,我们希望使用更方便工具进行查看整体的线程运行状态,gc状态等服务信息,这时候就捉瞎了
在节点中接入arthas
arthas能干什么
- 获取某个方法的入参和返回结果
- 获取方法的调用时间 方法的调用堆栈
- 通过内置的
async-profiler
完成代码采样,统计代码耗时信息 - 获取系统属性以及Spring中环境属性
- 动态打开JVM部分参数的开关
如何接入
- 下载arthas-boot.jar 可参考官网
PS: 如果是纯纯内网环境话,可以下载打包好的arthas 使用下方资源即可
arthas-packaging-3.7.2-bin.zip
- 上传arthas-boot.jar,上传到指定的目录下(可自行进行修改)
@PostMapping("upload")
@ResponseBody
public String upload(@RequestPart(name = "file") MultipartFile file) throws IOException {
File tmpDir = FileUtil.getTmpDir();
File dest = FileUtil.file(tmpDir.getPath() + File.separator + IdUtil.fastSimpleUUID() + File.separator + file.getOriginalFilename());
FileUtil.writeFromStream(file.getInputStream(), dest);
log.info("上传文件的写入路径为:[{}]", dest.getPath());
return dest.getAbsolutePath();
}
如何使用
启动
- 找到上传到k8s中的pod里面的arthas.jar
java -jar arthas-boot.jar
- 注意标号的地方为
arthas
为java进程标注的序号,输入此序号(也就是你想监控的进程)
显示出来arthas的彩色图标即为attached成功 接下来就可以为所欲为了
使用
在Idea中安装arthas idea
插件
- 然后可以选中类中的字段名称
就可以生成arthas
的command了
[arthas@8]$ watch -x 3 -n 1 org.springframework.web.servlet.DispatcherServlet doDispatch '@org.springframework.web.context.support.WebApplicationContextUtils@getWebApplicationContext(params[0].getServletContext()).getBean("downloadController").storagsseService'
- 在controller中选择方法名,可进行方法调用的耗时检测以及方法入参出参,以及方法调用的栈帧上下文
watch
查看方法入参和返回
trace
跟踪方法调用栈帧以及耗时
monitor
监控方法的调用以及耗时
- 生成jfr导入idea中可以进行具体方法耗时的查看
-
获取arthas的jfr获取指令
-
选择合适选项进行指令生成
-
- 下载生成的.jfr文件
ps: 可编写下载接口,然后通过接口调用的方式,将pod里面的文件下载出来
- 导入到idea中
- 在idea中查看具体的耗时信息
感谢各种观众老爷的观看,如果对您有帮助的话,请三连下,感谢💓