Linux磁盘满了怎么清理内存

文章导读
“Linux 磁盘满了怎么清理内存”这句话里其实混了两个问题:磁盘满属于存储空间问题,内存紧张属于 RAM 和 swap 问题。多数情况下,需要先确认到底是 df 显示分区写满,还是 free 显示可用内存见底。因为磁盘满之后,日志写入、临时文件、数据库 WAL 都可能失败,表现会很像“内存不足”。动手前先用一条命令把两类指标都看清楚,不要急着删文件或重启服务。
📋 目录
  1. A Linux磁盘满先定位在哪一层
  2. B Linux磁盘满:先看这四个位置
  3. C Linux磁盘满:按可能性从高到低排除
  4. D Linux磁盘满:改完怎么确认真的解决了
A A

“Linux 磁盘满了怎么清理内存”这句话里其实混了两个问题:磁盘满属于存储空间问题,内存紧张属于 RAM 和 swap 问题。多数情况下,需要先确认到底是 df 显示分区写满,还是 free 显示可用内存见底。因为磁盘满之后,日志写入、临时文件、数据库 WAL 都可能失败,表现会很像“内存不足”。动手前先用一条命令把两类指标都看清楚,不要急着删文件或重启服务。

磁盘满和内存不足要先分开判断:先跑 df -hT 和 df -i 看空间与 inode,再跑 free -h 和 ps aux --sort=-rss | head 看内存占用。若 df 的 Use% 接近 100%,处理对象是磁盘;若 free 的 available 很低但磁盘还有余量,才轮到查内存和 swap。清理顺序通常是先删可再生的日志与缓存,再考虑迁移大文件;不要用清空 swap 或清缓存当作长期方案,这类动作只缓解当下压力。删任何文件前,先用 lsof 确认没有进程占用,否则空间不会立刻释放。

Linux磁盘满先定位在哪一层

磁盘满通常不是单一环节的问题,按层排查能避免把“应用写不进去”误判成“内存不够”。可以先从下面三层依次确认,找到第一层异常就停下来处理,不要跳步。

  • 文件系统层:用 df -hT 看每个挂载点的 Use% 和文件系统类型,用 df -i 看 inode 使用率。Use% 高说明块空间耗尽;IUse% 高说明小文件太多,此时即使 df -h 显示还有空间也会报 No space left on device。
  • 目录与文件层:在确认异常挂载点后,用 du -xhd1 /path 逐层下钻,定位占用最大的目录;再用 find /path -xdev -type f -size +500M -exec ls -lh {} \; 找大文件。-xdev 能避免跨挂载点统计。
  • 进程层:文件已被删除但空间没释放,通常是仍有进程持有句柄。用 lsof +L1 或 lsof | grep deleted 查被删除但仍被打开的文件,对应进程重启或让它重新打开文件后空间才会回收。

如果 df 显示空间正常、但应用报内存分配失败,再去看 free -h 的 available 列和 /proc/meminfo 中的 MemAvailable。内存问题的排查和磁盘清理是两条线,不要用删日志的方式去“解决内存不足”。

Linux磁盘满:先看这四个位置

下面四个位置分别对应命令输出、日志、配置项和面板字段,按顺序看一遍基本能判断问题范围。每条都给出可直接执行的命令或路径。

1. 命令输出:空间和 inode

df -hT
df -i
findmnt -o TARGET,SOURCE,FSTYPE,OPTIONS

先看 df -hT 哪个挂载点 Use% 最高,再看 df -i 对应挂载点的 IUse%。两个指标要一起看,只看其中一个容易误判。

Linux磁盘满了怎么清理内存

2. 日志:/var/log 与 journald

du -xhd1 /var/log | sort -h
journalctl --disk-usage

日志通常位于 /var/log,du -xhd1 能列出各子目录大小。使用 systemd-journald 的系统,日志还可能占用 /var/log/journal,用 journalctl --disk-usage 查看当前占用,而不是只盯着 messages 或 syslog。

3. 配置项:日志轮转和保留策略

cat /etc/logrotate.conf
ls /etc/logrotate.d/
grep -E '^(SystemMaxUse|SystemKeepFree|MaxRetentionSec)' /etc/systemd/journald.conf

清理只能解决当下,真正防止再次写满要看轮转配置。logrotate 的 rotate、size、maxsize 决定保留多少份历史日志;journald 的 SystemMaxUse 决定日志总容量上限。修改这些配置需要结合业务日志保留要求确认,不要直接套用别人的数值。

4. 面板字段:监控里的磁盘与内存指标

如果服务器接了监控面板(如 Prometheus + Grafana、云厂商控制台),分别查看磁盘使用率(filesystem usage)和内存可用量(MemAvailable)两个指标曲线。看变化趋势比看单点数值更有用:磁盘是缓慢增长还是短时间暴涨,内存是持续高位还是周期性波动,处理方向不同。具体字段名各面板不一致,以实际面板的指标说明为准。

Linux磁盘满:按可能性从高到低排除

下面按常见程度排序,每条给出确认动作。确认某条成立后再处理,不要在没定位的情况下批量删文件。

Linux磁盘满了怎么清理内存
  1. 日志暴涨:确认 du -xhd1 /var/log | sort -h 和 journalctl --disk-usage。处理时优先用 journalctl --vacuum-size=500M 或 journalctl --vacuum-time=7d 收缩 journald 日志;普通日志文件用 truncate -s 0 /var/log/xxx.log 截断,而不是直接 rm,因为进程仍持有句柄时删除不会释放空间。
  2. 被删除但仍被打开的文件:确认 lsof +L1。输出里 SIZE/OFF 较大的行就是占用者,处理方式是重启对应服务或让它轮转日志,之后空间才回收。
  3. 应用缓存或临时文件:确认 du -xhd1 /tmp /var/tmp /var/cache。处理前确认目录用途,/tmp 下可能有正在运行的服务使用的临时文件,建议先停相关服务或确认无占用再清理。
  4. 容器与镜像:确认 docker system df(若使用 Docker)或 du -xhd1 /var/lib/docker。清理可用 docker system prune,但会删除未使用镜像和停止的容器,需要结合环境确认是否有依赖。
  5. 数据库与业务数据增长:确认 du -xhd1 /var/lib/mysql 或对应数据目录。这类文件不能直接删,需要走归档、清理历史分区或扩容,属于业务决策,不是运维单方面能处理的动作。
  6. inode 耗尽:确认 df -i。常见于大量小文件目录(如 session、邮件队列、缓存碎片)。处理方式是找到文件数最多的目录:find /path -xdev -type f | wc -l 逐层统计,再按业务规则清理。

Linux磁盘满:改完怎么确认真的解决了

清理动作执行后,用下面的命令确认空间确实回收,并观察一段时间再判断是否稳定。

df -hT
df -i
lsof +L1 | head
journalctl --disk-usage
free -h

判断标准建议这样看:df -hT 对应挂载点 Use% 明显下降,df -i 的 IUse% 同步下降;lsof +L1 不再有大量残留句柄;journalctl --disk-usage 落到设定上限以内。观察时间上,建议至少跨过一个业务高峰或一个日志轮转周期(例如一天),确认 Use% 没有快速回升。如果只是把日志删掉但没改轮转策略,回升是大概率事件。

回滚办法要提前想好:改动 logrotate 或 journald 配置前,先备份原文件:

cp /etc/logrotate.conf /etc/logrotate.conf.bak
cp /etc/systemd/journald.conf /etc/systemd/journald.conf.bak

若调整后日志量不足影响排查,用 cp /etc/logrotate.conf.bak /etc/logrotate.conf 恢复,再执行 systemctl restart systemd-journald 让 journald 配置生效。对于用 truncate 截断的日志,已删内容无法恢复,所以截断前要确认该日志不是唯一排障依据。内存相关的临时缓解(如 sync; echo 3 > /proc/sys/vm/drop_caches)只清理可回收缓存,不代表内存问题解决,不建议当作常规手段写入脚本。