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

yizhihongxing

以下是 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 Apache Commons报错“UnmodifiableException”的原因与解决方法

    “UnhandledException”是Java的ApacheCommons类库中的一个异常,通常由以下原因之一引起: 代码错误:如果代码中存在错误,则可能会出现此异常。例如,可能会使用错误的方法或参数。 系统错误:如果系统中存在错误,则可能会出现此异常。例如,可能会出现内存不足或文件系统错误。 以下是两个实例: 例1 如果代码中存在错误,则可以尝试检查代…

    Java 2023年5月5日
    00
  • 什么是永久代和元空间?

    以下是关于永久代和元空间的完整使用攻略: 什么是永久代和元空间? 永久代和元空间都是Java虚拟机中用于存储类信息的区域。在Java 8,永久代是用于存储类信息的区域,而在Java 8及以后的版本中,永久代被元空间所取。空间是一种新的内存区域,它与永久代相比,具有更高的灵活性和更好的性能。 永代 永久代是Java虚机中用于存储类信息的区域,它的大小是固定的,…

    Java 2023年5月12日
    00
  • Java的MyBatis框架中关键的XML字段映射的配置参数详解

    关于“Java的MyBatis框架中关键的XML字段映射的配置参数详解”,下面是完整的攻略: 什么是MyBatis框架 MyBatis 框架,是一款支持普通SQL查询和存储过程的优秀持久层框架。MyBatis 可以使用简单的 XML或注解 ,将接口和 Java的pojo(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。…

    Java 2023年5月20日
    00
  • 一篇文章带你了解常用的Maven命令

    一篇文章带你了解常用的Maven命令 Maven是一个流行的Java项目管理工具,它可以帮助我们管理Java项目的依赖库、构建工具、测试工具等,让Java项目开发变得更加高效和便捷。在使用Maven时,我们需要学习一些常用的命令,以便能够熟练地使用Maven来管理Java项目。本篇文章将带你了解常用的Maven命令。 1. mvn clean mvn cle…

    Java 2023年5月19日
    00
  • Java随手笔记8之包、环境变量和访问控制及maven profile实现多环境打包

    Java随手笔记8之包、环境变量和访问控制及maven profile实现多环境打包 包 在Java中,包是用来管理和组织类的,可以避免类名重复和冲突。包名是由完整类名组成的,例如com.example.myapp。约定俗成的做法是让包名和域名一致。 如何定义包 在Java源代码的开头,使用package关键字来定义包,例如: package com.exa…

    Java 2023年5月19日
    00
  • Linux系统Jsp的环境:Apache,Tomcat配置

    下面我将为你详细讲解如何在Linux系统上配置Apache和Tomcat环境以支持JSP。 安装Apache 首先,在Linux系统上安装Apache服务器,可以使用如下命令: sudo apt-get update sudo apt-get install apache2 安装完成后,你可以在浏览器中输入服务器的IP地址或域名来检查Apache是否正确安装…

    Java 2023年5月19日
    00
  • Java Kryo,Protostuff,Hessian序列化方式对比

    下面是对比Java Kryo、Protostuff和Hessian序列化方式的详细攻略。 1. 背景介绍 在开发应用程序的过程中,序列化和反序列化是一个非常重要的步骤。序列化可以将一个对象转化为一个字节数组或者二进制流,从而可以进行网络传输或者存储到本地文件中。反序列化可以将字节数组或者二进制流转换为一个对象,从而可以进行数据的读取和解析。 在Java语言中…

    Java 2023年5月27日
    00
  • 如何编写Java集成测试?

    当我们开发Java应用程序时,编写测试代码可以帮助我们检查和验证我们的代码是否正确。除了单元测试之外,集成测试也是一个非常重要的测试类型。在编写集成测试时,我们将多个组件集成在一起并测试它们之间的交互。下面是编写Java集成测试的完整使用攻略: 1. 确定要测试的组件 在编写集成测试之前,您需要确定要测试的组件,并将它们集成起来。通常情况下,这些组件可以是数…

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