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