前言
在 Linux 系统中,磁盘 I/O 往往是性能瓶颈。当应用程序频繁读取大文件(例如多媒体文件、数据库文件、日志文件)时,系统可能因为 I/O 等待而变得非常卡顿。为了减少磁盘压力、提升性能,Linux 提供了多种利用内存作为缓存的机制,例如:tmpfs、ramfs、Page Cache(页缓存)。本文将详细介绍这些机制的使用方法及区别,并给出常见的实践方案。
tmpfs
tmpfs 的概述
tmpfs 是一种基于内存的文件系统:
- 文件实际存储在内存 + 交换分区(Swap)中
- 支持容量限制(挂载时可指定大小)
- 内存不足时,tmpfs 文件可以被交换到 Swap
- tmpfs 的文件内容本质上就是 Page Cache
- 不会导致 OOM(Out of Memory)
- 适合存放临时文件、缓存数据
- 典型的挂载点:
/dev/shm、/run
tmpfs 的主要特点
- 支持创建目录(无限层级)
- 支持普通文件
- 支持符号链接、硬链接
- 支持权限、UID/GID
- 支持文件删除(立即释放内存)
- 支持调整大小(动态扩缩)
- 系统重启后会丢失所有数据
tmpfs 的适用场景
- 程序临时文件
- 加速频繁读写的小文件
- 构建系统(
make、npm、cargo 等) - OBS、FFmpeg 等读取多媒体文件减少磁盘压力
tmpfs 的使用
1
| sudo mkdir -p /mnt/ramdisk
|
1 2
| sudo mount -t tmpfs -o size=4G tmpfs /mnt/ramdisk
|
1 2 3 4 5
| sudo vim /etc/fstab
sudo mount -a
|
1
| tmpfs /mnt/ramdisk tmpfs defaults,size=4G 0 0
|
1
| sudo umount /mnt/ramdisk
|
ramfs
ramfs 的概述
ramfs 是最简单的内存文件系统:
- 数据存储在纯内存中
- 没有容量限制
- 内存写满后系统不会阻止继续写入,会持续占用内存
- 内存耗尽就会 OOM,最终导致系统宕机
- 更像一个危险,但读写速度极快的文件系统
ramfs 的主要特点
- 支持创建目录(无限层级)
- 支持普通文件
- 支持符号链接、硬链接
- 支持权限、UID/GID
- 支持文件删除(立即释放内存)
- 不支持大小限制(不能设置 Size,容量可无限增长)
- 数据页不可回收(不会被内核回收)
- 不支持 Swap Out(永远驻留物理内存中)
- 容易导致系统 OOM(写入越多,内存占用越多)
- 系统重启后会丢失所有数据
ramfs 的适用场景
- 极端场景下的高性能缓存
- 只用于开发 / 研究,不建议生产环境使用
ramfs 的挂载
1
| sudo mkdir -p /mnt/ramdisk
|
1
| sudo mount -t ramfs ramfs /mnt/ramdisk
|
1 2 3 4 5
| sudo vim /etc/fstab
sudo mount -a
|
1
| ramfs /mnt/ramdisk ramfs defaults 0 0
|
1
| sudo umount /mnt/ramdisk
|
特别注意
由于 ramfs 没有容量限制,如果程序写入大量数据会导致系统 OOM。
Page Cache
Page Cache 的概述
即使用户不主动使用 tmpfs 或 ramfs 文件系统,Linux 内核本身也会自动利用内存作为 “磁盘缓存”。当用户读取一个文件时:
- 内核将数据加载到操作系统的 Page Cache(页缓存)
- 下次读取同一个文件时,不再触发磁盘 I/O,直接从内存返回结果
Page Cache 的使用
1
| cat video.mp4 > /dev/null
|
1 2 3 4
| 上述命令会: - 强制把 `video.mp4` 文件从磁盘加载进内存 - 但不输出任何内容 - 后续程序读取 `video.mp4` 文件会命中缓存,不再产生磁盘 I/O
|
1 2 3 4 5
| sudo sync
sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'
|
特别注意
在 Linux 生产环境中,不建议随意清缓存,否则会影响系统性能。
总结说明
tmpfs、ramfs、Page Cache 的优缺点
| 技术 | 优点 | 缺点 | 适用场景 |
|---|
| tmpfs | 快、可限制容量、安全 | 占用系统内存 | 缓存文件、临时空间、多媒体文件读取 |
| ramfs | 极快 | 不限容量,OOM 风险高 | 测试、高速缓存(不推荐生产环境使用) |
| Page Cache | 自动、透明、无需修改程序 | 缓存不可控、可能被挤掉 | 文件预加载(热加载) |
| 特性 | tmpfs | ramfs |
|---|
| 存储位置 | 内存 + Swap | 纯内存(永远不使用 Swap) |
| 内存限制 | 可限制大小(推荐) | 不可限制,体积可无限增长 |
| 系统内存压力大时 | 会将部分数据 Swap 出去 | 继续占用内存,最终导致系统 OOM |
| 默认缓存行为 | 文件内容存放在 Page Cache 中,这些页是可回收的,内核在内存压力大时可以回收或 Swap Out | 文件内容同样存放在 Page Cache 中,但被标记为不可回收,不会 Swap Out,也不会被回收,因此会永久占用物理内存 |
| OOM 风险 | 低(可回收) | 极高(不可回收) |
| 性能 | 与 ramfs 速度差异极小,几乎相同 | 比如 tmpfs 略快,但差距可以忽略 |
| 适用场景 | 安全缓存、高性能临时存储 | 特殊场景、嵌入式、需要可预测行为 |