ECS Linux 磁盘空间管理

本文简要介绍云服务器 ECS Linux 服务器磁盘空间遇到的常见问题及解决办法。

磁盘空间满(含 inode 满)问题处理方法

问题现象

在云服务器 ECS Linux 系统内创建文件时,出现类似如下空间不足提示:

  1. No space left on device …

问题分析

导致该问题的可能原因包括:

  •   磁盘分区空间使用率达到百分之百。
  •   磁盘分区 inode 使用率达到百分之百。
  •    僵尸文件:已删除文件因句柄被占用未释放导致相应空间未释放。

处理办法

要解决该问题,根据不同的问题原因,建议分别通过如下方式进行处理:


分区容量满的处理

登录服务器,使用 df -h查看磁盘使用率,其中的 mounted on指的是挂载的目录:

 

循环执行如下指令,看下哪个目录大,进入该目录,直到找到最精确的的文件或目录:

  1. cd /du -sh *

 

最后,结合业务情况等判断对相关文件或目录进行删除,或者购买更大的数据盘来分担处理。

inode 容量满的处理

登录服务器,运行下面的命令分析根目录下每个目录下面有多少个文件:

  1. for i in /*; do echo $i; find $i | wc -l; done

 

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

修改 inode 数量

ECS Linux 的 inode节点中,记录了文件的类型、大小、权限、所有者、文件连接的数目、创建时间与更新时间等重要的信息,还有一个比较重要的内容就是指向数据块的指针。一般情况不需要特殊配置,如果存放文件很多,需要配置。有时磁盘空间有剩余但是不能存放文件,可能是由于 inode 耗尽所致。df -i 可以查询 inode 的使用情况:

 

可以参阅如下步骤调整 inode 节点数量:

注:inode 的调整需要重新格式化磁盘,请确保数据已经得到有效备份后再进行下述操作。

1、卸载系统文件。比如:

  1. umount /home

2、重新建立文件系统,指定 inode 节点数:

  1. mkfs.ext3 /dev/xvdb -N 1638400

3、修改 fstab 文件:

  1. vim /etc/fstab

4、查看修改后的 inode 节点数:

  1. dumpe2fs -h /dev/xvdb | grep node

 

僵尸文件分析与删除

如果磁盘和 inode 都没有问题,则需要查看是否存在未被清除句柄的僵死文件。这些文件实际上已经被删除,但是有服务程序在使用这些文件,导致这些文件一直被占用,无法释放磁盘空间,使用如下命令可以查看死文件占用情况:

  1. lsof |grep delete | more

如果这些文件过多,会占用很大的磁盘空间。可以通过如下方法来释放句柄,以清除僵尸文件:

  • 重启服务器。
  • 正常停止或杀掉占用这些文件的服务进程。

使用 df 和 du 查看磁盘空间大小不一致

问题现象

云服务器 ECS Linux 服务器,使用 df -h 查看文件系统使用率,可以看到 /dev/xvdb1 磁盘占用了约 27G,挂载目录为 /opt。

 

但进入到 opt 目录中执行 du -sh ,显示空间总占用量约 2.4G,和 du 查看到的结果不一致。

 

问题分析

  1. du - estimate file space usage

du 命令会对统计文件逐个调用 fstat 这个系统调用,获取文件大小。它的数据是基于文件获取,可以跨多个分区操作。

  1. df - report file system disk space usage

而 df 命令使用 statfs 这个系统调用,直接读取分区的超级块信息获取分区使用情况。它的数据基于分区元数据,只能针对整个分区。

导致这个两个命令查看磁盘容量不一致的原因是,用户删除了大量的文件被删除后,在文件系统目录中已经不可见了,所以 du 就不会再统计它。然而如果此时还有运行的进程持有这个已经被删除的文件句柄,那么这个文件就不会真正在磁盘中被删除,分区超级块中的信息也就不会更改,df 仍会统计这个被删除的文件。

处理办法

可通过 lsof 命令查询处于 deleted 状态的文件。被删除的文件在系统中被标记为deleted。如果系统有大量 deleted 状态的文件,会导致 du 和 df 统计结果不一致。    

  1. lsof |grep deleted //在opt目录下执行lsof |grep deleted

 

然后,通过如下方法处理:

1、根据 lsof 列出的 pid 直接 kill 相应进程或者重启对应的服务。示例:

  1. kill -9 692

注:如果服务器正在运行业务,kill 会导致进程直接终止,可能会影响到业务,请慎重操作。

2、重启服务器验证效果:

重启服务器系统会退出现有的进程,开机后重新加载。该过程会释放调用的 deleted 文件的句柄。

通过 df 查看磁盘空间为负数

问题现象

使用云服务器 ECS Linux 服务器时,有时通过 df -h 命令查看磁盘使用情况是显示负值,如下图:

 

问题分析

Linux 系统磁盘分区有保留区的概念,会给 root 或指定用户预留 5% 或更大的空间,当使用到这块保留区的空间时,fdisk 的计算将会是负数。

处理办法

需要通过 rm 命令清理删除磁盘中的大文件,释放预留空间的占用后,再通过 df 查询磁盘占用即可恢复正常

猜你喜欢

转载自www.cnblogs.com/newfish124/p/9172291.html