jvm实战系列「监控调优体系」实战开发arthas-spring-boot-starter监控你的微服务是否健康(代码片段)

洛神灬殇 洛神灬殇     2022-12-23     451

关键词:

前提介绍

相信如果经历了我的上一篇Arthas的文章[【JVM实战系列】「监控调优体系」针对于Alibaba-Arthas的安装入门及基础使用开发实战指南]之后,相信你对Arthas的功能和使用应该有了一定的理解了。那么我们就要进行下一步的探索功能。

Arthas对于SpringBoot2的支持和监控体系

在SpringBoot2应用中加入arthas-spring-boot-starter后,Spring会启动arthas服务,并且进行attach自身进程,并配合tunnel server实现远程管理。这样的方案非常适合在微服务容器环境中进行远程诊断,在容器网络环境中仅需要对外暴露tunnel server的端口。

Arthas的监控体系所需要的组件支持

  • Arthas Tunnel Server/Client(Java agent探针的管理和监控,方便我们管理服务和探针)
  • Web Console

什么是Arthas Tunnel

在容器化部署的环境内部,Java进程可以是在不同的机器启动的,想要使用Arthas去诊断会比较麻烦,因为用户通常没有机器的权限,即使登陆机器也分不清是哪个Java进程。在这种情况下,可以使用 Arthas Tunnel Server/Client。

Arthas Tunnel的作用和目的

整个Arthas的功能体系中,可以通过Arthas Tunnel Server/Client来远程管理/连接多个Agent(也就代表着可以监控多个JVM进程)。主要目的用于监控和获取目标的JVM的进程数据信息。

下载部署Arthas tunnel server

Github源码仓库下载

下载地址Arthas tunnel server,目前最新版本为arthas-all-3.6.7版本,如下图所示。

针对于Arthas的安装包进行下载资料进行介绍:

  • arthas-3.6.7.deb:主要用于debian操作系统去运行的安装包
  • arthas-bin.zip:二进制可运行执行包
  • arthas-doc.zip:针对于arthas的文档
  • arthas-tunnel-server-3.6.7-fatjar.jar:Arthas tunnel server服务的Jar可以执行包
  • Source code(zip):源码zip压缩包
  • Source code(tar.gz):源码tar包
Maven仓库下载

阿里云的下载地址:https://arthas.aliyun.com/download/arthas-tunnel-server/latest_version?mirror=aliyun

直接运行对应的Arthas tunnel server

Arthas tunnel server是一个Spring boot fat jar 应用,直接java -jar启动:

java -jar  arthas-tunnel-server.jar

默认情况下,arthas tunnel server的web端口是8080,Arthas agent 连接的端口是7777

打开WebConsole,分别输入Arthas agent的ip(127.0.0.1)和port(7777),和SpringBoot应用里配置的agent-id(URJZ5L48RPBR2ALI5K4V),点Connect即可。

Web Console

如果希望可以通过浏览器连接Arthas服务,此时这里的Arthas服务指的不是Arthas tunnel server,Arthas是总体的服务控制端,发送指令的部分,而Arthas tunnel server属于对接和管理agent的专门服务(依赖于Arthas Spring Boot Starter的服务)。

出了CLI模式之外,Arthas目前支持 Web Console,用户在attach成功之后,可以直接访问:http://127.0.0.1:8563/。
可以填入 IP,远程连接其它机器上的arthas。启动之后,可以访问 http://127.0.0.1:8080/ ,再通过agentId连接到已注册的arthas agent 上,如下图所示。

通过Spring Boot的Endpoint,可以查看到具体的连接信息: http://127.0.0.1:8080/actuator/arthas ,

登陆用户名是arthas,密码在 arthas tunnel server 的日志里可以找到,比如:

注意:默认情况下,arthas 只 listen 127.0.0.1,所以如果想从远程连接,则可以使用 --target-ip参数指定 listen 的 IP,更多参考-h的帮助说明。 注意会有安全风险,考虑下面的 tunnel server 的方案。

如何将服务连接Arthas tunnel server

主要有两种模式连接Arthas tunnel server:

  1. 远程运行的Arthas server连接Arthas tunnel server
  2. 远程运行的Arthas Spring Boot Starter的agent探针服务连接Arthas tunnel server

启动 arthas 时连接到 tunnel server

在启动 arthas,可以传递–tunnel-server参数,比如:

as.sh --tunnel-server 'ws://127.0.0.1:7777/ws'

如果有特殊需求,可以通过–agent-id参数里指定 agentId。默认情况下,会生成随机 ID。attach 成功之后,会打印出 agentId。

  ,---.  ,------. ,--------.,--.  ,--.  ,---.   ,---.
 /  O  \\ |  .--. ''--.  .--'|  '--'  | /  O  \\ '   .-'
|  .-.  ||  '--'.'   |  |   |  .--.  ||  .-.  |`.  `-.
|  | |  ||  |\\  \\    |  |   |  |  |  ||  | |  |.-'    |
`--' `--'`--' '--'   `--'   `--'  `--'`--' `--'`-----'

wiki      https://arthas.aliyun.com/doc
tutorials https://arthas.aliyun.com/doc/arthas-tutorials.html
version   3.1.2
pid       86183
time      2022-11-30 15:40:53
id        URJZ5L48RPBR2ALI5K4V

即使是启动时没有连接到 tunnel server,也可以在后续自动重连成功之后,通过 session 命令来获取 agentId:

[arthas@86183]$ session
 Name           Value
-----------------------------------------------------
 JAVA_PID       86183
 SESSION_ID     f7273eb5-e7b0-4a00-bc5b-3fe55d741882
 AGENT_ID       URJZ5L48RPBR2ALI5K4V
 TUNNEL_SERVER  ws://127.0.0.1:7777/ws

在浏览器里访问 http://localhost:8080/arthas,输入agentId,就可以连接到本机/其他机器上上的 arthas 了。

tunnel server的注意要点
  • agentId要保持唯一,否则会在 tunnel server 上冲突,不能正常工作。
  • 如果arthas agent配置了appName,则生成的agentId会带上appName的前缀。
添加对应的app-name参数
启动参数
as.sh --tunnel-server 'ws://127.0.0.1:7777/ws' --app-name demoapp ,则生成的 agentId 可能是demoapp_URJZ5L48RPBR2ALI5K4V。

Tunnel server 会以_做分隔符,提取出appName,方便按应用进行管理

配置参数

解压的 arthas 目录下的 arthas.properties,或者在 spring boot 应用的application.properties里配置appName。

Arthas Spring Boot Starter的agent服务连接Jar

只支持 springboot2

  • maven的仓库地址:https://search.maven.org/search?q=a:arthas-spring-boot-starter

  • 配置 maven 依赖:

arthas.version:3.6.7

<dependency>
     <groupId>com.taobao.arthas</groupId>
    <artifactId>arthas-spring-boot-starter</artifactId>
    <version>$arthas.version</version>
</dependency>

应用启动后,spring 会启动 arthas,并且 attach 自身进程。如果你不知道如何创建或者引入哪些依赖,可以采用一键创建包含 Arthas Spring Boot Starter 的工程:点击跳转到云原生脚手架

可以看到最下面已经自动勾选了arthas的监控机制体系。

application.yml配置
arthas:
  agent-name: nihaotest
  agent-id: URJZ5L48RPBR2ALI5K4V  #需手工指定agent-id
  tunnel-server: ws://127.0.0.1:7777/ws

查看 Endpoint 信息

需要配置 spring boot 暴露 endpoint:假定endpoint 端口是 8080,则通过下面 url 可以查看:

http://localhost:8080/actuator/arthas


    "arthasConfigMap": 
        "agent-id": "hsehdfsfghhwertyfad",
        "tunnel-server": "ws://47.75.156.201:7777/ws",
    

最后,启动SpringBoot服务即可

非 spring boot 应用使用方式

非 Spring Boot 应用,可以通过下面的方式来使用:

 <dependency>
     <groupId>com.taobao.arthas</groupId>
     <artifactId>arthas-agent-attach</artifactId>
     <version>$arthas.version</version>
 </dependency>
 <dependency>
      <groupId>com.taobao.arthas</groupId>
     <artifactId>arthas-packaging</artifactId>
     <version>$arthas.version</version>
</dependency>
attach本身的服务进行探针探测。
import com.taobao.arthas.agent.attach.ArthasAgent;
public class ArthasAttachExample 
	public static void main(String[] args) 
		ArthasAgent.attach();
	

也可以配置属性:

HashMap<String, String> configMap = new HashMap<String, String>();
configMap.put("arthas.appName", "demo");
configMap.put("arthas.tunnelServer", "ws://127.0.0.1:7777/ws");
ArthasAgent.attach(configMap);

Tunnel Server 的管理页面

需要在 spring boot 的application.properties里配置 arthas.enable-detail-pages=true

注意,开放管理页面有风险!管理页面没有安全拦截功能,务必自行增加安全措施。

在本地启动 tunnel-server,然后使用as.sh attach,并且指定应用名–app-name test:

$ as.sh --tunnel-server 'ws://127.0.0.1:7777/ws' --app-name test
telnet connecting to arthas server... current timestamp is 1627539688
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
  ,---.  ,------. ,--------.,--.  ,--.  ,---.   ,---.
 /  O  \\ |  .--. ''--.  .--'|  '--'  | /  O  \\ '   .-'
|  .-.  ||  '--'.'   |  |   |  .--.  ||  .-.  |`.  `-.
|  | |  ||  |\\  \\    |  |   |  |  |  ||  | |  |.-'    |
`--' `--'`--' '--'   `--'   `--'  `--'`--' `--'`-----'

wiki       https://arthas.aliyun.com/doc
tutorials  https://arthas.aliyun.com/doc/arthas-tutorials.html
version    3.5.3
main_class demo.MathGame
pid        65825
time       2022-07-29 14:21:29
id         test_PE3LZO9NA9ENJYTPGL9L

然后访问 tunnel-server,可以看到所有连接的应用列表:

http://localhost:8080/apps.html

再打开详情,则可以看到连接的所有 agent 列表:

http://localhost:8080/agents.html?app=test

jvm实战系列「监控调优体系」针对于alibaba-arthas的安装入门及基础使用开发实战指南(代码片段)

Arthas特性介绍Arthas是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。Arthas支持JDK6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供... 查看详情

理论+实战构建完整jvm知识体系

理论+实战构建完整JVM知识体系  对于Java开发而言,Java虚拟机是开发工作中必须要理解和掌握的知识内容,也是Java面试中面试官常会问到的考点。在本课程中,我将带你循序渐进的学习JVM:从源码到运行、类加载,再到... 查看详情

理论+实战构建完整jvm知识体系

...类加载,再到内存分配和垃圾回收,以及JVM调优的技巧与实战。整个课程基于JDK13讲解,理论-实战-面试三结合,带你剖析整个JVM知识体系,JVM问题一站解决。一、首先JVM是什么JVM它是JavaVirtualMachine的 查看详情

理论+实战构建完整jvm知识体系

...类加载,再到内存分配和垃圾回收,以及JVM调优的技巧与实战。整个课程基于JDK13讲解,理论-实战-面试三结合,带你剖析整个JVM知识体系,JVM问题一站解决。 第1章课程导学与准备工作本章主要介绍为何要带大家从零开始 查看详情

java开发经典实战!java代码编译过程

...OLLECTOR-三色标记垃圾回收算法串讲JVM常见参数总结JVM调优实战JVM(HotSpot)核心源码解读J 查看详情

jvm性能监控与gc调优(代码片段)

...信息2.2垃圾回收信息2.3JIT编译信息3.jmap+MAT分析内存溢出[实战]3.1模拟内存溢出3.2导出内存影像文件3.3使用MAT分析dump文件4.jstack分析死循环与死锁[实战]三基于JVisualVM的可视化监控四基于 查看详情

springbootserverless实战系列|性能调优

简介:SpringBootServerless实战系列第四篇来啦,本文将向大家介绍如何对Serverless应用进行性能调优。SpringBoot是基于JavaSpring框架的套件,它预装了Spring的一系列组件,让开发者只需要很少的配置就可以创建独立运行... 查看详情

jvm性能调优实战-61常用的jvm调优网站

文章目录线程Dump日志分析堆Dump可视化分析GC日志分析AlibabaArthasAliabbajvmGeneratePerfMaPerfMa-XXFox(Java虚拟机参数分析)PerfMa-XSheepdog(Java线程Dump分析)PerfMa-XElephant(Java内存Dump分析)线程Dump日志分析https://fastthread.io在线的 查看详情

深入理解jvm——jvm性能调优实战

如何在高性能服务器上进行JVM调优;以便充分利用高性能服务器的硬件资源,有两种JVM调优方案。一、       采用64位操作系统,并为JVM分配大内存分析:如果JVM中堆内存太小,那么就会频繁地发生垃圾... 查看详情

tomcat的jvm调优实战

 一些调优点在上篇日志中已写到,在此不做说明 直接使用Jmeter进行调优测试吞吐量Codepackage cn; import java.io.IOException;import java.util.Map;import java.util.WeakHashMap; import javax.servle 查看详情

jvm性能调优实战篇(代码片段)

...流群????????作者丨黎杜来源丨黎杜编程这一篇是JVM的调优实战篇,内容如下,包括常用的调优工具本地的和线上的,并且有案例结合使用来讲解,然后就是一些常见的实战场景,这个也是几乎大厂面试官会问的... 查看详情

《jvm调优实战-理论篇》

1理论篇1.1多功能养鱼塘-JVM内存大鱼塘O(可分配内存):JVM可以调度使用的总的内存数,这个数量受操作系统进程寻址范围、系统虚拟内存总数、系统物理内存总数、其他系统运行所占用的内存资源等因素的制约。小池塘A(堆... 查看详情

elasticsearch性能调优指南——推荐实战dsl

...6篇基础上的继续扩展版本,不求大而全,只求对实战有帮助。1、干货|Elasticsearch运维实战常用命令清单2、干货|ElasticsearchTop10监控指标3、你不得不关注的ElasticsearchTopX关键指标4、干货|Elasticsearch开发实战常用命令清单5、... 查看详情

springboot知识体系实战-前言

...前言一样,接下来我也为我即将分享的SpringBoot知识体系实战系列文章做一个前言介绍。作为现在微服务体系主流的框架,我想诸位都知晓SpringBoot,SpringCloud,打开Spring官网(官网链接)会发现SpringBoot已经是Spring开发团队重点推... 查看详情

jvm调优:arthas工具

阿里出品:官网 https://alibaba.github.io/arthas/ 入门:  1、下载  2、启动    java-jararthas-boot.jar  3、输入待分析的java进程序号,启动挂在分析  4、关闭Arthas服务端:stop典型使用dashboard:当前进程的信息 &nbs... 查看详情

jvm性能调优实战:让你的intellijidea纵享丝滑(代码片段)

...分的Java程序员都使用的时IntelliJIdea,本篇就使用工具来实战演练对IntelliJIdea运行速度调优调优前的运行状态原始配置内容要查询idea原始配置文件的路径可以在VisualVM中的概述 查看详情

jvm性能调优实战之:一次系统性能瓶颈的寻找过程

玩过性能优化的朋友都清楚,性能优化的关键并不在于怎么进行优化,而在于怎么找到当前系统的性能瓶颈。性能优化分为好几个层次,比如系统层次、算法层次、代码层次...JVM的性能优化被认为是底层优化,门槛较高,精通这... 查看详情

day800.jvm内存分配优化-java性能调优实战(代码片段)

JVM内存分配优化Hi,我是阿昌,今天学习记录的是关于JVM内存分配优化。JVM调优是一个系统而又复杂的过程,在大多数情况下,基本不用去调整JVM内存分配,因为一些初始化的参数已经可以保证应用服务正常稳... 查看详情