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

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 

观察服务器资源占用
在这里插入图片描述
开始观察,很明显发现内存占用非常的高,
查看内存占比:

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 最终处理

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

猜你喜欢

转载自blog.csdn.net/qq_37049812/article/details/129187605