线上项目CPU,内存都跑满了,怎么调试?

简介: Arthas在线上的使用技七及介绍

记得第一次当整个电商项目负责人的时候,在使用量高峰期时,运维的同事突然跑过来说,xx服务的某台机器的CPU,内存暴了(OOM了),赶紧想办法怎么做。当时的心情既高兴,又紧张。高兴的是产品真的有使用在使用了,有价值了;紧张的是出问题,要怎么解决?

出现这种问题有2种情况,一种是直接服务程序终止,一种是服务程序在还在(线程通过PS命令查看还在运行),但无法对外提供服务。

当然出现这种情况,都是第一时间让运维同事将nginx上的upstream对应的IP注释掉,不让流量在进来到故障的机器上。
对于第一种程序直接终止的,在启动的命令中,加上

-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=${
   
   HeapDumpPath} \

输出当时的jvm内存镜像,然后通过jconsole来进行分析。
最头痛的是第二情况,服务程序还在运行,但是CPU/内存都满了,这种也就是假死,通过日志文件啥的,很难分析到问题,在纠结的时候,有同事看到了Arthas,我靠,可以直接在线debug,于是乎就搞起来,但当时(三年前吧)只是命领行格式。当初通过

- dashboard
- thread
- jvm
- memory
- trace

等几个命令,就可以去分析问题。而最终的问题原因,都是程序没写好(哇〜〜 又写bug了)

  • 程序对象没控制好,在高并发时拼命产生对象,加大jvm的回收。
  • 下游服务接口慢,然后调用方没有控制好,卡线程(积压),挂。
  • 其它单服务达到瓶劲,只能扩服务(这锅可以不背了)。

最近由于项目的需要,又去逛了一遍Arthas的官网,发现Arthas加上了很多功能,感觉更加强大了。比如:

1、 提供了Web Console的界面功能

通过Web浏览器就可以连接Arthas,在web界面就可以输入各种命令来查看信息,简单强大的不要不要的,来看看它的界面:

image.png

Arthas目前支持Web Console,用户在attach成功之后,可以直接访问:http://127.0.0.1:8563/。可以填入IP,远程连接其它机器上的arthas。

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

2、 提供springboot快速集成 arthas-spring-boot-starter

不像以前的使用方式,是在运行java的服务器,单独启动Arthas来查看对应的java进程的数据。传统是这样使用,启动,选择对应的进程来看。

$ java -jar arthas-boot.jar
* [1]: 35542
  [2]: 71560 member-api.jar
  [3]: 38871 order-api.jar

由于大部分的开发人员都不具备服务器的权限,根本无法执行上面的操作,官方大佬要考虑到这种情况,提供了arthas-spring-boot-starter,让使用者零代码接入(简直神器来的),只需要在pom中引入:

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

当前只支持spring-boot 2.0以上的版本。

默认情况下,arthas-spring-boot-starter会禁掉stop命令。

当前版本是:3.6.1

集成arthas后,项目启动成功后,可以访问如下的URL,看是否集成成功。
假定endpoint端口是 8080
http://localhost:8080/actuator/arthas

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

配合 Arthas Tunnel,实现完美的界面查看。

3、 提供了Arthas Tunnel的集成功能

这是一个Arthas的管理功能,在一般的情况,普通的开发人员是不具备服务器的使用权限,没办法登录到指定的机器上去看具体的命令Console,而这个服务,可以实现一种远程管理/连接多个Arthas(Agent)的功能。

Arthas Tunnel是一个spring boot的应用程序,可以从官网/github上进行下载,直接java -jar启动:

java -jar  arthas-tunnel-server.jar

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

启动之后,可以访问 http://127.0.0.1:8080/ ,再通过agentId连接到已注册的arthas agent上。

通过Spring Boot的Endpoint,可以查看到具体的连接信息: http://127.0.0.1:8080/actuator/arthas ,登陆用户名是arthas,密码在arthas tunnel server的日志里可以找到,比如:

32851 [main] INFO  o.s.b.a.s.s.UserDetailsServiceAutoConfiguration

Using generated security password: f1dca050-3777-48f4-a577-6367e55a78a2

上面中的password,就是登录arthas的密码。
然后对第2点集成arthas时,添加上如下的配置,配置tunnel server实现远程管理:

arthas.agent-id=hsehdfsfghhwertyfad
arthas.tunnel-server=ws://47.75.156.201:7777/ws

agent-id 不是必须的,不配置的话,会自动产生一个随机数,看实际的需要来配置。

具体的内容,可以参考官试文档:
arthas.aliyun.com/doc/quick-s…
github.com/alibaba/art…

目录
相关文章
|
11天前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
41 7
|
9天前
|
开发框架 .NET PHP
网站应用项目如何选择阿里云服务器实例规格+内存+CPU+带宽+操作系统等配置
对于使用阿里云服务器的搭建网站的用户来说,面对众多可选的实例规格和配置选项,我们应该如何做出最佳选择,以最大化业务效益并控制成本,成为大家比较关注的问题,如果实例、内存、CPU、带宽等配置选择不合适,可能会影响到自己业务在云服务器上的计算性能及后期运营状况,本文将详细解析企业在搭建网站应用项目时选购阿里云服务器应考虑的一些因素,以供参考。
|
29天前
|
弹性计算 Kubernetes Perl
k8s 设置pod 的cpu 和内存
在 Kubernetes (k8s) 中,设置 Pod 的 CPU 和内存资源限制和请求是非常重要的,因为这有助于确保集群资源的合理分配和有效利用。你可以通过定义 Pod 的 `resources` 字段来设置这些限制。 以下是一个示例 YAML 文件,展示了如何为一个 Pod 设置 CPU 和内存资源请求(requests)和限制(limits): ```yaml apiVersion: v1 kind: Pod metadata: name: example-pod spec: containers: - name: example-container image:
165 1
|
1月前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
323 2
|
2月前
|
运维 JavaScript Linux
容器内的Nodejs应用如何获取宿主机的基础信息-系统、内存、cpu、启动时间,以及一个df -h的坑
本文介绍了如何在Docker容器内的Node.js应用中获取宿主机的基础信息,包括系统信息、内存使用情况、磁盘空间和启动时间等。核心思路是将宿主机的根目录挂载到容器,但需注意权限和安全问题。文章还提到了使用`df -P`替代`df -h`以获得一致性输出,避免解析错误。
|
2月前
|
C# 开发工具 Windows
C# 获取Windows系统信息以及CPU、内存和磁盘使用情况
C# 获取Windows系统信息以及CPU、内存和磁盘使用情况
54 0
|
3月前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
197 5
|
3月前
|
Prometheus Kubernetes 监控
使用kubectl快速查看各个节点的CPU和内存占用量
在Kubernetes集群中,安装metrics-server,并使用kubectl快速查看集群中各个节点的资源使用情况。
200 0
|
4月前
|
存储 监控 Docker
如何限制docker使用的cpu,内存,存储
如何限制docker使用的cpu,内存,存储
|
4月前
|
缓存 Kubernetes 数据中心
在Docker中,如何控制容器占用系统资源(CPU,内存)的份额?
在Docker中,如何控制容器占用系统资源(CPU,内存)的份额?