Arthas排查Kubernetes中应用频繁挂掉重启异常

以下是 Arthas 排查 Kubernetes 中应用频繁挂掉重启异常的完整攻略。

确认场景

首先,需要确认场景。用户反馈应用经常挂掉重启,需要排查问题。该应用运行在 Kubernetes 集群中。需要确定:是所有的节点都有相同的问题,还是只有某个节点有问题。同时,需要定位是否是应用级别的问题。

安装 Arthas

因为需要使用到 Arthas 工具,所以需要先安装 Arthas。可以在 Arthas 官网 找到安装方式。这里介绍一种在 Kubernetes 集群中安装 Arthas 的方式。

在需要排查异常的机器上,创建一个需要被 debug 的容器,并且在启动该容器时打开 Arthas。

下面是一个例子:

apiVersion: v1
kind: Pod
metadata:
  name: debug-container
spec:
  containers:
  - name: debug-container
    image: your/image
    command: ["/bin/sh", "-c", "java -jar /app.jar"]
    ports:
    - containerPort: 8080
    volumeMounts:
    - name: arthas
      mountPath: /arthas
  volumes:
  - name: arthas
    emptyDir: {}

在运行该配置文件启动容器之后,可以通过 kubectl exec 命令进入到 debug-container 容器中,并执行以下命令来启动 Arthas:

# 挂载 arthas.sh
$ curl -O https://alibaba.github.io/arthas/arthas-boot.jar
$ chmod +x arthas-boot.jar

# 启动 Arthas
$ java -jar arthas-boot.jar

确认问题

确认好场景并安装好 Arthas 后,就可以开始排查问题了。

对于容器中的应用,可以使用 Arthas 提供的命令来对应用进行 Debug。下面是一些常用的命令:

jvm

该命令可以查看容器中运行的 JVM 信息,例如版本、启动参数等。

$ jvm

sc

该命令可以查看容器中所有的类,包括类的描述、加载器以及路径等。

$ sc -d com.example.demo.service.UserServiceImpl

jad

该命令可以将一个类反编译成 Java 代码。

$ jad com.example.demo.service.UserServiceImpl

watch

该命令可以对某个类中的方法进行监控,当该方法被调用时可以打印日志。

$ watch com.example.demo.service.UserServiceImpl getUserById

trace

该命令可以对某个方法进行追踪,查看方法的调用过程。

$ trace com.example.demo.service.UserServiceImpl getUserById

示例

以下是两个使用 Arthas 排查 Kubernetes 中应用频繁挂掉重启异常的示例。

示例一:确认场景

我们的场景是:用户反馈应用经常挂掉重启,需要排查问题。该应用运行在 Kubernetes 集群中。需要确定:是所有的节点都有相同的问题,还是只有某个节点有问题。同时,需要定位是否是应用级别的问题。

我们先登录到 Kubernetes 集群所在的机器上,执行以下操作,启动 debug-container 容器:

apiVersion: v1
kind: Pod
metadata:
  name: debug-container
spec:
  containers:
  - name: debug-container
    image: your/image
    command: ["/bin/sh", "-c", "java -jar /app.jar"]
    ports:
    - containerPort: 8080
    volumeMounts:
    - name: arthas
      mountPath: /arthas
  volumes:
  - name: arthas
    emptyDir: {}

然后,我们进入到该容器中,执行以下命令启动 Arthas:

$ curl -O https://alibaba.github.io/arthas/arthas-boot.jar
$ chmod +x arthas-boot.jar
$ java -jar arthas-boot.jar

进入到 Arthas 后,可以使用 jvm 命令查看 JVM 信息,例如版本、启动参数等。对于应用挂掉的问题,最常见的原因就是内存不足,导致 OOM 错误,因为这里是应用级别的问题,所以我们需要确认容器的内存使用情况。我们使用 top 命令可以查看容器的内存、CPU 使用情况。

$ top

如果确认是内存不足导致的异常,我们可以使用 Arthas 的 memory 命令进行内存分析,查看哪些对象占用了大量内存。以下是 memory 命令的使用方法:

$ memory

示例二:排查问题

假设我们已经确认是应用级别的问题导致挂掉,我们需要排查具体是哪个方法/代码导致的问题。

我们先登录到 Kubernetes 集群所在的机器上,执行以下操作,启动 debug-container 容器:

apiVersion: v1
kind: Pod
metadata:
  name: debug-container
spec:
  containers:
  - name: debug-container
    image: your/image
    command: ["/bin/sh", "-c", "java -jar /app.jar"]
    ports:
    - containerPort: 8080
    volumeMounts:
    - name: arthas
      mountPath: /arthas
  volumes:
  - name: arthas
    emptyDir: {}

然后,我们进入到该容器中,执行以下命令启动 Arthas:

$ curl -O https://alibaba.github.io/arthas/arthas-boot.jar
$ chmod +x arthas-boot.jar
$ java -jar arthas-boot.jar

假设我们已经定位到问题所在的类和方法,例如:com.example.demo.service.UserServiceImpl.getUserById(),我们可以使用 watch 命令对该方法进行监控,打印日志帮助我们找出问题。

$ watch com.example.demo.service.UserServiceImpl getUserById

如果我们需要知道当前方法的调用过程,我们可以使用 trace 命令:

$ trace com.example.demo.service.UserServiceImpl getUserById

这样重复进行 1 到 2 即可找到具体问题的根本原因,最终确定具体解决方案。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Arthas排查Kubernetes中应用频繁挂掉重启异常 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 三分钟快速掌握Java中枚举(enum)

    下面是我对“三分钟快速掌握Java中枚举(enum)”的完整攻略。 简介 在Java编程中,枚举(enum)是一种特殊的数据类型,用于列举一组常量值。使用枚举可以将常量值分类并赋予更有意义的名称。通过这种方式,我们可以在代码中清晰地表达我们的意图,避免硬编码和潜在的错误。 创建枚举类型 在Java中,创建枚举类型非常简单。可以通过在类的顶部声明一个enum类…

    Java 2023年5月26日
    00
  • Java8新特性之深入解析日期和时间_动力节点Java学院整理

    Java8新特性之深入解析日期和时间_动力节点Java学院整理 为什么需要新的日期和时间API Java早期的日期和时间API出现了很多问题,如: API不一致:Java提供了大量日期和时间API,但它们之间的API不一致,这使得编写日期和时间代码非常困难。 可变性:Java早期的日期和时间API中的大多数类都是可变的,这意味着我们可以随时更改日期和时间,这…

    Java 2023年6月1日
    00
  • struts2通过action返回json对象

    实现Struts2通过Action返回JSON对象,可以按照以下步骤进行操作: 步骤一:导入依赖 在项目的pom.xml中导入struts2-json-plugin依赖,以便能够支持JSON格式的数据: <dependency> <groupId>org.apache.struts</groupId> <artifa…

    Java 2023年5月20日
    00
  • Sping Security前后端分离两种实战方案

    下面我将详细讲解“Sping Security前后端分离两种实战方案”的完整攻略。 方案概述 Spring Security作为一个强大的安全框架,在项目中得到了广泛的应用,但是其安全配置可能会随着项目的复杂度而变得非常繁琐。而前后端分离的架构模式也越来越多地被应用在实际项目中,那么如何在Spring Security中实现前后端分离呢?本文将介绍两种前后端…

    Java 2023年5月20日
    00
  • Java中的Graphics2D类基本使用教程

    接下来我将为你详细讲解Java中的Graphics2D类基本使用教程。Graphics2D类是Java图形库中比较重要的一个类,它可以用于绘制二维图形,包括直线、多边形、文字、图像等等。Graphics2D类是Graphics类的子类,它可以在Graphics基础上提供更丰富和更高级的图形绘制功能。 1. Graphics2D类的创建 要使用Graphics…

    Java 2023年5月26日
    00
  • jsp网站永久换域名的处理过程

    为了让JSP网站永久换域名,需要经历以下步骤: 1.获取新域名并备份 首先,需要购买新的域名并备份当前的网站文件和数据库。在未来完成所有工作之前,不要删除或更改备份,以便在需要恢复时可以再次使用。 2.更改网站配置 在备份之后,需要更新网站的配置文件,以使域名的更改与新的主机名称匹配。这个名称是作为新主机的核心部分进行配置的。可以按以下示例更改配置文件: &…

    Java 2023年5月19日
    00
  • Springmvc基于fastjson实现导包及配置文件

    SpringMVC 是一个非常流行的框架,它能很好的帮助我们实现 Web 应用开发。而 fastjson 是一个非常优秀的 JSON 序列化和反序列化类库,具备快速、可靠、灵活等特点,能够大大提高 Web 应用的效率。 在 SpringMVC 中使用 fastjson 可以大大减轻我们的开发负担,那么该如何实现呢? 导入 fastjson 包 首先需要在项目…

    Java 2023年6月15日
    00
  • 为何不要在MySQL中使用UTF-8编码方式详解

    下面是关于为什么不要在MySQL中使用UTF-8编码方式的详细攻略。 为什么不要在MySQL中使用UTF-8编码方式? 在MySQL数据库中,UTF-8编码是最常用的字符集之一,但是在某些情况下,使用UTF-8编码方式可能会导致一些问题。以下是一些原因: 1. 存储空间更大 在MySQL中,当使用UTF-8编码时,每个字符需要3个或4个字节来存储,而在ASC…

    Java 2023年6月1日
    00
合作推广
合作推广
分享本页
返回顶部