处理Linux云服务器磁盘空间不足的方法
操作场景
在Linux实例上运行的应用服务会随着持续运行不断产生和积累数据,占用磁盘空间。由于实例的磁盘容量有限,长期运行后可能导致存储资源逐渐耗尽。当磁盘空间不足甚至满载时,系统将无法进行文件写入操作,这不仅会影响应用的正常运行,还可能引发服务中断或系统异常。因此,及时监控磁盘使用情况并采取有效的清理措施,对保障服务的稳定性和可靠性至关重要。本文介绍判断磁盘空间不足的方法及其相应的解决方案。本文以“CentOS”操作系统为例,不同操作系统的操作可能不同,本文仅供参考,具体操作步骤和差异请参考对应操作系统的产品文档。
问题现象
当在Linux系统的云服务器ECS实例中创建文件或运行应用程序时,若出现“No space left on device”错误,表明实例的磁盘存储空间已耗尽。此时,您需排查导致磁盘空间不足的原因,并根据具体情况采取相应措施以解决磁盘不足的问题。
可能原因
磁盘空间不足的问题通常有以下几类原因:
- 磁盘分区空间使用率达到100%
- 磁盘分区Inode使用率达到100%
- 存在僵尸进程
已删除的文件可能由于在删除之前其文件句柄处于打开状态,从而导致在文件删除时未能释放文件空间。
- 挂载点被覆盖
如果原有文件系统的目录下已经存在大量文件,在该挂载点(目录)挂载新设备后,原挂载点将被覆盖。然而,您系统内的应用可能仍会继续对原有文件系统空间进行读写操作,此时可能会出现您的应用报告空间不足的情况,然而在使用df或du命令查看磁盘文件目录的容量使用情况时却无法反映出这一点。这是因为df或du命令统计的是当前挂载点所对应的分区的使用情况
磁盘分区空间使用率达到100%
当磁盘分区空间使用率达到100%时,可能会出现“No space left on device”错误提示。建议检查磁盘的当前使用率,并识别高占用的文件进行删除或者扩容云硬盘容量来解决磁盘空间使用率不足。
磁盘的当前使用率查看方式请参考以下命令。
- 查看磁盘使用率。
df -h
[test@ecs-test-0001 ~]# df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 485M 0 485M 0% /dev tmpfs 496M 0 496M 0% /dev/shm tmpfs 496M 6.8M 489M 2% /run tmpfs 496M 0 496M 0% /sys/fs/cgroup /dev/vda1 9.8G 2.9G 6.4G 31% / tmpfs 108M 0 108M 0% /run/user/0 /dev/vdb1 9.8G 9.8G 0 100% /data-test
示例中分区“/dev/vdb1”的使用率达到100%。
- 进入根目录,查看哪个目录占用磁盘空间较大。
sudo du -sh /* | sort -rh | head -n 10
[test@ecs-test-0001 ~]# sudo du -sh /* | sort -rh | head -n 18 du: cannot access '/proc/1781B/task/1781B/?d/4': No such file or directory du: cannot access '/proc/1781B/task/1781B/?dinfo/4': No such file or directory du: cannot access '/proc/1781B/?d/4': No such file or directory du: cannot access '/proc/1781B/?dinfo/4': No such file or directory 6G /home 2.1G /usr 413M /var 225M /CloudrResetPwdAgent 137M /boot 36M /etc 6.8M /run 944K /tmp 144K /root 28K /data-test
示例中/home目录占用空间最大,可以考虑清理该目录下的文件。
- 进入较大的 /home目录,继续查看/home目录下哪个文件或目录较大。以此类推,找到占用率高的大文件。
sudo du -sh /home/* | sort -rh | head -n 10
磁盘分区Inode使用率达到100%
磁盘分区的Inode(索引节点)是文件系统中用于存储文件元数据的数据结构,每个文件或目录都对应一个唯一的Inode。Inode记录了文件的权限、所有者、大小、创建时间、修改时间以及数据块的位置等关键信息,但不包含文件名。文件名存储在目录的条目中,通过指向Inode的链接来关联实际文件。由于Inode数量在格式化磁盘时固定分配,当Inode耗尽时,即使磁盘仍有剩余空间,也无法创建新文件。因此当Inode使用率达到或者接近100%,可以清理不必要的文件来释放Inode数量。
- 分析根目录下的每个二级目录有多少个文件。
for i in /*; do echo $i; sudo find $i | wc -l; done
[test@ecs-test-0001 ~]# for i in /*; do echo $i; sudo find $i | wc -l; done /bin 1 /boot 331 /CloudrResetPwdAgent 198 /data-test 2 /dev 346 /etc 2433 /home 5 /lib 1 /lib64 1 /lost+found 1
示例中文件数量多的目录代表Inode占用数高,比如/etc目录有2433个文件,您可以根据情况进行文件删除。
- 以此类推,继续查看子目录文件数量,根据情况进行文件删除.
for i in /etc/*; do echo $i; sudo find $i | wc -l; done
存在僵尸进程
如果一个文件在被某个或某些进程打开的状态下被删除了,那么这个文件的磁盘空间实际上并没有立即释放。即使文件已经从文件系统的目录结构中消失,只要还有进程保持着对该文件的引用(即文件描述符),该文件的实际数据就不会被删除,直到所有引用该文件的进程关闭它或者结束运行。
- 安装lsof。
sudo yum install -y lsof
- 查看已删除但仍被进程占用的文件。
sudo lsof | grep delete | sort -k7 -rn | more
[test@ecs-test-0001 ~]# lsof | grep delete | sort -k7 -rn | more tail 619544 root 3r REG 253,1 500000000 136507 /home/test_file (deleted)
示例中文件大小为500000000Byte,您可以根据实际情况判断是否僵尸进程占用空间过大。
释放空间有两种方式:
- 重启服务器可以结束所有进程,从而释放磁盘空间。但是重启服务器可能会影响业务,请谨慎操作。
- 通过kill命令清除,操作方式参见3。
- 使用kill命令关闭进程。
挂载点被覆盖
在排除了以上常见原因后,若仍无法定位磁盘空间不足的问题,可能是因为目录挂载点被覆盖所致。例如,在已有数据的目录上挂载了新的文件系统,会导致原有数据被隐藏,但其占用的空间依然存在,从而造成磁盘空间“凭空消失”的现象。您可以通过以下方法进行排查和确认,以识别是否存在此类情况。
- 查看挂载信息。
mount
[test@ecs-test-0001 ~]# mount sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime) proc on /proc type proc (rw,nosuid,nodev,noexec,relatime) devtmpfs on /dev type devtmpfs (rw,nosuid,size=496616k,nr_inodes=124154,mode=755) securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime) debugfs on /sys/kernel/debug type debugfs (rw,relatime) tmpfs on /run/user/0 type tmpfs (rw,nosuid,nodev,relatime,size=101412k,mode=700) binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,relatime) /dev/vdb1 on /data-test type ext4 (rw,relatime,data=ordered) /dev/vdc on /data-test type ext4 (rw,relatime,data=ordered)
示例中存在两个设备挂载到了/data-test目录下,所以该目录可能存在挂载点覆盖。
- 查看当前分区挂载信息。
df -h
[test@ecs-test-0001 ~]# df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 485M 0 485M 0% /dev tmpfs 496M 0 496M 0% /dev/shm tmpfs 496M 13M 483M 3% /run tmpfs 496M 0 496M 0% /sys/fs/cgroup /dev/vda1 9.8G 3.2G 6.1G 34% / tmpfs 100M 0 100M 0% /run/user/0 /dev/vdb1 9.8G 37M 9.2G 1% /data-test
- 您可以通过umount 命令卸载文件系统来取消磁盘分区挂载。
例如卸载本示例中的/dev/vdc:sudo umount /mnt/vdc
卸载文件系统,可能会导致您的应用服务中断,请选择您业务合适的时间进行。