掘金 后端 ( ) • 2024-05-07 09:35

问题描述

在日常开发中,经常需要在测试环境进行定位接口速度慢,服务整体响应慢,需要观察应用程序的整体调度情况,而大部分环境上都部署在k8s的pod内,只能使用jdk原生的jps jstack jmap 等进行堆大小,线程执行状态的查看,我们希望使用更方便工具进行查看整体的线程运行状态,gc状态等服务信息,这时候就捉瞎了

在节点中接入arthas

arthas能干什么

  1. 获取某个方法的入参和返回结果
  2. 获取方法的调用时间 方法的调用堆栈
  3. 通过内置的async-profiler完成代码采样,统计代码耗时信息
  4. 获取系统属性以及Spring中环境属性
  5. 动态打开JVM部分参数的开关

如何接入

  1. 下载arthas-boot.jar 可参考官网

Arthas

PS: 如果是纯纯内网环境话,可以下载打包好的arthas 使用下方资源即可

arthas-packaging-3.7.2-bin.zip

  1. 上传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();
}

如何使用

启动

  1. 找到上传到k8s中的pod里面的arthas.jar
  2. java -jar arthas-boot.jar

image.png

  1. 注意标号的地方为arthas为java进程标注的序号,输入此序号(也就是你想监控的进程)

显示出来arthas的彩色图标即为attached成功 image.png 接下来就可以为所欲为了

使用

在Idea中安装arthas idea 插件

  1. 然后可以选中类中的字段名称

image.png image.png 就可以生成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'

image.png

  1. 在controller中选择方法名,可进行方法调用的耗时检测以及方法入参出参,以及方法调用的栈帧上下文

watch查看方法入参和返回 trace 跟踪方法调用栈帧以及耗时 monitor 监控方法的调用以及耗时

  1. 生成jfr导入idea中可以进行具体方法耗时的查看
    1. 获取arthas的jfr获取指令

      image.png

    2. 选择合适选项进行指令生成

image.png

  1. 下载生成的.jfr文件

ps: 可编写下载接口,然后通过接口调用的方式,将pod里面的文件下载出来

  1. 导入到idea中

image.png

  1. 在idea中查看具体的耗时信息

image.png

感谢各种观众老爷的观看,如果对您有帮助的话,请三连下,感谢💓