AWS EC2实例磁盘空间占用异常,未找到大文件如何定位占用原因
EC2 Linux实例存储空间占用异常排查方案
基础校验
- 首先确认执行扫描命令时使用root权限,普通用户无法访问/root、/var等受限目录,会导致扫描结果遗漏。
- 你此前使用的大文件查找命令存在语法缺失,末尾缺少转义分号会导致命令执行不完整,建议执行修正后的命令重新扫描:
find / -type f -size +10M -exec ls -lh {} \;
高发问题排查
1. 已删除但仍被进程占用的文件
这是此类问题最常见的诱因:文件被手动删除后,如果仍有运行中的进程持有该文件的句柄,系统不会真正释放对应的存储空间,且这类文件不会出现在常规文件树扫描结果中。
- 排查命令:
lsof | grep deleted - 处理方式:返回结果会列出所有已删除但仍被进程占用的文件及对应进程ID,确认文件可释放后重启对应进程即可收回空间,也可直接重启实例完成批量清理。
2. 挂载点遮挡的隐藏文件
如果你为实例挂载了额外的EBS卷,可能出现挂载操作覆盖原有目录文件的情况:例如未挂载EBS时向/data目录写入了大量文件,之后将EBS卷挂载到/data路径,原有/data下的文件会被新挂载的卷遮挡,常规扫描只会读取挂载卷的内容,无法统计到被遮挡的文件占用。
- 排查方法:执行
mount --bind / /mnt将根目录绑定到/mnt路径,此时访问/mnt下的路径会绕过所有挂载点,直接读取底层根分区的内容。执行du -sh /mnt/*逐层排查各目录大小,即可找到被遮挡的隐藏文件。
3. 小文件聚合占用
你当前仅扫描了10M以上的大文件,如果存在百万级别的KB级小文件,聚合后也会占用大量存储空间,这类场景需要逐层统计目录大小定位:
- 逐层统计命令:
du -xh --max-depth=1 / - 参数说明:
-x会限定仅统计当前根分区的内容,避免扫描到其他挂载的存储卷。从根目录开始逐层进入占用高的子目录重复执行上述命令,即可定位到占用空间的目录。 - 额外校验:执行
df -i查看inode使用率,如果inode占满也会出现无法写入文件的异常,即使存储空间显示有剩余。
其他场景排查
1. 文件系统未扩容
如果你是先创建了小容量根卷,之后在AWS控制台扩容EBS卷到20G,但未执行文件系统扩容操作,实例实际可用存储空间依然是扩容前的大小:
- 先执行
df -h确认根分区总容量是否为预期的20G - 若总容量低于20G,ext4文件系统执行
resize2fs /dev/xvda1(将设备名替换为实际根盘设备名,可通过lsblk查询),xfs文件系统执行xfs_growfs /完成扩容。
2. 特殊服务占用
- 如果使用了Docker等容器运行时,执行
docker system df查看容器、镜像、卷占用的存储空间,确认是否有未清理的废弃镜像、容器日志占用空间。 - 执行
du -sh /var/log检查系统日志、服务日志占用,大量未轮转的日志文件也可能占用大量空间。
内容的提问来源于stack exchange,提问作者Amal Masri
相关产品推荐
相关产品推荐

