当前位置:首页 > 文章列表 > 文章 > linux > Linux tmpfs 为什么占满内存:df -h /run、df -i 与 size 语义怎么核对

Linux tmpfs 为什么占满内存:df -h /run、df -i 与 size 语义怎么核对

来源:17golang原创 2026-08-19 11:56:56 0浏览 收藏

服务器告警弹出“/run 快满了”,不少人第一反应就想给磁盘扩容。可如果 findmnt /run 显示文件系统类型是 tmpfs,这里看到的根本不是独立的物理硬盘,而是由内核管理、按实际内容消耗内存和交换空间的临时文件系统。排查的时候得把挂载点、块存储空间、inode和真实占用的文件逐项对应上。

先记住一句:df -h 看容量上限和已用块空间,df -i 看 inode;tmpfs 的 size= 只是允许使用的上限,不代表系统已经预先占了同等大小的内存。

要点速览
  • df -h /run 与 df -i /run 要搭配着跑,容量占满和inode占满是两条完全独立的故障触发线。
  • findmnt -T /run -o TARGET,FSTYPE,SOURCE,OPTIONS 才能看到准确的当前挂载参数,尤其是 size= 与 nr_inodes= 的配置项。
  • 执行清理操作前先找出具体占用的目录和已被进程打开的文件;调整空间上限前要确认systemd、容器或关联服务是否对这个挂载点有特殊依赖。

先确认 /run 到底挂载了什么

不要只看 df -h 的第一列输出。它显示的设备名可能是 tmpfs,但真正需要判断的是目标路径对应的真实挂载记录。用 -T 让 findmnt 按路径解析,避免把父目录或者容器外部的挂载项误当成当前目录的挂载信息。

findmnt -T /run -o TARGET,FSTYPE,SOURCE,OPTIONS
df -h /run
df -i /run

典型输出和下面的示例差不多,注意示例数值仅做参考,现场操作要以实际机器返回的结果为准:

TARGET FSTYPE SOURCE OPTIONS
/run   tmpfs  tmpfs  rw,nosuid,nodev,mode=755,size=2G

Filesystem Size Used Avail Use% Mounted on
tmpfs      2.0G 1.6G  400M  80% /run

tmpfs 的内容通常驻留在虚拟内存里,物理内存吃紧的时候也可能被放到swap分区;它只会按照当前存储的文件内容来消耗系统资源。挂载点卸载之后,里面的所有内容都会直接丢失,所以“清空”操作和普通磁盘的空间整理完全不是一回事。

Linux /run tmpfs 的 size 上限、df 已用空间与内存消耗关系示意图

df -h 和 df -i 分别统计的是什么

系统提示“空间满了”至少有两种完全不同的情况。df -h 统计块存储空间,适合排查日志、套接字以外的大文件持续写入的问题;df -i 统计inode数量,适合排查大量小文件把文件条目耗尽的问题。后者往往在磁盘容量还剩很多的时候就直接报空间不足。

检查项统计对象常见症状下一步操作
df -h块空间Use% 占比很高,写入操作返回 No space left on device按目录逐级统计大小,定位大文件和异常增长的内容
df -iinode 数量IUse% 占比很高,但剩余容量显示仍有很多统计小文件总量,定位异常缓存、队列或者临时目录
findmnt挂载类型与选项不知道 size/nr_inodes 参数的来源核对当前命名空间和生效的挂载参数

如果 df -h /run 显示使用率80%,完全不能直接推出主机内存已经消耗了80%。size=2G 是这个tmpfs实例允许使用的最大上限;实际内存占用仍要结合 free -h、/proc/meminfo 的 Shmem 字段,以及目录内的真实文件情况综合判断。

free -h
grep -E 'MemAvailable|Shmem|SwapFree' /proc/meminfo
du -xhd1 /run 2>/dev/null | sort -h

定位把 tmpfs 写满的进程

先从统计目录大小开始查,别一上来就直接执行 rm -rf /run/*。/run 里面可能存着PID文件、Unix套接字、锁文件和服务运行时专属目录,不加分辨地直接删除,会让正在运行的服务出现各种难以排查的异常状态。

du -xhd1 /run 2>/dev/null | sort -h
find /run -xdev -type f -size +50M -printf '%s %p\n' 2>/dev/null | sort -n
lsof +D /run 2>/dev/null | head -80

找到大占用目录之后,再确认它是否属于systemd服务、容器运行时或者某个自定义的守护进程。碰到已经被进程打开但已经被删除的文件,目录列表里看不到文件名,但进程仍然占着对应的空间,可以用 lsof +L1 作为补充排查线索。容器环境还要注意挂载命名空间的隔离性:在宿主机执行的 df 和容器内部执行的返回结果不一定一致。

size 与 nr_inodes 怎么核对和调整

tmpfs 支持通过 size= 设置存储空间上限,通过 nr_inodes= 设置inode数量上限;如果没有显式指定这两个参数,内核会使用自己的默认值。操作前先把当前的挂载选项完整记录下来:

findmnt -T /run -o TARGET,FSTYPE,OPTIONS
mount | grep ' on /run '

如果确认是默认的容量上限太小,而且业务应用确实需要更多的临时空间,可以在维护窗口期评估重挂载操作,示例命令如下:

mount -o remount,size=4G /run

这个扩容操作不是没有代价的:设置的上限越大,出现异常写入的时候就越容易拖低整个主机的可用内存;反过来把上限调小也可能因为现有内容已经超过新的阈值而操作失败,甚至影响正在运行的服务。要让配置永久生效,还要检查发行版的systemd自动生成配置、/etc/fstab 或者容器启动参数,不能只修改当前运行时的挂载配置。

Linux tmpfs 用 df -h、df -i 和 findmnt 判断清理或调整 size 参数的排查路径

通用的安全处理步骤

  1. 记录 findmnt -T、df -h、df -i 和 free -h 的返回结果。
  2. 用 du、find、lsof 锁定异常占用的目录、文件和对应的进程。
  3. 优先按照对应服务自身的规则轮转日志、清理缓存或者重启异常的服务实例。
  4. 只有确认业务确实需要,而且主机内存预算足够的前提下,才调整 size= 或 nr_inodes= 的参数值。
  5. 完成变更后再次执行四类检查,并且观察一段时间的空间增长速度。

如果根因是某个服务持续不断生成临时文件,单纯调大tmpfs的上限只是把告警推迟触发而已。更稳妥的修复方式是限制临时文件的生命周期、修正异常重试逻辑,或者让服务把大对象写到有明确配额的持久化存储路径下。

相关问题

tmpfs 的 size=2G 会立即占用 2G 内存吗?

不会。它只是该实例允许使用的空间上限,实际资源消耗完全取决于当前存储的文件内容,而且占用的内存部分还可能被交换到swap分区。

df -h 没显示满但写文件仍然失败,为什么?

优先检查 df -i 的统计结果。大量小文件很可能先耗尽了inode配额;除此之外也要排查进程权限、文件系统只读挂载和容器层级的配额限制。

能直接删除 /run 下的文件吗?

不能一概而论。先确认文件的归属和打开它的进程,优先使用对应服务自带的清理逻辑或者重启流程,避免误删套接字、PID文件和锁文件。

总结

排查 Linux tmpfs 异常,核心是不要把它当成“另一块普通磁盘”,而是把挂载参数、块存储空间、inode、主机内存和具体的写入进程串起来关联分析。findmnt 负责确认边界规则,df -h/df -i 负责确认哪一类资源先到阈值,du 与 lsof 负责定位对应的责任进程。所有排查线索核对清楚之后,再决定是清理内容、修复程序逻辑还是调整资源上限。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
Python dataclass 继承时字段顺序报错怎么拆:KW_ONLY、默认值与序列化边界Python dataclass 继承时字段顺序报错怎么拆:KW_ONLY、默认值与序列化边界
上一篇
Python dataclass 继承时字段顺序报错怎么拆:KW_ONLY、默认值与序列化边界
CSS @scope 怎么限制组件样式泄漏:嵌套范围、优先级与降级检查
下一篇
CSS @scope 怎么限制组件样式泄漏:嵌套范围、优先级与降级检查
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    329次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    386次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    380次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    350次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    173次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议 和 隐私政策
返回登录
  • 重置密码