Linux 使用内存缓存减少磁盘 I/O

前言

在 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 的适用场景

    • 程序临时文件
    • 加速频繁读写的小文件
    • 构建系统(makenpmcargo 等)
    • OBS、FFmpeg 等读取多媒体文件减少磁盘压力

tmpfs 的使用

  • 创建挂载点
1
sudo mkdir -p /mnt/ramdisk
  • 挂载 tmpfs
1
2
# 比如限制 4GB 容量
sudo mount -t tmpfs -o size=4G tmpfs /mnt/ramdisk
  • 验证挂载
1
df -h /mnt/ramdisk
  • 开机自动挂载(可选)
1
2
3
4
5
# 编辑 fstab 系统配置文件,添加以下配置内容
sudo vim /etc/fstab

# 挂载 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
  • 挂载 ramfs
1
sudo mount -t ramfs ramfs /mnt/ramdisk
  • 开机自动挂载(可选)
1
2
3
4
5
# 编辑 fstab 系统配置文件,添加以下配置内容
sudo vim /etc/fstab

# 挂载 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 的使用

  • 将文件写入 Page Cache
1
cat video.mp4 > /dev/null
1
2
3
4
上述命令会:
- 强制把 `video.mp4` 文件从磁盘加载进内存
- 但不输出任何内容
- 后续程序读取 `video.mp4` 文件会命中缓存,不再产生磁盘 I/O
  • 查看缓存使用情况
1
2
# 查看内存使用情况,会看到 buff/cache 部分增大
free -h
  • 清除缓存(慎用,仅测试使用
1
2
3
4
5
# 将所有文件系统的缓存数据写回磁盘
sudo sync

# 清理页缓存、目录缓存和 inode 缓存
sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'

特别注意

在 Linux 生产环境中,不建议随意清缓存,否则会影响系统性能。

总结说明

  • tmpfsramfs、Page Cache 的优缺点
技术优点缺点适用场景
tmpfs 快、可限制容量、安全占用系统内存缓存文件、临时空间、多媒体文件读取
ramfs 极快不限容量,OOM 风险高测试、高速缓存(不推荐生产环境使用)
Page Cache 自动、透明、无需修改程序缓存不可控、可能被挤掉文件预加载(热加载)
  • tmpfsramfs 的主要区别
特性 tmpfsramfs
存储位置内存 + Swap 纯内存(永远不使用 Swap)
内存限制可限制大小(推荐)不可限制,体积可无限增长
系统内存压力大时会将部分数据 Swap 出去继续占用内存,最终导致系统 OOM
默认缓存行为文件内容存放在 Page Cache 中,这些页是可回收的,内核在内存压力大时可以回收或 Swap Out 文件内容同样存放在 Page Cache 中,但被标记为不可回收,不会 Swap Out,也不会被回收,因此会永久占用物理内存
OOM 风险低(可回收)极高(不可回收)
性能与 ramfs 速度差异极小,几乎相同比如 tmpfs 略快,但差距可以忽略
适用场景安全缓存、高性能临时存储特殊场景、嵌入式、需要可预测行为