Linux 系统磁盘空间占满,df 和 du 结果不一致

服务器运行一段时间后df查看磁盘剩余空间不足,通过du统计发现被几个文件占用,遂删除之。过了一段时间磁盘空间再次不足,通过du统计却找不到那么多大文件。搜索后才得知原因:文件删除后空间没有释放,du统计不到这部分文件;需要通过lsof排查,然后kill文件进程。以下记录排查处理过程:

df查看分区使用情况

df(Disk Free) 以磁盘分区为单位查看文件系统,获取硬盘被占用空间和剩余空间等信息。df 默认显示的文件大小单位Byte;使用命令df -h,以KB,MB,GB为单位,提高可读性。

显示内容参数说明:

  • Filesystem:文件系统
  • Size: 分区大小
  • Used: 已使用容量
  • Avail: 还可以使用的容量
  • Use%: 已用百分比
  • Mounted on: 挂载点

du查看目录占用空间

du(Disk Usage) 含义为显示磁盘空间的使用情况,用于查看当前目录的总大小。

df统计出根目录占用30G,而du统计结果为11G(排除/mnt占用),大约19G的空间去哪儿了呢?
搜索 linux du df空间不一致 才得知原因:当有其他进程打开某文件时文件被删除,就会将该文件标记为deleted(类似windows下的回收站状态),并删除其目录节点。使用du查看时,因为没有该删除状态文件的节点信息,所以就不做统计,从而导致与df的结果不一致。

使用lsof命令排查

在linux环境下,一切皆文件。lsof(LiSt Open Files)是一个查看当前系统文件的工具。
linux里的文件被删除后,空间没有被释放是因为在Linux系统中,通过rm或者文件管理器删除文件将会从文件系统的目录结构上解除链接(unlink)。然而如果文件是被打开的(有一个进程正在使用),那么进程将仍然可以读取该文件,磁盘空间也一直被占用。

通过命令 lsof |grep deleted 可以查看到状态为deleted的文件,如下:

// 查看状态为deleted的文件
? lsof |grep deleted
// 查看结果
COMMAND     PID   TID     USER   FD      TYPE             DEVICE   SIZE/OFF       NODE   NAME
dbus-daem   456           dbus  txt       REG              253,1      441144     141672 /usr/bin/dbus-daemon (deleted)
...
node      11595 11733     root  txt       REG              253,1    29851602    1461079 /home/elk/kibana-5.5.1-linux-x86_64/node/bin/node (deleted)
node      11595 11733     root    1w      REG              253,1 11374904415    1059873 /home/elk/kibana-5.5.1-linux-x86_64/nohup.out (deleted)
node      11595 11733     root    2w      REG              253,1 11374904415    1059873 /home/elk/kibana-5.5.1-linux-x86_64/nohup.out (deleted)
async_17  24113 24210 rabbitmq    1w      REG              253,1  8556707104     659069 /var/log/rabbitmq/startup_log (deleted)
async_18  24113 24211 rabbitmq    1w      REG              253,1  8556707104     659069 /var/log/rabbitmq/startup_log (deleted)
async_19  24113 24212 rabbitmq    1w      REG              253,1  8556707104     659069 /var/log/rabbitmq/startup_log (deleted)
async_20  24113 24213 rabbitmq    1w      REG              253,1  8556707104     659069 /var/log/rabbitmq/startup_log (deleted)
...

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

  • COMMAND:进程的名称
  • PID:进程标识符
  • USER:进程所有者
  • FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等 TYPE:文件类型,如DIR、REG等
  • DEVICE:指定磁盘的名称
  • SIZE:文件的大小(单位Byte
  • NODE:索引节点(文件在磁盘上的标识)
  • NAME:打开文件的名称

释放文件进程

释放文件的方法主要有两种:

  • kill掉相应的进程(根据PID直接kill进程)
  • 停掉使用这个文件的应用,让os自己主动回收磁盘空间

我这个环境已经不需要这些文件,所以直接停掉进程,生产环境中要谨慎排查。再次查看空间,文件已释放:

Tips:
当linux打开一个文件的时候,Linux内核会为每个进程在/proc/ 『/proc/nnnn/fd/文件夹(nnnn为pid)』建立一个以其PID为名的文件夹用来保存进程的相关信息,而其子文件夹fd保存的是该进程打开的全部文件的FD(File Descriptor)。
这是一项高级技术,仅到管理员确定不会对执行中的进程造成影响时使用。应用程序对这样的方式支持的并不好,当一个正在使用的文件被截断可能会引发不可预知的问题

参考资料

博客来源:
作者:Avery_up
链接:https://www.jianshu.com/p/3164d1a53e34
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

原文地址:https://www.cnblogs.com/Small-sunshine/p/11133460.html

时间: 2024-10-10 04:46:40

Linux 系统磁盘空间占满,df 和 du 结果不一致的相关文章

记一次Linux磁盘空间占满无法删除的故障

问题介绍 近日发现公司服务器的磁盘空间越来越满,感觉快要爆掉的感觉,于是开始着手清清磁盘空间,但是找来找去,发现根目录已经使用了90%以上,可是/下的目录占的空间都非常小,始终找不到占满磁盘空间的大头在哪里. 思考解决方案 按照网上的说法,是因为文件已经删除,但是使用文件的进程还存在,导致空间无法释放.运行如下命令后(最终无效). lsof | grep deleted | awk '{print $2}' | xargs kill -9 因为系统有单独挂载的文件夹,所以想把系统分区还原成还没挂

No space left on device 解决Linux系统磁盘空间满的办法

由于当初安装系统时设计不合理,有些分区分的过小,以及网络通讯故障等造成日志文件迅速增长等其他原因都可能表现为磁盘空间满,造成无法读写磁盘,应用程序无法执行等. (以/home空间满为例): 1. 定期对重要文件系统扫描,并作对比,分析那些文件经常读写 #ls –lR /home >;files.txt #diff filesold.txt files.txt 通过分析预测空间的增长情况,同时可以考虑对不经常读写文件进行压缩,以减少占用空间. 2. 查看空间满的文件系统的inodes消耗 #df

Linux磁盘空间占满故障处理

Linux磁盘占满 当磁盘被某大文件占满时,而且此大文件正在被某些进程读写并占用着,此时无法删除和置空此文件,只能先找到占用大文件的进程,然后终止进程,最后置空此文件. 实例如下:在/boot分区中创建大文件test,将boot分区的磁盘占满,通过另外一个终端进入主机,vim编辑此test文件,模拟大文件被vim进程占用,然后删除和清空此test文件. 终端1 [[email protected] ~]# df -h  /boot/                                

从Linux系统磁盘空间不足引发的Zabbix服务器数据库迁移

之前一直没有去关心Zabbbix服务器存储空间问题,最近Zabbix报警提示/根目录磁盘空间不足,于是登录Zabbix看了一下,发现根目录只有1.3MB了,这怎么办了?第一个想到的是扩展根目录,结果发现不是用的LVM,采用的是标准的,心想也还可以救,就和Windows一样将D盘.E盘删除,再将D盘的空间扩展给C盘就OK啊,于是开始着手操作(注意提前备份虚拟机,最好做一个快照,出问题了好恢复) [[email protected] /]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /

Linux 系统(Centos版本)磁盘空间占满的解决办法。

这两天 ,服务器借给了朋友 搭建  三端合一的 游戏,结果没弄成. 还给我服务器的时候,卧槽!!! ,40G的硬盘,使用率 百分百,这是放种子了??? 算了 ,自己借出去的服务器,含着泪也要修好. 本来是准备重装系统 搞定的.想想,服务器用的久了,服务器的内容也多了,一个SVN版本控制器的内容,就让你舍不得重装了. 还是查查资料,想想其他办法吧. 解决开始: 先命令查一查磁盘,使用率吧.别是宝塔面板的问题.那也不是不可能. 1 [[email protected] /]# df -l 2 文件系

磁盘空间占满inode结点没用完 并删除了文件但是释放不了

lsof  |grep delete lsof(list system open file )可显示系统打开的文件,以root身份运行. 很多时候文件正在被占用,即使删除了,也无法释放空间,只有停 了进程 才能释放空间!! l [[email protected]]# lsof |grep delete zabbix_ag 1154 zabbix 1w REG 202,1 1732 3580 /var/log/zabbix/zabbix_agentd.log-20160827 (deleted)

linux检查磁盘空间已满问题

2015-11-18 du -ch --max-depth=1 ./ [例子] [[email protected] ~]# du -ch --max-depth=1 / 4.0K /srv 27M /lib64 7.7G /swapadd 409M /dev 4.0K /cgroup 0 /misc 37M /etc 4.0K /media 4.0K /.pulse 0 /sys du: cannot access `/proc/46542/task/46542/fd/4': No such

linux CentOS7 磁盘分区fdisk 、df 、du、parted 命令实例

一. df命令 分区查看工具: 1. df [[email protected]_46_188_centos ~]$ df Filesystem     1K-blocks    Used Available Use% Mounted on /dev/vda1       20510332 4844740  14617076  25% / devtmpfs          499348       0    499348   0% /dev tmpfs             508452  

linux 查看磁盘空间

linux 查看磁盘空间大小命令 df :命令是linux系统以磁盘分区为单位查看文件系统,可以加上参数查看磁盘剩余空间信息 df -hl:查看磁盘剩余空间信息,显示如下: 文件系统         容量     已用    可用    已用%     挂载点 Filesystem      Size     Used    Avail   Use%     Mounted on /dev/vda1       50G      43G      3.7G   93%       //dev/h