Linux+Docker 内存占用高问题排查

查看docker服务资源占用情况

docker stats

docker 停止所有容器命令

docker stop $(docker ps -a -q)

docker 启动所有容器命令

docker start $(docker ps -a -q)

2.1 df -h 查看硬盘资源占用

如果服务器被日志或者其他服务的文件占用磁盘过慢,也有可能导致持久化的失败,所以第一时间先查看磁盘占用。 使用命令

df -h

查看硬盘资源占用 挂载的磁盘占用还是非常健康的,可以排除这个原因

2.2 Top观察资源 观察CPU 内存

使用命令

top

观察服务器资源占用 开始观察,很明显发现内存占用非常的高,

使用命令

iotop

观察服务器的io使用情况

查看内存占比:

free -g

内存快要满了,同时buffer部分占用的内存也比较高。 先清除不用的页缓存

echo 1 > /proc/sys/vm/drop_caches

常用的清除缓存命令

To free pagecache:仅清除页面缓存(PageCache)

echo 1 > /proc/sys/vm/drop_caches

To free dentries and inodes:清除目录项和inode

echo 2 > /proc/sys/vm/drop_caches

To free pagecache, dentries and inodes:清除页面缓存,目录项和inode

echo 3 > /proc/sys/vm/drop_caches

清除缓存后发现,内存释放的并不多,判断是有程序正在进行大量的文件操作。

需要定位到内存占用的服务 使用命令

ps -aux | sort -k4nr | head -10

查看内存排行前十的服务

由于使用的是docker形式部署的环境,docker file 中使用了同一的app.jar 无法判断PID对应哪个服务,因此需要根据PID 确定对应的服务

2.3 根据PID查找对应的docker 容器

使用docker container top container_name 获取容器对应PID

docker container top container_name

对应的命令只能单个查询已知名称的容器PID 这样排查起来比较困难,一个个尝试的话费力不讨好 列表获得容器PID

docker inspect -f '{{.State.Pid}}' $(docker ps -aq)

其中 $(docker ps -aq) 可以替换成具体的container名称,这样效果等同与上一个命令

获得到对应的服务容器

2.4 最终处理

联系对应服务开发,对方查看后表示错误出现时进行了数据报表生成的操作,导致内存飙高,随后,先进行了对应服务的启动限制内存,待后续优化内容。

文章链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。