tmpfs挂载缓冲区目录可将读写延迟压至1.3ms、吞吐达157MB/s,需选对路径(如/tmp、/var/cache/nginx)、显式限容(size=参数)、加固安全(noexec,nosuid)并验证生效。

直接用 tmpfs 挂载缓冲区目录,能把读写性能拉到接近内存带宽水平——这不是理论值,实测写入延迟可从 12.4ms(SSD 绑定挂载)压到 1.3ms,吞吐翻倍至 157MB/s。关键不在“能不能挂”,而在“挂哪儿、怎么限、如何防崩”。
选对路径:哪些缓冲区目录最适合 tmpfs
不是所有目录都适合搬进内存。核心原则是:生命周期短、无需落盘、高频小文件读写。典型目标包括:
- /tmp:绝大多数应用默认临时目录,日志中转、解压缓存、编译中间产物集中地
-
/var/cache/<app>:如
/var/cache/nginx(静态资源缓存)、/var/cache/apt(包管理缓存) - /app/cache 或 /opt/app/tmp:自定义应用级缓存目录,比如图像缩略图池、模板渲染中间态
- /run 或 /var/run:进程 socket、pid 文件、运行时状态——天然就是 tmpfs 场景
精准限容:不设 size= 就等于埋雷
tmpfs 默认可占用物理内存一半,容器一多或应用突发写入,极易触发 OOM Killer 杀进程。必须显式设上限:
- 用
size=100m或size=2g明确限制最大内存用量,单位支持 k/m/g - 建议按实际峰值预估再上浮 20%~30%,例如监控发现某缓存目录日常占用 65MB,就设
size=100m - 避免设过大(如
size=8g)却无对应业务需求,既浪费内存,又削弱系统稳定性
安全加固:去掉执行权限更稳
缓冲区目录通常只存数据,不该跑代码。加 noexec,nosuid 是低成本高收益的安全动作:
-
noexec:禁止在该挂载点执行任何二进制或脚本,防恶意 payload 利用临时目录提权 -
nosuid:忽略 setuid/setgid 位,阻断通过特权程序间接获取权限的路径 - 组合使用示例:
--tmpfs /tmp:rw,noexec,nosuid,size=256m
验证与调优:别挂完就不管
挂载后要确认是否生效、是否真在内存跑、有没有被 swap 挤出:
- 进容器执行
df -hT /tmp,看到tmpfs类型且 Size 和你设的一致 - 宿主机上运行
cat /proc/mounts | grep tmpfs,检查挂载参数是否完整落地 - 若应用写入量大且宿主机启用了 swap,可用
vmstat 1观察 si/so 列——持续非零说明部分页被换出,需调大 size 或优化应用写模式

















