docker线上服务器cpu100%的处理经历

简介: docker线上服务器cpu100%的处理经历

前两天上线一个springboot服务(docker容器部署),服务启动成功后,cpu负载瞬间上来直接100%。这样的表现显然是程序某个地方有问题。

1.第一反应就是某个地方的逻辑形成了死循环。当时通过shell命令

top
复制代码

显示

image.png

可以得到的信息是pid是340,但是有一个疑问就是无法确定对应的是哪个docker容器启动的服务。

2.通过docker命令

docker stats
复制代码

打印出每一个容器对应的指标参数。类似下面这种:

image.png

那么通过以上两个命令,就可以定位到底是哪个docker容器所承载的服务导致了cpu负载100%了。

既然已经定位到了具体哪个服务导致的问题,那么下一步就要定位具体是哪个线程导致的问题?

3.通过shell命令打印进程下所有线程的占用情况

top -H -p340
复制代码

其中340就是第一步获得的pid--->340

类似下面这种:

image.png


查看cpu那一列,找到异常数据为100%的那一行,并记录。

4.通过docker命令

docker exec -it {容器id} /bin/bash
复制代码

进入容器内部。因为是tomcat容器,也就意味着安装了JDK,那么可以使用jvm命令。

通过

jps
复制代码

查看容器内正在运行的java服务。一般是只有一个服务:

image.png

一般在docker配置中没有指定pid和宿主机一致的话,打出来的都是该实例内Bootstrap进程号为1.可查看docker-compose配置

image.png

那么咱们就可以直接通过以下命令打印线程堆栈

jstack -l 1 > pid.dump
复制代码

1就是指的当前运行java服务的pid。

5.把以上pid.dump下载到本地,通过文本工具打开,结合【第三步】获取的信息,结果定位到具体的线程堆栈:

image.png

(实际上【第三步】可以明确是“pool-4-thread-3”这个线程导致cpu负载100%)

看以上截图可知,问题出在TagHeartbeatCheckThread这个类的第55行。

6.根据提示,查看代码:

image.png

RfidDataCache这个是一个本地缓存,如果本地缓存为空,那么便会导致死循环。问题定位已经完成。

7.根据上面一系列的操作及问题定位,已经可以定位到问题产生的具体原因。想要解决这个问题,可以在判断本地缓存为空的时候,让线程睡眠2秒,降低cpu的负载;或者使用阻塞队列的方式,让线程等待直至本地缓存数据不为空。


相关文章
|
13天前
|
存储 关系型数据库 MySQL
使用Docker快速部署Mysql服务器
本文介绍了如何使用Docker快速部署MySQL服务器,包括下载官方MySQL镜像、启动容器、设置密码、连接MySQL服务器以及注意事项。
92 18
|
28天前
|
关系型数据库 MySQL Java
腾讯云服务器的使用、服务器中使用Docker安装常见的软件、如何将一个项目发布到服务器
这篇文章介绍了在腾讯云服务器上使用Docker安装常见软件的过程,包括安装MySQL、Redis和Tomcat,并提供了解决连接问题的方法。同时,还涉及了服务器中安装JDK 1.8的步骤和如何将项目打包部署到服务器上的指导,包括注意事项和操作提示。
腾讯云服务器的使用、服务器中使用Docker安装常见的软件、如何将一个项目发布到服务器
|
28天前
|
应用服务中间件 Docker 容器
在服务器中使用Docker安装Tomcat、同时实现目录挂载、并且部署War包到服务器
这篇文章介绍了在Docker中安装Tomcat的过程,包括搜索Tomcat镜像、拉取镜像、目录挂载的准备、创建并挂载容器,以及如何进入容器和进行测试。文中还说明了如何将WAR包部署到Tomcat服务器并访问部署的应用。
在服务器中使用Docker安装Tomcat、同时实现目录挂载、并且部署War包到服务器
|
17天前
|
存储 监控 Docker
如何限制docker使用的cpu,内存,存储
如何限制docker使用的cpu,内存,存储
|
26天前
|
缓存 Kubernetes 数据中心
在Docker中,如何控制容器占用系统资源(CPU,内存)的份额?
在Docker中,如何控制容器占用系统资源(CPU,内存)的份额?
|
30天前
|
SQL 存储 缓存
什么?部署ClickHouse的服务器CPU利用率100%了?
什么?部署ClickHouse的服务器CPU利用率100%了?
|
17天前
|
缓存 Linux 调度
Linux服务器如何查看CPU占用率、内存占用、带宽占用
Linux服务器如何查看CPU占用率、内存占用、带宽占用
55 0
|
Docker 容器
在宿主机查看docker使用cpu、内存、网络、io情况
使用命令 docker stats [OPTIONS] [CONTAINER...] docker stats命令返回一个用于运行容器的实时数据流。要将数据限制到一个或多个特定的容器,可以指定一个由空格分隔的容器名称或ID的列表。
2199 0
|
13天前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
|
13天前
|
NoSQL 应用服务中间件 Redis
Docker跨宿主机容器通信-通过网络跨宿主机互联
这篇文章介绍了Docker容器跨宿主机通信的实现方法,包括Docker的四种网络模式(host、none、container、bridge)以及如何通过修改网络配置和添加路由规则来实现不同宿主机上的容器之间的互联。
40 0
Docker跨宿主机容器通信-通过网络跨宿主机互联