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

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

1.问题描述

晚上下班前,现场传来噩耗,系统不响应了,马上远程支持。向日葵连接后,发现日志正常,日志回溯到问题发生的时间,发现报错如下

  org.springframework.dao.InvalidDataAccessApiUsageException: MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.; 
  nested exception is redis.clients.jedis.exceptions.JedisDataException: MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.

2.问题分析

从日志内容分析,是redis的快照RDB 失败,涉及到redis操作过程中直接抛出了异常,业务处理全部跳过,到了异常处理逻辑,因此要抓紧解决问题。
根据这个异常,常见的处理方式是通过更改redis config

 config set stop-writes-on-bgsave-error no

完成异常的忽略,进行异常的处理,但是治标不治本,不清楚问题的产生原因,可能还会按倒葫芦起了瓢,那今夜又无眠。

2.1 快照失败的思路分析

一般快照失败的原因有两类:服务本身原因;服务器原因
这个服务在现场已经运行了蛮长的时间,可以排除本身的docker镜像原因,所以顺着服务器问题来进行排查。

2.2 排查过程

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

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

df -h  

查看硬盘资源占用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tf3lXNK2-1651215723123)(/upload/2022/04/image-1651212503930.png)]

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

2.2.2 Top观察资源 观察CPU 内存

使用命令

top 

观察服务器资源占用

开始观察,很明显发现内存占用非常的高,
查看内存占比:

free -m

在这里插入图片描述

内存快要满了,同时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.2.3 根据PID查找对应的docker 容器
  • 使用docker container top container_name 获取容器对应PID
    对应的命令只能单个查询已知名称的容器PID 这样排查起来比较困难,一个个尝试的话费力不讨好
  • 列表获得容器PID
docker inspect -f '{{.State.Pid}}' $(docker ps -aq)

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

在这里插入图片描述

获得到对应的服务容器

2.3 最终处理

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值