性能优化理论篇 | Cache VS Buffer,傻傻分不清 ?

性能优化系列目录:
性能优化理论篇 | 彻底弄懂系统平均负载
性能优化理论篇 | swap area是个什么东西

从free命令开始

free 命令是一个在类 Unix 操作系统中用于显示内存使用情况的工具。它的输出包含了系统内存的不同方面,如总内存、已用内存、空闲内存等。理解这些数据之间的关系可以帮助你更好地监控和优化系统性能。

输出中各个字段的解释如下:

  • total: 系统中物理内存的总量。
  • used: 当前正在被进程和操作系统使用的内存量。这包括了正在使用的内存以及已分配但当前未使用的内存。
  • free: 未被分配的内存。这是可以分配给新进程或操作系统使用的内存。
  • shared: 不同进程间共享的内存量。这通常包括共享库或进程间通信所用的内存。
  • buff:块设备的读写缓冲区,更靠近存储设备,或者直接就是disk的缓冲区
  • cached:page cache的内存, 文件系统的cache,是memory的缓冲区。
  • available: 估算的可用内存量,包含缓冲和缓存的空间。因为如果需要这2部分内存可以被释放供新应用程序或进程使用。

这些数据之间的关系如下:

  • 物理内存的总量(total) = 已用内存(used) + 空闲内存(free) + 缓存/缓冲区内存(buff/cache)
  • 系统实际的可用内存(available) = 空闲内存(free) + 缓存/缓冲区内存(buff/cache
  • 交换空间的总量(Swap: total) = 已用交换空间(used) + 空闲交换空间(free)

注意:物理内存的总量不需要加上shared的空间,shared 字段表示被多个进程共享的内存量。已经包含在 used 和 buff/cache 中,因此不需要单独加上 shared 的值来计算总的物理内存。

从上面的输出可以看出,你会发现系统有大约 8 GB 的 RAM,其中 1.1 GB 已经被使用了,46 MB 用于共享内存,2.7 GB 用于存储缓冲区和缓存,可以空间是6.3GB。

free 命令显示的数据来自" /proc/meminfo"文件,这是 Linux 中的一种特殊文件,提供有关系统内存的使用情况和统计信息。

在这些内存的概念中,有2个概念非常容易弄混------Buffers和Cache,很多人总是将它们当成一个东西来看待,这是一种误区。

下面我们通过两个实验来说明。

Buffers 实验

首先,打开终端清除缓存以获得更准确的测试结果。可以使用以下命令:

bash 复制代码
$ free -mh
$ echo 3 > /proc/sys/vm/drop_caches
$ free -mh

命令" echo 3 > /proc/sys/vm/drop_caches"用于清除Linux内核页面缓存中的缓存数据。其中的" 3"表示同时清除页面缓存和slab缓存。

然后,在另一个终端运行" vmstat 2"命令,每隔2s显示与虚拟内存相关的统计数据。

上图中,大家只需要关注" buff"这个表示缓冲区的列,以及" cache"这个表示缓存的列,单位都是KB。

接着,再启动一个窗口使用dd 命令

bash 复制代码
$ dd if=/dev/sda3 of=/dev/null bs=100M count=500

再切换到运行" vmstat 2"命令的窗口,观察" buff"列和" cache"列的变化,您会注意到,在使用 dd 命令读取磁盘时,缓冲区buffer和缓存cache的大小都会增加,但缓冲区buffer的增长速度明显更快。

Cache 实验

同样,实验前,使用以下命令清除文件系统缓存:

bash 复制代码
$ free -mh
$ echo 3 > /proc/sys/vm/drop_caches
$ free -mh

开个新终端窗口执行vmstat便于观察" buff"和" cache"的变化

再开个窗口运行以下命令:

bash 复制代码
$ dd if=/dev/zero of=testfile bs=100M count=500

现在,立即切换回之前运行" vmstat 2"命令的终端窗口,观察" buff"列和" cache"列的变化," cache"列的值一直在增加,而" buff"列的值基本不变。

这两个实验的输出结果证明了:当从磁盘读取时,数据会存储在缓冲区Buffer中,而读取文件则会导致数据存储在缓存Cache中。

简单来说,你可以理解缓冲区Buffer是用来缓存正在读取或写入到磁盘的数据。而缓存Cache是用来缓存正在读取或写入到文件的数据。

相关推荐
爱喝水的鱼丶2 小时前
SAP-ABAP:ALV数据导出增强——实现Excel/PDF/CSV多格式自定义导出
开发语言·性能优化·sap·abap·erp
春卷同学4 小时前
HarmonyOS掌上记账APP开发实践第22篇:Scroll + List 虚拟列表 — 长列表性能优化全攻略
性能优化·list·harmonyos
丁小未16 小时前
Unity 极致高效的IM设计方案教程
unity·性能优化·游戏引擎·im
SelectDB20 小时前
快手从 ClickHouse 到 Apache Doris 的百 PB 数据、200+集群迁移实践
数据库·性能优化·开源
Ashley的成长之路1 天前
前端性能优化实战手册·第1篇:从 Lighthouse 60 到 95 的完整路径
前端·性能优化
不羁的木木2 天前
HarmonyOS APP实战-基于Image Kit的图像处理APP - 第12篇:性能优化与内存管理
图像处理·性能优化·harmonyos
2301_768103492 天前
HarmonyOS趣味相机实战第5篇:CameraKit资源释放、PixelMap生命周期与预览黑屏排查
性能优化·harmonyos·arkts·camerakit·pixelmap
段一凡-华北理工大学2 天前
AI Agent 从入门到封神:24 讲打造你的超级智能体~系列文章23:从Demo到上线:Agent应用的架构设计、性能优化与成本控制实战
运维·网络·人工智能·性能优化·高炉炼铁·工业智能体
大师兄66682 天前
HarmonyOS7 长列表性能优化:渲染与内存双提升
性能优化·长列表·harmonyos7
X1A0RAN2 天前
Python 并发请求性能优化实战
python·性能优化·并发编程