Linux tmpfs 满了但磁盘空间还有为什么
排查服务器写入失败时,最容易被误导的一幕是:根分区还有很多可用空间,应用却提示“磁盘满了”。如果报错路径落在 /tmp、/dev/shm、/run 或容器的临时目录,满的可能是一个独立的 tmpfs 挂载点。它的容量上限、inode 数量和内存归属,都不等于物理磁盘分区的剩余空间。
先用findmnt确认路径是不是 tmpfs,再分别看字节用量和 inode 用量;确认占用文件归属后再清理,确有内存余量时才考虑 remount 调整size。
- tmpfs 是以内存为主、可受 swap 影响的临时文件系统,
df -h显示的是它自己的配额。 df -i满而字节未满时,通常是小文件或目录数量触及 inode 上限。- 扩容 tmpfs 只改挂载实例限制,不会增加磁盘;清理前必须确认文件由哪个服务创建。
tmpfs 是 Linux 里完全基于内存/交换分区的临时文件系统,它的可用容量独立于物理磁盘分区,挂载后占用的是内存和交换分区额度,和你物理硬盘剩余空间没有直接关联,所以才会出现物理磁盘很空、tmpfs 先被写满的情况。
先确认:满的是 tmpfs 配额,不是整块磁盘
不要只看根分区的 df -h /。把出现错误的真实路径带入下面的只读检查,先看文件系统类型和挂载边界:
# 把 /tmp 换成应用实际报错的路径
findmnt -T /tmp -o TARGET,SOURCE,FSTYPE,OPTIONS
# 查看该路径所在文件系统的容量,而不是只查看根分区
df -hT /tmp
# 检查同一挂载点的 inode 是否先耗尽
df -i /tmp
如果 FSTYPE 是 tmpfs,Size、Used 和 Avail 就是该实例的限制和使用情况;根分区的 Avail 只是另一个文件系统的指标。若报错路径只是普通目录,继续检查是否有上层 tmpfs 挂载、容器的 mount namespace,或服务实际写入了另一个临时目录。

字节没满却写不进去,重点查 inode
tmpfs 不只有字节上限,还可以有 nr_inodes 上限。日志切分、浏览器缓存、构建临时文件或大量短生命周期小文件,可能先用光 inode。此时 df -h 看起来还有空间,但 df -i 的 IUse% 已接近 100%。
再把挂载参数记录下来,确认限制从哪里来:
# 只显示目标 tmpfs 的当前挂载选项,便于核对 size/nr_inodes
findmnt -T /tmp -t tmpfs -o TARGET,FSTYPE,OPTIONS
# 对照所有 tmpfs,避免误把另一个挂载点当成目标
df -hT -t tmpfs
| 现象 | 优先检查 | 处理方向 |
|---|---|---|
Use% 100% | size、大文件、删除但仍被进程打开的文件 | 确认归属后清理,或评估 remount |
IUse% 100% | nr_inodes、小文件数量、目录层级 | 清理文件数量,调整 inode 配额或改变临时文件策略 |
| 空间看似足够但进程被杀 | Shmem、swap、容器 memory limit | 处理内存压力,不要只扩大 tmpfs |
找到真正占用者:先看目录,再决定删不删
确认文件系统类型后,可以只在这个挂载点内统计目录大小,避免把其他磁盘的数据混进来:
# -x 只跨当前文件系统;先按目录找热点,不直接删除
du -xhd1 /tmp 2>/dev/null | sort -h
# 列出近期较大的普通文件,输出前先确认路径属于目标挂载点
find /tmp -xdev -type f -size +100M -printf '%s %p\n' 2>/dev/null | sort -n | tail -20
# 查看 tmpfs/shmem 对系统内存的影响
grep -E '^(MemAvailable|SwapFree|Shmem|SReclaimable):' /proc/meminfo
du 找到的是目录项当前可见的文件;如果某个文件已删除但仍被进程打开,目录里看不到它,却可能继续占用内存。此时应让对应服务按自己的退出或重载流程释放句柄,而不是反复删除无关文件。容器环境还要看容器所在 cgroup 的 memory.current 和 memory.stat,因为 tmpfs 的使用会进入内存账本。
清理、扩容还是限流:按占用来源处理
如果占用来自可重建缓存或已经完成的临时产物,先停掉会继续写入的任务,再按服务文档清理指定目录。不要直接执行清空整个 /tmp 或 /dev/shm 的命令,因为其中可能有仍在使用的 Unix socket、共享内存文件或其他服务状态。
确认当前使用量低于目标值且主机、容器都有内存余量时,可以对单个挂载点做 remount;新值不能低于现有使用量:
# 仅示范调整指定挂载点;先确认 TARGET 和内存余量
sudo mount -o remount,size=2G /tmp
# 调整后重新读取实际上限和可用量
df -hT /tmp
这里的 2G 是 tmpfs 的容量上限,不是从磁盘分区划出 2G。扩大它可能增加内存压力;如果根因是 cgroup 的内存限制、服务无界地产生小文件或临时目录选错位置,应该修正服务配置、清理策略或资源限流,而不是持续加大 size。

常见问题
tmpfs 会不会完全占满物理内存?
它按需增长,页面可受 swap 影响,但把上限设得过大仍可能造成内存压力。上限不是承诺有同等容量的独立磁盘。
为什么删除文件后空间没有立刻回来?
若进程仍持有已删除文件的打开句柄,空间要等句柄关闭后才释放;先定位进程,再走服务自身的重载或重启流程。
只把根分区扩容能解决吗?
不能直接解决独立 tmpfs 的配额问题。根分区扩容改变的是磁盘文件系统,tmpfs 需要清理、调整挂载参数或改变服务的临时目录。
排查结论
这类“磁盘还有空间但写不进去”的故障,关键不是继续观察根分区,而是沿着“路径 → 挂载点 → bytes/inodes → 占用归属 → 内存/cgroup”逐层确认。内核关于 tmpfs 的说明见 https://cdn.kernel.org/doc/html/latest/filesystems/tmpfs.html,cgroup v2 的内存统计说明见 https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html。
Go pprof profile 为空时先确认什么
- 上一篇
- Go pprof profile 为空时先确认什么
- 下一篇
- CSS container query 为什么在子组件中不生效
-
- 文章 · linux | 4小时前 | Linux · systemd · 运维排障 · systemd journalctl Linux日志 journald
- journald 如何按服务和启动批次筛选日志
- 371浏览 收藏
-
- 文章 · linux | 6小时前 |
- systemd timer OnCalendar 如何避免重复触发
- 144浏览 收藏
-
- 文章 · linux | 7小时前 |
- systemd service Restart=always 为什么导致失败循环
- 167浏览 收藏
-
- 文章 · linux | 1天前 |
- Linux cgroup v2 memory.max 如何判断进程被限制
- 216浏览 收藏
-
- 文章 · linux | 1天前 | Linux · 日志管理 · 运维排障 · 文件描述符 logrotate copytruncate 日志轮替 postrotate
- Linux logrotate rotate 后应用仍写旧文件怎么办
- 285浏览 收藏
-
- 文章 · linux | 1天前 |
- Linux ulimit -n 调高后仍报 too many open files
- 275浏览 收藏
-
- 文章 · linux | 1天前 | Linux · 文件系统 · 挂载 · 运维排障 · 工作目录 bind mount Linux mount --bind umount target is busy EBUSY
- Linux mount --bind 解除挂载时为什么要先离开工作目录
- 476浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 105次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 21次使用
-
- OpenCompass
- OpenCompass是上海AI实验室推出的开源大模型评测平台,提供CompassKit、CompassHub和CompassRank三大核心组件,支持LLM及多模态模型的一站式标准化评估与排行榜查询。
- 31次使用
-
- AGI-Eval
- AGI-Eval是由上海交大等高校联合发布的大模型评测社区,提供公正透明的LLM能力榜单、多领域评测集及Data Studio数据服务,助力AI模型性能评估与NLP科研开发。
- 22次使用
-
- SuperCLUE
- SuperCLUE是权威的中文大语言模型综合评测基准,涵盖语言理解、知识应用、AI Agent智能体及安全性等12项核心能力。通过多轮对话与客观测试,定期发布榜单与技术报告,为模型研发、优化及行业选型提供科学依据。
- 259次使用
-
- 在Linux系统中安装Go语言的详细教程
- 2022-12-29 402浏览
-
- 使用golang获取linux上文件的访问/创建/修改时间
- 2022-12-31 238浏览
-
- go程序部署到linux上运行的实现方法
- 2023-01-02 387浏览
-
- Linux系统下Go语言开发环境搭建
- 2023-01-07 242浏览
-
- 详解golang执行Linuxshell命令完整场景下的使用方法
- 2023-01-07 426浏览

