
监控提示云服务器数据盘使用率超过 90%,登录后 df -h 显示几乎写满,但 du 汇总出来的目录大小却小得多;或者磁盘明明还有空间,写文件却报 No space left on device。这类问题通常落在三种原因上:真实大文件占用、inode 耗尽、文件已删除但进程仍持有句柄。下面按顺序排查。
df -hT # 空间使用率与文件系统类型
df -i # inode 使用率df -h 的 Use% 高:空间被占满,进入第二步。df -i 的 IUse% 高而空间有余:小文件过多导致 inode 耗尽,直接看第四步。# 只统计当前文件系统,避免跨挂载点;逐层下钻
du -xh --max-depth=1 / 2>/dev/null | sort -rh | head -15
du -xh --max-depth=1 /var 2>/dev/null | sort -rh | head -15-x 表示不跨文件系统,sort -rh 按人类可读大小倒序。常见元凶:
/var/log:应用日志未轮转、journal 日志膨胀。/var/lib/docker:镜像、容器可写层、容器 json 日志。查找单个大文件:
find / -xdev -type f -size +500M -exec ls -lh {} \; 2>/dev/null典型场景:直接 rm 了正在写入的日志文件,进程仍持有文件句柄,空间不会释放,du 看不到这些文件,df 却照常计入。
lsof +L1 # 列出链接数为 0(已删除)但仍打开的文件
lsof -nP | grep deleted | sort -k7 -n -r | head处理方式:
systemctl reload nginx),句柄关闭后空间自动释放。# <PID> 与 <FD> 取自 lsof 输出
: > /proc/<PID>/fd/<FD>注意:这会直接截断文件内容,只用于确认可丢弃的日志。
# 统计各一级子目录下的文件数量,找出小文件最多的目录
for d in /var/*; do echo "$(find "$d" -xdev 2>/dev/null | wc -l) $d"; done | sort -rn | head常见原因是会话文件、邮件队列、缓存碎片文件堆积。清理对应目录并给应用加上过期清理机制即可。
logrotate(按大小或天数切割、压缩、保留份数),journald 可在 /etc/systemd/journald.conf 中设置 SystemMaxUse。max-size 与 max-file,定期 docker system df 查看占用,确认无用后再 docker system prune。growpart、resize2fs 或 xfs_growfs),具体操作以控制台和官方文档为准。排查顺序:df -h 与 df -i 定类型 → du -x 逐层下钻 → lsof +L1 找已删除未释放文件 → 清理并补上轮转与监控。记住一条经验:删除正在写入的日志要用截断或重载进程,而不是直接 rm。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。