各位小伙伴,以下是我的一些处理方法,与大家共享。
今天上传了一个13kb的文件,提示磁盘已满,不能上传。df -h 查了一下,如下图:
磁盘慢了
由于是开发环境,堆满了大量的日志没删,10g了,于是我删除了一些很久的日志,8g。奇怪的事情发生了,命令查看磁盘,依然是100%。linux还是跟windows区别挺大的么,windows我们删除了文件,马上就有磁盘释放了。想到的就是删除的文件并不能释放出磁盘(当时只是猜测),于是lsof | grep deleted 查了一下。
果断地把这些进程都kill掉了,哎呦喂,奇迹发生了,df -h 查看:
已经从100%降到了13%。问题解决了,于是找度娘查了下linux删除的机制,大致如下:
一个文件在文件系统中的存放分为两个部分:数据部分和指针部分,指针位于文件系统的meta-data中,数据被删除后(例如我们的日志文件),这个指针就从meta-data中清除了,而数据部分存储在磁盘中,数据对应的指针从meta-data中清除后,文件数据部分占用的空间就可以被覆盖并写入新的内容,之所以出现删除log文件后,空间还没释放,就是因为httpd进程还在一直向这个文件写入内容,导致虽然删除了log文件,但文件对应的指针部分由于进程锁定,并未从meta-data中清除,而由于指针并未被删除,那么系统内核就认为文件并未被删除,因此通过df命令查询空间并未释放也就不足为奇了。一般说来不会出现删除文件后空间不释放的情况,但是也存在例外,比如文件被进程锁定,或者有进程一直在向这个文件写数据等等,要理解这个问题,就需要知道Linux下文件的存储机制和存储结构。