Linux系统盘爆满根目录100%,又找不到占空间的大文件 原因与解决方法

最近一位朋友他的Linux(Centos7)根目录一直100%,也就是系统文件磁盘已经爆满了。虽然通过:df -hdu -sh * 等指令配合使用,发现当前系统任然存在大量可以使用的空间(6.5G可用)。

 

但是:也发现大量剩余的磁盘空间不清楚怎么丢失了?(系统盘总共50G,只查出来了14G占的,假设系统再占20G,还有16G不知道哪里去了?)

 

原因:

在linux中,当我们使用rm在linux上删除了大文件,但是,如果有进程打开了这个大文件,却没有关闭这个文件的句柄,那么:linux内核还是不会释放这个文件的磁盘空间,最后造成磁盘空间占用100%,整个系统无法正常运行。

这种情况下,通过df和du命令查找的磁盘空间,两者是无法匹配的,可能df显示磁盘100%,而du查找目录的磁盘容量占用却很小。

遇到这种情况,基本可以断定是某些大文件被某些程序占用了,并且这些大文件已经被删除了,但是对应的文件句柄没有被某些程序关闭,造成内核无法回收这些文件占用的空间。

 

解决方法

既然知道了原因,解决起来就容易多了,说得简单一点,原因无非是:Linux磁盘空间被未知资源耗尽而已。

 

如何查找哪些文件被某些程序占用呢?

通过:lsof | grep deleted 指令,查看当前系统句柄未释放情况,命令如下:

lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。

在终端下输入lsof即可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户才能运行它。

以Centos7为例,如果没有lsof命令,可以手动yum安装即可,命令:yum install lsof

[[email protected] /]# lsof -n | grep deleted
zabbix_ag  1791        zabbix    3wW     REG              253,1         4     132502 /var/tmp/zabbix_agentd.pid (deleted)
zabbix_ag  1806        zabbix    3w      REG              253,1         4     132502 /var/tmp/zabbix_agentd.pid (deleted)
zabbix_ag  1807        zabbix    3w      REG              253,1         4     132502 /var/tmp/zabbix_agentd.pid (deleted)
zabbix_ag  1808        zabbix    3w      REG              253,1         4     132502 /var/tmp/zabbix_agentd.pid (deleted)
python     3946          root   14w      REG              253,1         0     393228 /tmp/cmflistener-stderr---agent-3916-1532518455-HYSskK.log (deleted)

lsof -n | grep deleted 打印出所有针对已删除文件的读写操作

 

命令:lsof -n | grep deleted 打印出所有针对已删除文件的读写操作,这类操作是无效的,也正是磁盘空间莫名消失的根本原因。上图只是截了一部份而已!

 

第一种解决方法:

将当前线程进行重启,关闭线程,从而让句柄释放,释放空间。

最常用的就是kill杀死占用的进程(注意,如果此进程是正常在使用的服务,杀死后更改日志存储位置在重新启动,以免导致影响线上服务)。

 

第二种解决方法:

找到指定的文件句柄,将当前文件句柄的大小设置为空。

根据当前的业务情况,需要对外提供实时服务,所以频繁重启不适合当前业务场景,那么,只能选择将文件句柄内容置空。文件句柄内容置空,文件的内容大小被置空,释放了磁盘空间,但是,文件句柄并没有释放,可能导致“Too Many File is Open“错误。

lsof
command     PID USER PGID   FD      type             DEVICE     SIZE       NODE NAME

lsof输出各列信息的意义如下:

COMMAND:进程的名称

PID:进程标识符

PPID:父进程标识符(需要指定-R参数)

USER:进程所有者

PGID:进程所属组

FD:文件描述符,应用程序通过文件描述符识别该文件。

DEVICE:指定磁盘的名称

SIZE:文件的大小

NODE:索引节点(文件在磁盘上的标识)

NAME:打开文件的确切名称

 

通过losf 获取当前文件的 PID 和 FD 两个参数:

置空当前的文件内容:

echo > /proc/PID/fd/FD

 

第三种解决方法:

find查找根下大于800M的文件;找到大的日志文件关闭掉,或者更改到其他磁盘。

find / -size +800M -exec ls -lh {} ;

 

总结:

如果发现还有大量的文件会标记为deleted,其空间也不会释放。自己就需要去看一下自己的程序或系统环境了,是不是哪里有问题?

    A+
发布日期:2020年10月17日 10:45:30  所属分类:Linux
最后更新时间:2020-10-17 10:46:24
评分: (1 票;平均数5.00 ;最高评分 5 ;用户总数1;总得分 5;百分比100.00)
付杰
wp dz 帝国 dede phpcms等快速建站服务
wp dz 帝国 dede phpcms等快速建站服务
  • ¥ 999元
  • 市场价:4999元
Microsoft 全家桶 “激活码/产品密钥”永久
Microsoft 全家桶 “激活码/产品密钥”永久
  • ¥ 29.99元
  • 市场价:888元
服务器管理面板/主机控制面板“安装”服务
服务器管理面板/主机控制面板“安装”服务
  • ¥ 49.9元
  • 市场价:99.9元
刷流量 刷人气 刷点击 刷收藏 刷APP关键词
刷流量 刷人气 刷点击 刷收藏 刷APP关键词
  • ¥ 1.0元
  • 市场价:9.9元

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: