1、错误现象
的监控系统发来通知,报告一台服务器空间满了,登陆服务器查看,根分区确实没有空间了,如图1所示。
图1查看服务器c盘空间
这儿首先说明一下的一些删掉策略,因为没有回收站功能,所以线上上所有要删掉的文件就会先联通到系统/tmp目录下,之后定期清理/tmp目录下的数据。这个策略本身没有问题,并且通过检测发觉这台的系统分区中并没有单独界定/tmp分区,这样/tmp下的数据似乎占用了根分区的空间。既然找到了问题,这么删掉/tmp目录下一些占空间较大的数据文件即可,检测/tmp下最大的三个数据文件,如图2所示。
图2查看/tmp下最大的前三个数据文件
通过命令输出发觉在/tmp目录下有个66GB大小的文件access_log,这个文件应当是Apache形成的访问日志文件,从日志大小来看,应当是许久没有清除Apache日志文件了,基本判断是这个文件造成的根空间爆满,在确认此文件可以删掉后,执行如下删掉操作:
[root@localhost~]#rm/tmp/access_log
接着查看系统根分区空间是否释放,如图3所示。
图3查看c盘空间是否释放
从输出可以看见,根分区空间一直没有释放,这是如何回事?
通常来说不会出现删掉文件后空间不释放的情况,并且也存在例外,例如文件被锁定,或则有仍然在向这个文件写数据等,要理解这个问题,就须要晓得下文件的储存机制和储存结构。
一个文件在文件系统中的储存分为两个部份:数据部份和表针部份,表针坐落文件系统的meta-data中,在将数据删掉后,这个表针就从meta-data中清不仅,而数据部份储存在c盘中。在将数据对应的表针从meta-data中去除后,文件数据部份占用的空间就可以被覆盖并写入新的内容,之所以在出现删掉access_log文件后,空间还没释放,就是由于httpd还在仍然向这个文件写入内容,引起似乎删掉了access_log文件,而且因为锁定,文件对应的表针部份并未从meta-data中去除,而因为表针并未删掉,系统内核就觉得文件并未删掉,因而通过df命令查询空间并未释放也就不足为奇了。
3、问题排查
既然有了解决问题的思路,这么接出来瞧瞧是否有仍然在向access_log文件中写数据,这儿须要用到下的lsof命令,通过这个命令可以获取一个一直被应用程序占用的已删掉文件列表,命令执行如图4所示。
图4查看被应用程序锁定的已删掉文件列表
从输出结果可以看见,/tmp/access_log文件被httpd锁定,而httpd还仍然向这个文件写入日志数据。从第7列可知,这个日志文件大小约70GB,而系统根分区总大小才100GB,由此可知,这个文件就是造成系统根分区空间用尽的罪魁帮凶。最后一列的“deleted”状态说明这个日志文件早已被删掉,但因为还在仍然向此文件写入数据,因而空间并未释放。
4、解决问题
到这儿问题就基本排查清楚了,解决这一类问题的方式有好多种,最简单的方式是关掉或重启httpd删除文件后空间没释放,其实也可以重启,不过这种并不是最好的方式。对待这些不停对文件写日志的操作删除文件后空间没释放,要释放文件占用的c盘空间,最好的方式是在线清空这个文件,具体可以通过如下命令完成:
[root@localhost~]#echo"">/tmp/acess.log
通过这些方式,c盘空间不但可以马上释放,也可保障继续向文件写入日志,这些方式常常用于在线清除Apache、Tomcat、Nginx等服务形成的日志文件。