问题背景
去年年底的时候需要升级项目,去北京某法院内网部署升级后的项目。
10多个微服务、3个平台、2个数据摆渡服务、数据库字段更新/加表。
由于只能在晚上使用用户较少的时候部署,所以大概20~21点才开始部署。
再由于某个部署文档写的有问题,导致我们一直折腾到凌晨2点,然后当我准备部署数据摆渡服务的时候,让我崩溃的问题就出现了:No space left on device
排查过程
说是磁盘满了,但是 df -h 查看发现还有剩余。
通过命令 for i in /*; do echo $i; find $i | wc -l; done 命令发现了罪魁祸首:
这个 /data 目录下竟然有655万多个Inode
通过 df -i 查看:
果然可用剩余空间已经是 0 了!
问了相关开发人员,该目录下存的是定时任务备份的文件,由于每天都走定时任务,导致文件过多,核实了清空后既然文件都可以删除,那就可以开始删了。
删除inode
- 进入
/data目录; - 执行
ls | xargs -n 10 rm -rf,因为文件太多rm -rf可能卡死或者用不了,会报Argument list too long错误。
执行了两分钟后我感觉删的差不多了,就 ctrl c 准备部署项目,这时候又来了一个新问题。
重新登录该linux服务器,[root@xxx ~] 变成了 -bash-4.1$
解决办法
原因
执行上述操作的时候估计是没进入 /data 目录而直接运行,导致将与这个用户有关环境变量文件删了。也就是用户的 /home 目录下面 .bash_profile .bashrc 被删除。
恢复
- su - test (切换到故障用户)
- -bash-4.1$ cp /etc/skel/.bash* ~ (复制对应的文件,/etc/skel/目录是用来存放新用户配置文件)
- ls -la (查看文件是否创建成功)
- logout (成功了就退出)
- su - test (切换回故障用户)
总结
这个问题在那天凌晨一直没解决,我以为我把系统搞坏了启动不了了,于是打算准备plan B,就先回酒店休息了,冬天的北京,从这个法院到住的地方不远不近,打车打不着。我们走顶着寒风到酒店已经凌晨4点,8点就得起来去继续部署,怕耽误其他人上班。
9点彻底解决了这个问题,其他服务也都没问题了,可以安心回家。
所以说,像这类经常存文件、日志的功能,就得做好监控措施,防止占内存,占inode,需要定时清理。日志可以用 ELK 去监控。
如果那天晚上部署,文档没有问题,并且服务器没有饱满,并且我经验丰富一眼知道问题所在,那我就可以早早回酒店刷手机了。
多学习积累经验吧,少年!
如何删除inode:https://blog.csdn.net/zhangmingcai/article/details/82706300 什么是inode:http://www.ruanyifeng.com/blog/2011/12/inode.html 恢复环境变量:https://blog.csdn.net/jiedao_liyk/article/details/78470498