转载:一文看懂 Linux 的 Buffer 和 Cache,到底有啥区别?
“为啥我 free 命令看内存用得这么多,但系统却不慢?”
“Buffer 和 Cache 是不是都可以释放?”
“Linux 是不是偷了我的内存?”
很多刚接触 Linux 的人看到系统内存的使用情况时,都会一脸疑惑。
今天这篇文章,就来一次性讲清楚——Buffer 和 Cache 到底有啥区别?
🔍 一、先看 free 命令输出
$ free -h total used free shared buff/cache available Mem: 16Gi 2.3Gi 1.2Gi 200Mi 12Gi 13Gi
你可能会惊讶地发现:
🤔 “怎么我 16G 的内存,buff/cache 就占了 12G?!”
别急,其实这是 Linux 的“聪明用法”,并不代表真的占用。
🧱 二、什么是 Buffer?
✅ Buffer 是为了加速“写磁盘”!
- • 数据写入磁盘通常比较慢
- • Linux 会先把写入数据暂时存放在内存中(就是 Buffer)
- • 等待系统空闲时,批量写入磁盘(提高性能)
📌 举个例子:
你 cp 了一个大文件,Linux 先放到 Buffer 里,等稍后一起写到硬盘。
🧠 三、什么是 Cache?
✅ Cache 是为了加速“读磁盘”!
- • 如果你访问过某个文件,Linux 会把它缓存到内存中
- • 下次访问时,直接从内存中读取,速度飞快
- • 这部分就是 Page Cache,通常就叫 Cache
📌 举个例子:
你 cat 了一个日志文件,Linux 会把它缓存到 Cache 中,下一次就不再从磁盘读。
🔍 四、Buffer 和 Cache 的本质区别
对比项 | Buffer | Cache |
主要作用 | 写入数据的临时缓冲区 | 读取数据的缓存区 |
使用场景 | 写磁盘优化 | 读磁盘优化 |
类型 | 块设备缓存(block device) | 文件系统缓存(page cache) |
生命周期 | 写入完就可以释放 | 可能长期驻留,直到内存紧张 |
是否可释放 | 是,系统会根据内存压力动态回收 | 是,回收机制同样存在 |
🧪 五、你可以手动释放它们
# 同时释放 Page Cache、目录项和 inode sudo sync; echo 3 > /proc/sys/vm/drop_caches
参数值 | 含义 |
1 | 释放页缓存(Page Cache) |
2 | 释放目录项和 inode |
3 | 同时释放 Page Cache 和 Buffer |
⚠️ 注意:这不是优化手段,不建议频繁使用,仅用于调试或测试。
🧰 六、怎么判断 Cache 有没有效果?
使用 vfsstat
或 iostat
工具可以看到实际命中率:
# 查看磁盘的读写情况 iostat -x 1 # 查看文件系统命中率 cat /proc/meminfo | grep -E 'Cached|Buffers'
你会发现,其实很多文件第二次访问时几乎不再走磁盘,性能提升巨大。
总结
✅ Buffer 是“写磁盘”的中转站,Cache 是“读磁盘”的加速器。
✅ 看似占了很多内存,其实是 Linux 利用了“闲置内存”来加速系统性能。