处理Linux磁盘空间满问题

对于 Linux 磁盘满的问题,
我们通常的处理思路是用 du 查找可清理的大文件,
然后临时删掉让磁盘使用率先降下来,从而尽快保证磁盘能继续写入。

但是,有一些情况的处理效果不太一样,
du/df 呈现的结果可能还会让人迷惑不解。

下面,我就分享下几个工作中遇到过的较离奇的磁盘满问题。

一、被忽略的隐藏文件

1、认识 swapfile

Linux 的交换文件 swapfile 的产生场景较普遍,而且也是以隐藏文件的形式存在的,
因此这里主要聊聊 swapfile 这一类的隐藏文件。

当用 vim 打开一个文件时,都会产生一个 .swp 的临时隐藏交换文件,用来备份缓冲区中的内容。

当文件非正常关闭(比如直接关闭终端或者电脑断电等)时,.swp文件不会被删除,这样就可以用此文件来恢复文件。(注意当正常关闭时,此文件会被删除;且如果只是读取文件,不会产生 .swp 文件)

而且,如果 vim 意外退出后,又重新打开文件二次编辑,
那么旧的 .swp 文件会继续保留,并产生新的 .swo 临时隐藏文件。

如果二次编辑的时候,vim 又异常退出了,
那么还会继续产生新的临时隐藏文件.swn、.swm、 .swl …

2、处理建议

有些隐藏文件的磁盘占用也挺大:

ll -rth | grep G
total 17.7G
-rw------- 1 xxxx users 17.6G 2020-02-12 18:27 .sqlkfJTFl.swp

所以有时候碰到大隐藏文件导致磁盘满的情况,如果没能发现这些隐藏文件,就会觉得离奇和疑惑。

所以在排查磁盘满问题的时候,
可以通过执行 vim -r 来查看和检查下所有临时交换文件的大小;
或者通过 ls -lha 把所有隐藏文件都列出来看看大小。

更粗暴地,
如果不想留 swapfile 这个特性,可以考虑关掉 swapfile :

vim /etc/vimrc
# 添加如下配置
set noswapfile     # 禁止在编辑时候产生此文件;

但是注意这仅限于对文件损失可以容忍的情况下;
如果不能容忍文件损失,那还是建议还是打开 swapfile:

vim /etc/vimrc
# 添加如下配置
set swapfile      # 则是在编辑时候产生此文件;

二、未释放的已删除文件

1、du 和 df 不一致

如果隐藏文件因素排除了,
还是发现 du 出来的大小诡异,
比如 du 发现磁盘并没有用满,但是 df 看到磁盘使用率却是 100% 。

这又会是什么原因呢?

这时候,通常就得怀疑有一些已删除的文件,还被一些进程 hold 住句柄没释放,
导致这些文件虽然已经删除,也的确看不到了,但是却还占着磁盘空间;
从而导致 du 和 df 出来的磁盘使用结果不一致的情况。

2、处理建议

通过执行 lsof | grep deleted 可以找到那些没有释放磁盘空间的文件和进程,
然后通过重启对应进程,就可以达到释放已删除文件占用的空间的目的。

另外,对于这种情况,还有个错误的处理方法,这里特别提醒下:
有些同学在找到未释放已删除文件的 pid 之后,
可能会直接通过 kill pid 来达到释放已删除文件的目的。
这种做法确实能够释放已删除文件,从而释放磁盘空间,
但是这种做法是有副作用的,危害可大可小。

如果在离线环境这么操作,影响一般不大;
但是如果在生产环境这么操作的话,那就可能搞出故障来了。

我们假设这么一种场景:
生产环境的某程序由于某种bug,一直不会释放日志文件,
而分时写入的日志文件又是有过期删除机制的,
这样一直持续下去,
就会发现服务器上有大量的已过期删除日志文件还占用着磁盘空间,直到产生磁盘满风险。

那么这个时候如果直接通过 kill pid 来处理的话,就直接把生产环境的在线程序直接干掉了;
这个后果就可想而知了:在这个程序被守护进程拉起来之前,这个服务都是不可用的。

三、挂载引发的悬案

1、消失的空间

如果执行 ls -lha 并没有发现大隐藏文件,
执行 lsof | grep deleted 也没有发现未释放的已删除文件;

但是 df 看到根目录确实达到 100% 了 ,
而 du 出来的根目录实际使用空间却并没有用满 。

这又会是什么原因呢?

出现这种情况的时候,
请回忆下最近这台磁盘异常的机器,是否检修 或者 换过磁盘?

根目录出现这种离奇现象,
通常就是在检修/更换磁盘的时候(这里假设是更换/data1 ),
新磁盘还没挂载就开始往 /data1 写数据了,
这时候由于还没挂载新盘,所以写入数据占用的是根目录的空间。

然后换好/data1 盘并重新挂载上去后,
原本放在 /data1 的数据,也不会出现在挂载盘上,还是继续占用根目录的空间。

所以这时候就会出现这样的现象:
挂载后 du /data1 并不大 ,
但是挂载前 /data1目录写入的数据实际却占用了根目录空间;
而且这个数据在挂载后是看不到的,因此很难发现。

于是就会发现根目录有一些空间似乎凭空消失了,相当诡异。

2、处理建议

2.1 解决方法
怎么确认是新的挂载盘掩盖了一些数据呢?

把新的挂载盘 /data1 umount掉,然后再看看 /data1 占用的空间就知道了。

如果 umount提示 busy:
可以通过执行

fuser -kmvi /data1 && umount /data1
1
解决。

卸载后,就会发现 /data1 目录下确实有大量文件,
删除后,再 mount -a 重新挂载,
然后根目录消失的磁盘空间,一般就能找回来了。

2.2 测试验证
如果还不放心的话,清理完数据再次挂载后,可以简单测试下:
通过

dd if=/dev/zero of=/data1 bs=1M count=20000

往 /data1 大概写个 20G 数据,
再观察下根目录的空间是否受影响,

如果不受影响就说明问题解决!

2.3 给个建议
针对根目录这类离奇问题:
建议在每次更换磁盘重新做挂载动作之前,检查一下根目录的空间使用情况;
如果存在错误写入数据的情况,需要及时清理,然后再进行新盘挂载,切记。

原文地址:https://www.cnblogs.com/Linux-guowen/p/12580527.html

时间: 2024-08-25 06:35:53

处理Linux磁盘空间满问题的相关文章

云服务器 ECS Linux 磁盘空间满(含 innode 满)问题排查方法

问题描述 在云服务器 ECS Linux 系统内创建文件时,出现类似如下空间不足提示: No space left on device … 问题原因 导致该问题的可能原因包括: 磁盘分区空间使用率达到百分之百. 磁盘分区 inode 使用率达到百分之百. 僵尸文件:已删除文件因句柄被占用未释放导致相应空间未释放. 处理办法 要解决该问题,建议通过如下方式处理: 分区容量满 inode 容量满 修改 inode 数量 僵尸文件分析删除 分区容量满 登陆 SSH,使用 df -h 查看使用率,mou

linux磁盘空间用满的处理方法

linux下空间满可能有两种情况 可以通过命令 df -h  查看磁盘空间占用,实际上是查看磁盘块占用的文件(block) df -i  查看索引节点的占用(Inodes) 磁盘块和索引节点其中之一满,都会导致无法创建文件,提示磁盘空间已满. 所以请注意,查看磁盘还有空间,但是创建文件提示空间满,可能是inodes节点已满 通过命令:find / -size +100M |xargs ls -lh 列出系统内大于100M的文件 du -h --max-depth=1 查看当前目录内文件夹的大小

linux磁盘空间用满的处理方法说明

linux下空间满可能有两种情况 可以通过命令 df -h  查看磁盘空间占用,实际上是查看磁盘块占用的文件(block) df -ih  查看索引节点的占用(Inodes) 一.面对磁盘满了,通过下列命令找出没有用的大文件删除,接口 磁盘块和索引节点其中之一满,都会导致无法创建文件,提示磁盘空间已满. 所以请注意,查看磁盘还有空间,但是创建文件提示空间满,可能是inodes节点已满 1.通过命令:find / -size +100M |xargs ls -lh 列出系统内大于100M的文件 2

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磁盘空间使用问题

linux磁盘空间用满的处理方法 linux下空间满可能有两种情况 可以通过命令 df -h  查看磁盘空间占用,实际上是查看磁盘块占用的文件(block) df -i  查看索引节点的占用(Inodes) 磁盘块和索引节点其中之一满,都会导致无法创建文件,提示磁盘空间已满. 所以请注意,查看磁盘还有空间,但是创建文件提示空间满,可能是inodes节点已满 通过命令:find / -size +100M |xargs ls -lh 列出系统内大于100M的文件 du -h --max-depth

Linux磁盘空间被未知资源耗尽【转】

Linux磁盘空间被未知资源耗尽 在linux中,当我们使用rm在linux上删除了大文件,但是如果有进程打开了这个大文件,却没有关闭这个文件的句柄,那么linux内核还是不会释放这个文件的磁盘空间,最后造成磁盘空间占用100%,整个系统无法正常运行.这种情况下,通过df和du命令查找的磁盘空间,两者是无法匹配的,可能df显示磁盘100%,而du查找目录的磁盘容量占用却很小. 遇到这种情况,基本可以断定是某些大文件被某些程序占用了,并且这些大文件已经被删除了,但是对应的文件句柄没有被某些程序关闭

Linux 磁盘空间大小统计du命令常见用法

在 Linux下,可以对某个文件或文件夹所占空间大小进行统计,这里将一些常用用法汇总如下: 1.对指定文件或文件夹进行统计,缺省单位为kbyte(k或千字节),下例对文件夹testa进行统计: [[email protected] ~]$ du -s testa 1589308    testa 2.对文件夹统计的正确做法,如果想知道某个文件夹所占空间的大小,用什么命令?直接用du可以吗? 可以是可以,但是,它会将该文件夹底下所有目录都统计一遍,显然,这不是我们想要的.正确的做法是使用 -s操作

查看Linux磁盘空间大小

一.df 命令: df 是来自于coreutils 软件包,系统安装时,就自带的:我们通过这个命令可以查看磁盘的使用情况以及文件系统被挂载的位置: 举例: [[email protected] beinan]# df -lh Filesystem 容量 已用 可用 已用% 挂载点 /dev/hda8 11G 6.0G 4.4G 58% / /dev/shm 236M 0 236M 0% /dev/shm /dev/sda1 56G 22G 35G 39% /mnt/sda1 我们从中可以看到,系