早上收到了服务器磁盘使用率超过阈值的报警,登陆到服务器查看。
1. 查看整体磁盘使用率
确认磁盘的使用率确实超过阈值,使用如下命令:
df -H
发现/export目录下磁盘的使用率是73%,超过了设定的报警阈值70%。
2. 进入export目录,定位具体的大文件
cd /export
du -sh *
发现Logs目录下最近有很多大的日志文件,比如,平常一天是几百兆的文件,现在一天已经4-5个G,肯定不是正常的现象。
查看了一下日志文件中的打印的内容,发现很多是无效日志,而且之前的文件是可以删除的,在这个基础上,我开始了文件删除,主要是一些大的历史日志文件。
3. 删除大的历史文件
执行如下命令:
rm -f cataout.out.xxx
删除完毕之后,我以为磁盘空间就好了,打脸的是,瞬间又收到了报警,起初以为是误报,执行第一步的 df -H命令查看磁盘空间,发现磁盘空间并没有变化,依旧是73%
经过网上查找,知道rm只是将文件链接解除,如果此时有进程打开文件,系统是不会回收文件。说白就是,你删除的文件被放入了“回收站”,但是你看不这个“回收站”,但文件还占用着磁盘空间。此时,在删除文件的目录下,执行ls命令已经看不到被删除的文件了,用du -sh命令也发现磁盘容量很少,但是执行df -h会发现磁盘使用率并没有变化。
4. 解决思路
一般情况下,有下面两种方案:
- 重启电脑,系统就会回收磁盘空间。
- kill掉打开文件的进程。
- 之后如果想永久删除文件,应该这样执行rm命令,/bin/rm -f catalina.out.xxx,其效果等同于windows下shift+delete 永久删除
作为线上生产环境的服务器,重启肯定不行。所以第一条直接pass,线上服务器也千万别随随便便重启,影响很大。
第三条,是之后删除文件可以用到的,对于目前的情况不适用,所以pass。
所以只剩下第2条方案可以试一试了,在网上搜索了一下,发现lsof这个命令可以查看文件信息。通过命令lsof|grep deleted可以看到之前的日志文件都已经deleted了。
然后,有两种操作,
a. 重启进程。restart xxx
b. echo " " > catalina.out.xxx
其中,第二种方法,不但可以让磁盘空间可以马上释放,也可保障进程继续向文件写入日志,这种方法经常用于在线清理Apache、Tomcat、Nginx等Web服务产生的日志文件。
再df -h就会发现磁盘使用率已经降下来了。
当然,线上的服务涉及到docker,最后的处理有docker运维人员的参与。