Linux 性能优化实战
倪朋飞
资深 Linux 专家,Kubernetes 项目维护者
87256 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 65 讲
结束语 (1讲)
Linux 性能优化实战
15
15
1.0x
00:00/00:00
登录|注册

16 | 基础篇:怎么理解内存中的Buffer和Cache?

I/O 的变化情况
观察 Buffer 和 Cache 的变化情况
I/O 的变化情况
观察 Buffer 和 Cache 的变化情况
Slab 的一部分
内核页缓存和 Slab 用到的内存
内核缓冲区用到的内存
/proc/meminfo
区别
可用内存
缓存
已用内存
总内存
使用 /proc/<pid>/smaps 文件
统计所有进程的物理内存使用量
从写和读的角度分析
Buffer 和 Cache 的含义
场景2:磁盘和文件读案例
场景1:磁盘和文件写案例
SReclaimable
Cached
Buffers
查询内核运行状态和配置选项
用户与内核交互的接口
Linux 内核提供的特殊文件系统
proc 文件系统
Buffers 和 Cache 的说明
Buffer 和 Cache
包含的指标
free 输出界面
使用 free 和 top 工具查看内存使用情况
Linux 内存管理
思考
小结
案例
Buffers、Cached 和 SReclaimable 的含义
proc 文件系统
free 数据的来源
系统的内存使用情况
内存管理的基本原理
怎么理解内存中的Buffer和Cache?

该思维导图由 AI 生成,仅供参考

你好,我是倪朋飞。
上一节,我们梳理了 Linux 内存管理的基本原理,并学会了用 free 和 top 等工具,来查看系统和进程的内存使用情况。
内存和 CPU 的关系非常紧密,而内存管理本身也是很复杂的机制,所以感觉知识很硬核、很难啃,都是正常的。但还是那句话,初学时不用非得理解所有内容,继续往后学,多理解相关的概念并配合一定的实践之后,再回头复习往往会容易不少。当然,基本功不容放弃。
在今天的内容开始之前,我们先来回顾一下系统的内存使用情况,比如下面这个 free 输出界面:
# 注意不同版本的free输出可能会有所不同
$ free
total used free shared buff/cache available
Mem: 8169348 263524 6875352 668 1030472 7611064
Swap: 0 0 0
显然,这个界面包含了物理内存 Mem 和交换分区 Swap 的具体使用情况,比如总内存、已用内存、缓存、可用内存等。其中缓存是 Buffer 和 Cache 两部分的总和 。
这里的大部分指标都比较容易理解,但 Buffer 和 Cache 可能不太好区分。从字面上来说,Buffer 是缓冲区,而 Cache 是缓存,两者都是数据在内存中的临时存储。那么,你知道这两种“临时存储”有什么区别吗?
注:今天内容接下来的部分,Buffer 和 Cache 我会都用英文来表示,避免跟文中的“缓存”一词混淆。而文中的“缓存”,则通指内存中的临时存储。

free 数据的来源

确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了内存中的Buffer和Cache的概念及其区别,并通过实际案例展示了它们在不同场景下的使用情况。通过解释free命令输出中的Buffer和Cache的含义,并结合查询/proc/meminfo文件系统和使用vmstat命令,详细定义了这两个指标。观察vmstat的输出,读者可以清晰地了解到在不同操作下Buffer和Cache的变化情况,以及它们在内存管理中的作用。文章通过实际案例和清晰的解释,帮助读者更好地理解了内存中的Buffer和Cache的概念,为读者提供了深入的技术知识和实用的操作指导。文章还提出了一个思考题,引发读者思考如何统计出所有进程的物理内存使用量,为读者提供了进一步思考和探索的机会。文章内容丰富,技术性强,适合对内存管理和性能优化感兴趣的读者阅读学习。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Linux 性能优化实战》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(143)

  • 最新
  • 精选
  • 倪朋飞
    置顶
    关于磁盘和文件的区别,本来以为大家都懂了,所以没有细讲。磁盘是一个块设备,可以划分为不同的分区;在分区之上再创建文件系统,挂载到某个目录,之后才可以在这个目录中读写文件。 其实 Linux 中“一切皆文件”,而文章中提到的“文件”是普通文件,磁盘是块设备文件,这些大家可以执行 "ls -l <路径>" 查看它们的区别(输出的含义如果不懂请 man ls 查询)。 在读写普通文件时,会经过文件系统,由文件系统负责与磁盘交互;而读写磁盘或者分区时,就会跳过文件系统,也就是所谓的“裸I/O“。这两种读写方式所使用的缓存是不同的,也就是文中所讲的 Cache 和 Buffer 区别。 关于文件系统、磁盘以及 I/O 的原理,大家不要着急,后面 I/O 模块还会讲的。
    2018-12-26
    19
    435
  • Geek_5258f8
    理论上,一个文件读首先到Block Buffer, 然后到Page Cache。有了文件系统才有了Page Cache. 在老的Linux上这两个Cache是分开的。那这样对于文件数据,会被Cache两次。这种方案虽然简单, 但低效。后期Linux把这两个Cache统一了。对于文件,Page Cache指向Block Buffer,对于非文件 则是Block Buffer。这样就如文件实验的结果,文件操作,只影响Page Cache,Raw操作,则只影响Buffer. 比如一此VM虚拟机,则会越过File System,只接操作 Disk, 常说的Direct IO.

    作者回复: 👍

    2018-12-26
    11
    235
  • croco
    我好像明白了,就是/proc/<pid>/smaps中的Pss相加,因为Pss是私有内存+共享内存按比例属于自己计算的那一部分 比如私有内存是200k, 共享内存500k和4个其它进程共享,那么是Pss就是200k+(500/(1+4))=200k+100k=300k。 这样所有进程的Pss相加就不会有重复相加的顾虑,因为Pss中已经将共享内存部分帮我们算好了 参考命令:awk '/Pss:/{ sum += $2 } END { print sum }' /proc/$$/smaps

    作者回复: 嗯嗯

    2019-06-13
    2
    58
  • acm1204
    socket buffer属于哪一类?

    作者回复: cache

    2019-04-08
    28
  • David.cui
    数据库使用裸设备是明显的磁盘读写;如果数据库的数据文件在文件系统上就是文件读写。这样理解对么

    作者回复: 对的

    2018-12-26
    2
    20
  • JJ
    还是有点困惑,感觉读写磁盘上的数据不就是读写磁盘上的文件里的数据嘛,难道读磁盘上的数据可以不经过文件系统吗,可以直接读裸磁盘?有点没理解buffer是磁盘上的数据缓存,cache是文件数据缓存,求大神解答下。。

    作者回复: 请参考置顶回复

    2018-12-26
    2
    18
  • Mr.Strive.Z.H.L
    老师您好,有一个疑惑: 数据写入到page cache。后续应用程序强制刷盘或者系统自动刷盘的时候,page cache中的数据还会经过buffer,然后再到块设备吗?还是不会经过buffer,直接刷到块设备了? (读取比较好理解,读取文件直接到page cache,读取块设备先到buffer,buffer不够再到page cache)

    作者回复: 早期的Linux会的,也就是cache两次。不过现在不会了,只会经过一层cache。

    2019-01-22
    3
    13
  • 某、人
    老师,是否绕开文件系统,直接对磁盘进行读写会更快呢?

    作者回复: 去掉缓存的话,文件系统比磁盘又多了一层,所以有可能比直接磁盘读写慢。但文件系统也有缓存,所以大部分情况下不绕开会更快

    2018-12-26
    13
  • 吴林辉
    “因为 Linux 中块的大小是 1KB,所以这个单位也就等价于 KB/s。”关于这一点,想请问下老师,linux block的大小不是4KB呢?

    作者回复: 这句话来自vmstat的文档:https://linux.die.net/man/8/vmstat 通常说的的 Block Size 是磁盘分区的块大小,的确都是 4KB 了。

    2019-02-18
    3
    10
  • 无名老卒
    看了这篇文章,终于理解 了buffers以及cache,之前在网上还专门查过这2者的区别,但就是像老师说的那样,文章看下来,啥也没有啥明白。 按照老师的总结,cache是针对文件系统的缓存 ,而buffers是对磁盘数据的缓存,是直接跟硬件那一层相关的,那一般来说,cache会比buffers的数量大了很多。生产环境下面看了多台机器,的确如此。 后面留的那个作业,如果要统计一个进程所占用的物理空间,我的做法是累加RSS的值。如下shell是我工作中所使用的命令,取内存占用top10的进程: for i in $( ls /proc/ |grep "^[0-9]"|awk '$0 >100') ;do cmd="";[ -f /proc/$i/cmdline ] && cmd=`cat /proc/$i/cmdline`;[ "$cmd"X = ""X ] && cmd=$i;awk -v i="$cmd" '/Rss:/{a=a+$2}END{printf("%s:%d\n",i,a)}' /proc/$i/smaps 2>/dev/null; done | sort -t: -k2nr | head -10

    作者回复: 总结的不错,不过计算方法还是不太准确。可以继续查一下PSS和PSS的区别

    2018-12-27
    3
    8
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部