Linux tmpfs 使用率高时怎么判断是缓存还是空间不足
来源:17golang原创
时间:2026-09-08 21:22:12 468浏览 收藏
Linux 上看到 /dev/shm、/run 或自定义 tmpfs 的使用率很高,先不要急着把它当成“内存泄漏”。df 高说明这个 tmpfs 挂载实例的块空间接近上限;是否已经造成物理内存压力,还要结合 /proc/meminfo 里的 Shmem、MemAvailable 和 swap。若 df 明显高于 du,再查删除后仍被进程打开的文件。
最实用的判断顺序是:df -h看挂载空间,du -x看可见文件,df -i看 inode,Shmem看系统级共享内存,最后用lsof +L1解释“看不见但没有释放”的占用。
- tmpfs 的
size=是挂载实例上限,不等于已经消耗的物理内存。 df、du、df -i观察的是不同维度,三者不一致本身就是线索。- 清理前先确认文件属于哪个服务;删除仍打开的文件要让持有它的进程关闭或重启文件句柄。
先区分 tmpfs 的上限、已用块和真实内存压力
tmpfs 把文件放在内核的内存文件系统中,页面在有 swap 时也可能被换出。这里有三个容易混淆的数字:挂载参数中的 size 是“最多允许分配多少”,df 的 Used 是“这个实例已经分配了多少”,而系统是否紧张要看全局可用内存和换页活动。没有显式指定 size 时,Linux 内核文档给出的默认值是物理内存的 50%,但这只是上限,不是预留量。
# 把 MOUNT_POINT 换成实际的 tmpfs 挂载点
MOUNT_POINT=/dev/shm
# 查看文件系统类型、大小、已用、可用和挂载选项
findmnt -no TARGET,FSTYPE,SIZE,USED,AVAIL,USE%,OPTIONS "$MOUNT_POINT"
df -hT "$MOUNT_POINT"
# 观察系统级共享内存、可用内存和 swap,而不是只看 tmpfs 百分比
grep -E '^(MemAvailable|Shmem|SwapFree|SwapTotal):' /proc/meminfo
free -h
swapon --show
如果 df 已到 90% 以上,但 MemAvailable 仍充足、swap 没有持续增长,优先把它视为挂载容量或文件生命周期问题;如果 Shmem 同时很大、可用内存持续下降并伴随换页,再按内存压力处理。要注意,Shmem 是系统级统计,除了 tmpfs 还可能包含 System V/POSIX 共享内存和共享匿名映射,不能直接当成某一个挂载点的精确用量。

用 df、du 与 df -i 对照块空间、可见文件和 inode
把三个命令的角色分开,排查会快很多。df -h 从文件系统角度看块空间;du -xhd1 沿目录树统计能看到的文件;df -i 看 inode 是否先耗尽。tmpfs 里小文件很多时,容量尚有余量但 inode 接近 100%,同样会导致创建失败。
# 先确认目标挂载点的块空间和 inode
df -h "$MOUNT_POINT"
df -ih "$MOUNT_POINT"
# -x 不跨到其他文件系统;按一级目录汇总可见文件
du -xhd1 "$MOUNT_POINT" 2>/dev/null | sort -h
# 继续定位最大的可见目录或文件
du -xah "$MOUNT_POINT" 2>/dev/null | sort -h | tail -n 20
常见组合可以这样读:df 高、du 也高,通常是可见文件确实占满了空间;df 高、du 低,重点转向已删除仍打开的文件或统计范围不一致;df -i 高而块空间不高,则优先检查小文件数量。du 统计的是可见目录树,所以不要用它单独证明“内存已经释放”。

当 df 高而 du 低:查删除后仍打开的文件
进程打开文件后,即使路径被 rm 删除,只要文件描述符还在,文件内容仍可能被进程使用;目录树看不到它,挂载统计却还没有下降。这是“清理过了但空间不回来”的典型线索。
看到结果后不要直接杀进程。先确认 PID 属于哪个服务、文件是否是日志或临时数据,再选择让应用执行日志 reopen、关闭句柄,或在维护窗口重启服务。若服务没有优雅的 reopen 能力,重启前要评估连接、队列和未落盘数据。处理后重新比较 df 和 du,只把空间下降作为释放完成的信号。
按证据选择清理、限额调整或应用修复
不要用“把 size 调大”替代定位。若可见文件增长是业务缓存失控,先加生命周期和清理策略;若 inode 紧张,减少碎片化小文件或调整文件组织;若删除后仍打开,修复日志轮转或句柄关闭;只有确认机器有足够内存、swap 策略也符合预期时,才考虑 remount 调整上限。
临时文件的内容在卸载 tmpfs 后会丢失,因此清理或卸载前必须确认它不是共享内存、运行时 socket 或应用正在使用的数据。生产环境最好把 df 使用率、inode 使用率、Shmem、MemAvailable 和 swap 使用趋势分别监控,避免把挂载容量告警和内存告警混成一条。
相关问题
tmpfs 使用率高是不是一定会触发 OOM?
不一定。它首先说明挂载实例的空间接近上限;是否触发 OOM 还取决于系统可用内存、swap、其他进程和实际分配压力。
为什么 du 显示很小,df 却接近 100%?
先确认两者针对的是同一个挂载点和同一目录范围,再用 lsof +L1 查删除后仍打开的文件,同时排除 inode 耗尽和权限导致的统计不完整。
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
363 收藏
-
277 收藏
-
481 收藏
-
288 收藏
-
232 收藏
-
480 收藏
-
390 收藏
-
456 收藏
-
145 收藏
-
文章 · linux | 15小时前 | 命名空间 · 容器隔离 · Linux教程 · 挂载管理 · Linux mount namespace mount propagation private mount unshare127 收藏
-
文章 · linux | 16小时前 | 容器 · Linux · 命名空间 · mount namespace PID namespace namespaces linux namespace network namespace363 收藏
-
380 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习