能显著加速中小型项目编译,因将.o文件、cmakefiles/等高频读写中间产物置于内存绕过磁盘i/o;但对cpu密集型(如模板展开、lto链接)效果有限。
直接把编译器的中间产物(比如 .o 文件、预编译头、cmake 的 cmakefiles/、build/ 下的临时对象)放到 tmpfs 里,能绕过磁盘 i/o,尤其对频繁读写的中小型项目效果明显。不过要注意:tmpfs 不是万能加速器,它只在 io 成为瓶颈时才显著起效;若编译本身是 cpu 密集型(如模板展开、lto 链接),换 tmpfs 帮助有限。
明确哪些目录适合挂载为 tmpfs
编译过程中的高频写入路径通常包括:
-
build/或obj/这类构建输出根目录 -
CMakeCache.txt所在目录及CMakeFiles/ - 编译器缓存目录,如
ccache的缓存路径(若启用) -
/tmp(很多工具默认用它放临时文件)
这些路径生命周期短、内容可重建、不需持久化——正好匹配 tmpfs 特性。
在 Docker 中挂载 tmpfs 的实操方式
启动容器时用 --tmpfs 指定路径和限制,避免内存失控:
docker run -it \ --tmpfs /workspace/build:rw,noexec,nosuid,size=2g \ --tmpfs /tmp:rw,noexec,nosuid,size=512m \ -v $(pwd):/workspace:ro \ -w /workspace \ gcc:13 \ bash -c "mkdir -p build && cd build && cmake .. && make -j$(nproc)"
关键点:
-
size=必须设,防止编译中途因内存耗尽被 OOM killer 杀掉 -
noexec,nosuid是安全底线,禁用执行权限,防恶意代码注入 - 不要挂载源码目录(如
/workspace)为 tmpfs,否则修改会丢失
配合编译工具链进一步提效
tmpfs 单独用只是基础,搭配以下手段才能释放全部潜力:
- 启用
ccache并将其缓存目录(如/root/.ccache)也挂载为 tmpfs,避免每次清缓存 - CMake 中设置
-DCMAKE_INTERPROCEDURAL_OPTIMIZATION=OFF(若不需要 LTO),减少链接阶段内存压力 - 使用
make -j$(nproc)或ninja -j$(nproc)充分利用 CPU,让 tmpfs 的高吞吐不被闲置 - 若用 Bazel,可通过
--sandbox_base=/tmp/sandbox将沙盒指向 tmpfs 路径
需要警惕的边界情况
- 大型项目(如 Chromium 级别)单次构建中间文件可能超 GB,2GB tmpfs 不够用,建议按实际
du -sh build/预估后留 30% 余量 - 宿主机 swap 关闭时,tmpfs 无法回退,
size=必须严格保守;开启 swap 可提升容错,但性能略降 - CI 环境中若复用容器,tmpfs 内容不会跨运行保留,每次都是干净环境——这是优点,不是 bug
本质上,tmpfs 不改变编译逻辑,只把“等磁盘”时间换成“用内存”,只要 IO 占编译总时长 15% 以上,实测缩短 30%~70% 是常见结果。










