Linux磁盘空间释放解决步骤
Linux磁盘空间释放解决步骤
问题说明
IDC里的一台主机的/分区使用率爆满了!已达到100%!经查看揭示有个存档过大(80G),于是在跟有关同僚确认后rm
-f果断删除该存档。但是揭示删除该存档后,/分区的磁盘空间压根没有释放出来,使用率还是100%!这是为什么呢??
[root@linux]# df -hFilesystem
原因解析:
在Linux体系中,通过rm或者存档管理器删除存档,只是将它会从存档体系的目录结构上解除链接(unlink),也就是说只是删除了存档和体系目录结构的链接;如果存档在删除时是被打开的(有一个进程正在使用该存档,存档被进程锁定或者有进程一直在向这个存档写数量等)状态,那么进程将仍然可以读取该存档,也就是说没有删除掉存档在读取的状态,所以磁盘空间也就会一直被占用。
一个存档在存档体系中的存放分为两个部分:数量部分和指针部分,指针位于存档体系的meta-data中,数量被删除后,这个指针就从meta-data中清除了,而数量部分数据保存在磁盘中,数量对应的指针从meta-data中清除后,存档数量部分占用的空间就可以被覆盖并写入新的内容,之所以出现删除存档后,空间还没释放,就是因为有进程还在一直向这个存档写入内容,导致虽然删除了存档,但存档对应的指针部分由于进程锁定,并未从meta-data中清除,而由于指针并未被删除,那么体系内核就认为存档并未被删除,因此通过df命令查询空间并未释放也就不足为奇了。
解决对策有以下几种
1.通过lsof|grep
deleted命令获取到已经被删除但是仍然被应用领域编码占用的存档列表,然后kill掉还在占用所删除存档的进程。需要注意的是:如果有很多进程都在使用所删除存档,那么采用第1种方式kill进程就有点麻烦了,而且风险因素也比较大。因为kill进程是通过截断proc存档体系中的存档可以强制要求体系回收处理分配给正在使用的的存档。必须要确定不会对运行中的进程造成冲击时才能使用,应用领域编码对这种方式支持帮助的并不好,当一个正在使用的存档被截断可能会引发不可预知的问题。
杀掉filebeat进程后磁盘空间恢复
2,或停掉或重启使用这个所删除存档的应用领域,让OS自动回收处理磁盘空间。
3,也可以重启操作过程体系,不过这并不是最好的途径
4,对待这种进程不停对存档写日志的操作过程,要释放存档占用的磁盘空间,最好的途径是在线清空这个存档。通过这种途径,磁盘空间不但可以马上释放,也可保障进程继续向存档写入日志。
在线清空存档(比如/home/111.log)的方式:
a)# echo " " > /home/111.log
b)# cat /dev/null > /home/111.log
c)# > /home/111.log
还有一种磁盘空间使用问题的现象:明明使用df -h命令查看磁盘空间使用率不算高,还有很多空余空间,但是创建存档或写入数量时一直报错磁盘写满:” no
space left on device”!
一般这种问题都是由于分区目录下deleted删除后的资源空间没有真正释放出来导致的, 具体处理流程如下:
1.先df -lh查看一下磁盘使用状况, 揭示/data分区下的Used已用空间很大, 但是实际查看并没有占用那么大的空间!
2.找到被删除存档所在的分区, 比如/data分区
3.查看被删除了的所有存档:lsof -n /data |grep deleted
4.杀死这些存档的delete进程, 释放空间: lsof -n /data |grep deleted|awk ‘{print $2}’|xargs
kill -9
5.接着再运行lsof -n /data |grep delete,应该就没有后果了。
6.注意: 刚杀死deleted进程时, df -h查看/data 分区, Used已用空间可能时瞬间显示过大, 但随着deleted进程杀死,
资源逐渐释放, /data分区下的Used已用空间会逐渐变小, Avail可用空间会逐渐变大)
大多数存档体系都会保留一部分空间留作紧要情况时用(比如存储盘空间满了),这样能保证有些要害应用领域(比如数量库)在存储盘满的时候有点余地,不致于马上就
crash,给监控体系和管理员一点时光去察觉。不过有时候这部分预留的存储盘空间不用的话有点浪费资源。
在Linux体系中,ext2、ext3、ext4存档体系上通常会默认预留5%的磁盘空间,比如磁盘如果是2TB,这就意味着有100GB的空间会被预留下来,这样的话会不会显得有点浪费资源了。可以通过”tune2fs”命令来改变5%的默认设置,比如只预留2%的空间。但是不建议设成0%,现实环境中这样做不平安。