tmpfs 是内核原生内存文件系统,数据存于 ram 或 swap,无块设备开销;区别于 ramfs,它支持大小限制、swap 交换和 df 统计,避免 oom。

tmpfs 是什么,和普通内存盘有啥区别
tmpfs 不是“把硬盘挂成内存”,而是内核原生支持的内存文件系统,所有数据直接存在 RAM 或 swap 里,没有块设备层开销。它和 ramfs 的关键区别在于:tmpfs 可设大小上限、可交换到 swap、能被 df 统计——而 ramfs 一旦写爆内存就 OOM。
- 默认不持久化,重启即丢,适合缓存、临时构建、session 存储
- 不等于“更快的 SSD”,而是彻底绕过 I/O 栈,
open()/write()延迟压到微秒级 - 不是所有场景都加速:小文件高频读写受益明显;大文件顺序写反而可能因缺页中断变慢
怎么挂载一个带限制的 tmpfs
用 mount 指定 size 和 mode 最常用,漏掉 size 就可能吃光内存——这是最常踩的坑。
-
sudo mount -t tmpfs -o size=512M,mode=1777 tmpfs /mnt/ramdisk:建一个 512MB、所有人可读写的临时目录 -
size=2G支持单位K/M/G,不写单位默认字节;超限时写入会报No space left on device,不是磁盘满那种提示 -
mode=1777确保像/tmp一样支持 sticky bit,避免用户删别人文件 - 想开机自动挂?往
/etc/fstab加一行:tmpfs /mnt/ramdisk tmpfs size=1G,mode=1777 0 0
为什么 df 显示已用 100%,但实际还能写
df 统计的是分配的页数,不是物理内存占用。tmpfs 使用“按需分配”策略:只在真正写入时才占 RAM,truncate 或 rm 后内存立刻释放,但 df 不会马上刷新——这容易误判为“卡死了”。
- 查真实内存占用看
cat /sys/fs/cgroup/memory/memory.usage_in_bytes(如果用了 cgroup)或grep Shmem /proc/meminfo -
ls -lsh显示的磁盘占用(第一列)是逻辑大小,和实际 RSS 无关 - 用
find /mnt/ramdisk -type f -exec ls -lsh {} \;能看到每个文件“声称”占多少,但加起来≠RAM 实际用量
tmpfs 和 /dev/shm 有啥关系
/dev/shm 就是系统默认挂的 tmpfs,glibc 的 POSIX 共享内存(shm_open)、Python 的 multiprocessing.shared_memory 都依赖它。改它等于动底层 IPC 基础设施。
- 默认大小通常是 64MB,不够用时别直接
rm -rf /dev/shm,得重新 mount:sudo mount -o remount,size=512M /dev/shm - 某些容器环境(如 Docker)会覆盖
/dev/shm,此时shm_open失败报Function not implemented,得检查是否被禁用或 size=0 - 不用
/dev/shm?可以自己挂新 tmpfs 并设uid/gid隔离权限,比如给某个服务专用:sudo mount -t tmpfs -o size=128M,uid=1001,gid=1001 tmpfs /var/run/myapp
size 就挂,等于把内存安全交给应用自己管;依赖 /dev/shm 却不确认它的挂载参数,上线后共享内存突然失效——这些都不是配置问题,是资源契约没对齐。










