清除 Ubuntu Redis 上的永久数据
再部署测试业务的时候,欠考虑内存问题,导致服务器内存占满,最后还是放弃了 Redis来提高性能,此过程还导致另一个服务工作异常。
今天终于将写了差不多2周的数据采集和处理服务部署到了服务器上进行测试,由于采用了更熟悉的Laravel队列的形式来处理数据,按照设计每个窗口期队列将会处理10000条数据,部署到服务器上去后不到10分钟,通过查看数据库发现数据不再增长,MySQL Server 一度宕机,第一感觉就是内存不够导致的。通过 htop
查询后,发现redis占用了服务器的89%内存资源,顿时就觉得不对,于是开始排查。
首先我怀疑是在做Laravel数据入队列的过程中,可能由于队列处理失败,导致数据并没有成功出队列。但检查后发现每个 worker 都具备 failed
方法,并且在该方法中执行了数据清空等归零
措施,不可能是这里出错。
那么问题只可能是队列数据太多,然后尝试了减少队列同时处理的数据量,从每次50批次/每批次2000条数据,降低到10批次/1000条数据,再次观察htop
情况,发现内存使用率大幅度降低,但依然维持在 75%左右,这样的表现让人费解,因为剩余的资源还是不够 MySQL正常工作。
于是开始进一步,我降低了 Supervisor 中的worker实例数,从32个worker进程缩减至8个进程参与任务处理,重新查看 htop
数据发现依然占用内存到 68%左右,依然不理想。
最后我只能完全放弃在Laravel 队列中采用Redis来作为协调机制优化队列性能的想法,于是修改了Laravel的队列协调机制为通过数据库实现(修改Laravel .env 文件)。再次查看,发现内存使用率依然在70%以上。
尝试停止掉 Redis服务,内存使用率将至 10%,服务正常工作,但另外一项依赖于 Redis的服务无法正常工作。于是重新开启Redis服务,观察 htop
发现redis占用内存逐渐增加值70%以上水平。没办法只能卸载Redis服务,此时数据分析服务可以正常运行。
但当我发现服务B无法运行时,尝试重新安装Redis来使得B服务正常运行,发现Redis和之前表现一样,快速占用内存资源到70%以上。
此时我才想到Redis在启动后会将意外退出的持久化存储数据(也就是之前的队列数据)再次加载到内存中等待调用,然而这是业务A已经不需要这些数据了,因此就需要从Redis中删除这些数据,确保Redis持续正常运行。
由于我的Ubuntu 24 服务器,因此通过下列命令先停止了redis服务,然后再删除了位于redis数据目录下的数据文件:
停止Redis服务
systemctl stop redis
删除数据文件
rm -rf /var/lib/redis/
重新启动redis
systemctl start redis
重启后终于让两个业务的正常运行了,太耽搁时间了,又是二半夜,睡吧!