16 | 基础篇:怎么理解内存中的Buffer和Cache?
倪朋飞
该思维导图由 AI 生成,仅供参考
你好,我是倪朋飞。
上一节,我们梳理了 Linux 内存管理的基本原理,并学会了用 free 和 top 等工具,来查看系统和进程的内存使用情况。
内存和 CPU 的关系非常紧密,而内存管理本身也是很复杂的机制,所以感觉知识很硬核、很难啃,都是正常的。但还是那句话,初学时不用非得理解所有内容,继续往后学,多理解相关的概念并配合一定的实践之后,再回头复习往往会容易不少。当然,基本功不容放弃。
在今天的内容开始之前,我们先来回顾一下系统的内存使用情况,比如下面这个 free 输出界面:
显然,这个界面包含了物理内存 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
《Linux 性能优化实战》,新⼈⾸单¥68
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(143)
- 最新
- 精选
- 倪朋飞置顶关于磁盘和文件的区别,本来以为大家都懂了,所以没有细讲。磁盘是一个块设备,可以划分为不同的分区;在分区之上再创建文件系统,挂载到某个目录,之后才可以在这个目录中读写文件。 其实 Linux 中“一切皆文件”,而文章中提到的“文件”是普通文件,磁盘是块设备文件,这些大家可以执行 "ls -l <路径>" 查看它们的区别(输出的含义如果不懂请 man ls 查询)。 在读写普通文件时,会经过文件系统,由文件系统负责与磁盘交互;而读写磁盘或者分区时,就会跳过文件系统,也就是所谓的“裸I/O“。这两种读写方式所使用的缓存是不同的,也就是文中所讲的 Cache 和 Buffer 区别。 关于文件系统、磁盘以及 I/O 的原理,大家不要着急,后面 I/O 模块还会讲的。2018-12-2619435
- 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-2611235 - 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-13258 - acm1204socket buffer属于哪一类?
作者回复: cache
2019-04-0828 - David.cui数据库使用裸设备是明显的磁盘读写;如果数据库的数据文件在文件系统上就是文件读写。这样理解对么
作者回复: 对的
2018-12-26220 - JJ还是有点困惑,感觉读写磁盘上的数据不就是读写磁盘上的文件里的数据嘛,难道读磁盘上的数据可以不经过文件系统吗,可以直接读裸磁盘?有点没理解buffer是磁盘上的数据缓存,cache是文件数据缓存,求大神解答下。。
作者回复: 请参考置顶回复
2018-12-26218 - Mr.Strive.Z.H.L老师您好,有一个疑惑: 数据写入到page cache。后续应用程序强制刷盘或者系统自动刷盘的时候,page cache中的数据还会经过buffer,然后再到块设备吗?还是不会经过buffer,直接刷到块设备了? (读取比较好理解,读取文件直接到page cache,读取块设备先到buffer,buffer不够再到page cache)
作者回复: 早期的Linux会的,也就是cache两次。不过现在不会了,只会经过一层cache。
2019-01-22313 - 某、人老师,是否绕开文件系统,直接对磁盘进行读写会更快呢?
作者回复: 去掉缓存的话,文件系统比磁盘又多了一层,所以有可能比直接磁盘读写慢。但文件系统也有缓存,所以大部分情况下不绕开会更快
2018-12-2613 - 吴林辉“因为 Linux 中块的大小是 1KB,所以这个单位也就等价于 KB/s。”关于这一点,想请问下老师,linux block的大小不是4KB呢?
作者回复: 这句话来自vmstat的文档:https://linux.die.net/man/8/vmstat 通常说的的 Block Size 是磁盘分区的块大小,的确都是 4KB 了。
2019-02-18310 - 无名老卒看了这篇文章,终于理解 了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-2738
收起评论