Linux内存性能优化
倪朋飞
微软资深工程师,Kubernetes项目维护者
立即订阅
0 人已学习
课程目录
已完结 7 讲
01| 基础篇:Linux内存是怎么工作的?
02 | 基础篇:怎么理解内存中的Buffer和Cache?
03 | 案例篇:如何利用系统缓存优化程序的运行效率?
04 | 案例篇:内存泄漏了,我该如何定位和处理?
05 | 案例篇:为什么系统的Swap变高了(上)
06 | 案例篇:为什么系统的Swap变高了?(下)
07 | 套路篇:如何“快准狠”找到系统内存的问题?
Linux内存性能优化
登录|注册

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

倪鹏飞 2019-11-06
你好,我是倪朋飞。
上一节,我们梳理了 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/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Linux内存性能优化》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(9)

  • 清风浊酒
    文章中的文件数据和磁盘数据分别指什么?
    2019-11-15
    1
    11
  • Hongyue
    写磁盘和写文件有什么区别?
    2019-11-16
    1
    3
  • 骑着蜗牛的兔子
    读完文章,我和大家一样,最不清楚的是文件读和磁盘读的本质区别,文件不也是放在磁盘上的吗?如果文件的数据不在缓存中,那不也应该会去磁盘读取吗?请作者抽时间给解释一下
    2019-11-21
  • 廖卓笛
    什么叫磁盘分区处于未使用状态
    2019-11-20
    1
  • Chandler Liu
    不是说buffer一般不会太大,只有20MB左右,但案例中已经超过了1G。是因为峰值吗?过一段时间会flush回到20MB吗?
    2019-11-20
  • Geek_527694
    块设备:系统能够随机无序访问固定大小的数据片的设备,这些数据片称为块。块设备是以固定大小长度来传送资料的,它使用缓冲区暂存数据,时机成熟后从缓存中一次性写入到设备或者从设备中一次性放到缓存区。常见的块设备有硬盘、CD-ROM驱动器、Flash闪存等等,它们也是通过文件形式存在于Linux中的。
    字符设备:按照字符流方式被有序访问,以不定长度的字元传送资料,不存在缓冲区,所以对这种设备的读写都是实时的,如打印机。

    缓存(Cache)存的是从磁盘读取的file blocks,我觉的有从内存读、从磁盘读这些说法

    很不明白 从文件读vs从磁盘读、写文件vs写磁盘
    2019-11-18
  • Jzzw
    版本rhel6.8
    man里面讲的不全,按照老师的提示 cat /proc/$pid/smaps 有以下几列
    Size: 92 kB
    Rss: 64 kB
    Pss: 64 kB
    Shared_Clean: 0 kB
    Shared_Dirty: 0 kB
    Private_Clean: 0 kB
    Private_Dirty: 64 kB
    Referenced: 8 kB
    Anonymous: 64 kB
    AnonHugePages: 0 kB
    Swap: 20 kB
    KernelPageSize: 4 kB
    MMUPageSize: 4 kB
    VmFlags: rd wr mr mw me gd ac

    从网上查到Rss(Resident Set Size)和Pss(Proportional Set Size)的区别是一个是包含共享库的实际使用内存,一个是按比例分配共享库后的实际使用内存,各进程占用内存相加的话,Rss会有重叠部分而Pss不会
    把proc下面所有进程下面的smaps里的Pss相加,应该就是实际的物理内存占用

    [root@rhel6 ~]# cat /proc/*/smaps |grep Pss |awk '{sum +=$2};END {print sum"K"}'

    但这个查出来的结果 和我想象中相比小了不少
    2019-11-18
  • Geek_81c7c9
    如楼上两位留言,建议作者简单普及一下存储基础背景知识,比如块设备和文件系统的区别。另外dd的时候如果用直写模式,不知道buffer/cache是不是就不会变?回头我也试试
    2019-11-17
  • Roger68
    文件最终不是也存储在磁盘的吗
    2019-11-17
收起评论
9
返回
顶部