因磁盘空间不足导致线上问题的解决办法

一、磁盘分区空间使用率达到 100 %

可以通过清理占用磁盘空间较大的文件或目录、扩容磁盘或新购磁盘等几种方式来解决磁盘分区空间使用率达到 100 %的问题,具体步骤如下:

清理占用磁盘空间较大的文件或目录
  1. 远程连接 ECS 服务器
  2. 执行以下命令,查看磁盘使用率
df -h

centos 增加的硬盘空间没有扩容_数据


3. 执行以下命令,进入根目录,查看哪个目录占用磁盘空间比较大

cd /
du -sh *

系统显示如下图所示,根据示例 /opt 和 /usr 目录占用较大,则需要继续查看 /opt 和 /usr 目录下哪个文件或目录占用空间较大,根据实际情况进行操作。

centos 增加的硬盘空间没有扩容_centos 增加的硬盘空间没有扩容_02


4. 执行以下命令,逐级查看哪个目录占用空间较大,例如本例中进入较大的 /usr 目录,继续查看 /usr 目录下哪个文件或目录较大

cd /usr
du -sh *

系统显示如下图所示,根据示例 /local 目录占用较大,则需要继续查看 /local 目录下哪个文件或目录占用空间较大,以此类推。

centos 增加的硬盘空间没有扩容_服务器_03

  1. 结合业务情况判断,删除不再使用的文件或目录。
扩容磁盘或新购磁盘

如果您无法通过清理文件释放更多空间,可以考虑通过扩容磁盘或者新购磁盘的方式来解决。

二、磁盘分区 Inode 使用率达到 100 %

磁盘分区 Inode 使用率达到 100 %会造成应用无法继续新建目录或文件,此时通常系统对应的磁盘空间还未用满,Inode 用满也是平时容易忽略的点。可以通过清除 Inode 占用高的文件或目录、或者增加 Inode 数量来解决磁盘分区 Inode 使用率达到 100 % 的问题。

说明:Linux的 Inode 节点中记录了文件的类型、大小、权限、所有者、文件连接的数目、创建时间和更新时间等重要信息,以及指向数据块的指针信息。一般情况下不需要修改 Inode 配置,如果存放文件较多导致 Inode 容量占满,就需要进行修改。

查询 Inode 使用率
  1. 连接 ECS 服务器
  2. 执行以下命令,查看 Inode 使用率
df -i

centos 增加的硬盘空间没有扩容_数据_04


3. 如果 Inode 使用率达到或接近 100 % ,可以通过以下两种方式进行处理:

  • 清除 Inode 占用高的文件或目录
  • 修改 Inode 数量
清除 Inode 占用高的文件或目录

如果不方便格式化磁盘以增加 Inode 数量,可以参考以下步骤,清理 Inode 占用量高的文件或目录

  1. 执行以下命令,分析根目录下的每个二级目录下有多少个文件
for i in /*; do echo $i; find $i | wc -l; done

系统显示如下图所示,根据示例可以看出 /etc 目录下文件数最多,则需要继续查看 /usr 目录下哪个目录的文件数最多,文件数越多说明 Inode 占用越高,请根据实际情况进行操作。

centos 增加的硬盘空间没有扩容_磁盘分区_05


2. 逐层进入 Inode 占用最高的目录,继续执行上述命令,逐步定位占用过高空间的文件或目录,最后进行相应的清理。

增加 Inode 数量

如果不允许清理磁盘中的文件,或者清理完可清理的文件后 Inode 使用率仍然较高,则需要通过备份数据,重新格式化磁盘增加 Inode 数,拷回数据等步骤 ,完成数据的保留并增加文件系统 Inode 数量。

警告: Inode 数量的调整需要重新格式化磁盘,磁盘内的数据需要被删除,请确保数据已经得到有效备份,再进行以下操作。您可以自行拷贝文件,也可以通过快照方式,进行数据备份。Inode 数量的调整需要卸载文件系统,这可能导致应用系统中断,需要选择合适的业务时间进行操作。

  1. 执行以下命令,卸载文件系统

本示例以卸载 /home 为例,请根据实际情况进行卸载。

umount /home
  1. 执行以下命令,重新建立文件系统,增加 Inode 节点数。

本示例以磁盘分区为 /dev/xvdb 、文件系统类型为 ext3 、Inode节点数为 1638400 为例,请根据实际情况进行修改

mkfs.ext3 /dev/xvdb -N 1638400

说明: Linux 的Inode 数量通常是根据磁盘容量大小生成的,一般是 1: 16KB 比例,以 40GB 云盘为例,其 Inode 节点数通常为 2621440,其支持的最大值为 2 ^ 32 (大约 43 亿),可以通过实际云盘的大小,乘以一定的放大系数,例如( 1.2 ),为业务选择合适的 Inode 值。

  1. 执行以下命令,重新挂载目录。

本示例按照 /etc/fstab 配置将已卸载的目录重新挂载。请根据实际情况操作。

mount -a
  1. 执行以下命令,查看并确认修改后的 Inode 节点数。
dumpe2fs -h /dev/xvdb | grep node

系统显示类似以下信息,表示 Inode 数调整成功,可以接着拷回备份数据,恢复相关应用。

centos 增加的硬盘空间没有扩容_centos 增加的硬盘空间没有扩容_06

三、存在僵尸文件

如果磁盘分区容量和Inode容量都没有问题,可能是系统中存在大量文件已被删除(显示为 deleted ) 但是仍被系统内进程占用,系统无法释放磁盘空间,且这部分文件已经被标记为删除,通过 df 或 du 命令无法统计到。如果僵尸文件过多,会占用较大的磁盘空间。可以参考以下步骤查看并删除僵尸文件。

  1. 远程连接 ECS 服务器
  2. 如果系统没有预转 lsof 选择以下合适的命令,安装 lsof
  • Alibaba Cloud Linux、CentOS等系统
yum install -y lsof
  • Debian、Ubuntu等系统
apt-get install -y lsof
  1. 执行以下命令,查看僵尸文件占用情况
lsof | grep delete | sort -k7 -rn | more

系统显示类似以下信息,其中第七列为对应文件大小(单位为 Byte ),可以将第七列值累加起来看总文件大小和非预期的磁盘使用空间是否接近,接近即为僵尸文件占用了磁盘空间。

centos 增加的硬盘空间没有扩容_centos 增加的硬盘空间没有扩容_07

  1. 通过以下两种方式释放句柄,清除僵尸文件,释放磁盘空间。
  • 重启服务器清除
    重启服务器,系统会退出现有进程,释放调用的 deleted 文件的句柄
    重要:重启服务器,可能会影响业务,需要选择合适的时间进行重启
  • 通过 Kill 命令清除
    根据lsof命令列出的PID进程号(通常为第二列),使用kill命令结束占用这些文件的服务进程。
  1. 执行以下命令,列出 PID 进程号
lsof |grep delete
  1. 根据业务情况,确保对应进程可以停止或者重启,执行以下命令,停止占用这些文件的服务进程。
kill <进程号>

重要:如果服务器正在运行业务,可能会影响到业务,请慎重操作。

四、挂载点覆盖

如果排除了上面三个问题,还未找到非预期的磁盘空间使用,可能得原因是挂载点覆盖,可以使用下述方法进行确认。

如下图所示案例,您可以看到30 GB的系统盘/dev/vda1使用率已经到了95%,通过du可以看到,主要是/home目录占用了24 GB空间。

centos 增加的硬盘空间没有扩容_磁盘分区_08

但当我们把 /dev/vdb1 挂载到/home目录后,如下图所示,可以看到系统盘/dev/vda1使用率还是95%,整个根分区下最大的目录仅有/usr占用超过1 GB,无法找到具体哪个目录占用高,/home目录统计到的使用空间仅为20 KB,不是此前看到的24 GB空间占用,此现象即为挂载点覆盖。

centos 增加的硬盘空间没有扩容_数据_09

解决挂载点覆盖的问题,通常通过先取消磁盘分区挂载,再检查原挂载目录下的空间占用情况。

警告:分区卸载可能会导致您的应用服务中断,请选择您业务合适的时间进行。

阿里云帮助文档