Linux 内核之页高速缓存与页回写

 
 

1. 什么是页高速缓存,作用是什么

概念:Linux内核实现磁盘缓存的技术就叫页高速缓存。即把磁盘中的数据缓存到物理内存中,把对磁盘的访问转换为对物理内存的访问。(物理内存的最小单位为页,页高速缓存缓存的是内存页面,所以叫高速缓存)   作用:减少对磁盘I/O的操作,提高系统性能

2. 为什么页高速缓存会带来性能的提高

  1. 访问物理内存的速度远远快于访问磁盘的速度(ns与ms的数量级差距)。所以将数据放入页高速缓存中可以更快的访问数据。
  2. 临时局部原理。数据一旦被访问后,短时间内有极大会再一次被访问。短时间内集中访问同一数据的原理就叫做临时局部原理。因此,对于经常需要被访问的数据,如果将其放入缓存中,那就有可能再次被页高速缓存命中。

3. 有了缓存后,怎么访问数据呢(读缓存)?

比如读一个文件,大致流程如下:

  • 内核开始一个读操作,首先检查页高速缓存中是否有该数据
  • 如果有,则直接读取。这一步叫做缓存命中;如果没有,则直接从磁盘读写,这叫未缓存命中
  • 内核调度块I/O操作从磁盘中读取数据,并将全部数据或者部分数据放入页高速缓存中。注意:缓存谁是取决于谁被访问到。系统不一定将文件中全部放入内存,可能只是部分内容。

4.页高速缓存大下是固定的吗?

页高速缓存的大小不是固定的,它可以通过占用空闲内存以扩张大小,也可以通过自我收缩而减轻内存压力。

5. 页高速缓存的机制有哪些?

页高速缓存主要有3种机制来保证读、写缓存以及释放缓存,分别如下:

  • 读缓存
  • 写缓存
  • 缓存回收

读缓在第3个问题中已经有描述了,此处不做赘述。主要讲下写缓存和缓存回收。

5.1 写缓存

内核需要从磁盘读数据时,如果在页高速缓存中没有读到数据,就会直接从磁盘中读取数据并将数据存入页高速缓存中,以保证下次名中。而写缓存在写磁盘时会有3种策略: 1. 不缓存。这种做法也叫做直接I/O。数据写入磁盘时,不经过页高速缓存,而是直接将数据写入磁盘。这种做法的缺点很明显,如果下次需要读这个数据时,因为页高速缓存无此数据,因此需要直接从磁盘读取,需要额外开销。因此该策略很少使用。 2. 写透缓存。即写操作更新内存缓存,同时也更新磁盘文件。该策略可以保持缓存一致性——缓存数据的同时在后备存储(磁盘)保持同步。 3. 回写。程序执行写操作直接将数据写到缓存中,然后将页高速缓存中被写入的页面标记为"脏",并且将这些“脏”页面加入到脏链表中。最后,回写进程会将脏链表中的脏页刷新到磁盘中,最终做到保证磁盘和内存中数据的一致性。目前主流测写缓存策略就是回写策略。

5.2 缓存回收

缓存回收作用有3:缓存中的数据清除(即清除页的数据);为更重要的缓存项提供空闲物理页;为了收缩缓存大小,以减轻内存的压力。缓存中的什么内容将被清除的策略或者什么样的干净页可以回收的策略,就叫做缓存策略。   Linux的缓存回收是通过选择干净页(非脏页)进行简单地替换——注意:干净页也是有数据的,只不过这个页此时没有回写操作罢了。如果干净页不够的话,内核强制进行回写操作,以释放出更多的干净页。   但是,哪些干净页是可以回收的呢?不能够随随便便的就回收一个干净页啊。对于回收策略Linux内核提供了两种方法: 1. 最近最少使用   简称LRU。LRU回收策略需要跟踪每个页面的访问踪迹,以便回收最老时间戳的页面。该算法的效果在于:缓存的数据越久未被访问,则越大可能不会再次被访问,而近期访问的,则很大可能会再次被访问。   但是,LRU有一个致命的缺点——内核无法预测一个文件只会被访问一次后不会再被访问。

2. 双链策略   这个是修改过后的LRU,内核维护的不再是一个LRU链表,而是两个:活跃链表和非活跃链表。处于活跃链表的页面被认为是‘热’的,且不会被换出(回收);而在非活跃链表上的也是会被回收的。

5.3 脏数据什么时候被写到磁盘中?

脏数据:页高速缓存的数据比后台存储的数据更加新的时候,这些数据就叫做脏数据   脏数据被回写到磁盘的时机有3种:

  • 当空闲内存低于一个特定阈值时。内核必须回写数据以释放内存,因为缓存回收只能回收干净页。当干净页数量足够多时,内核就会收缩缓存,释放内存。该值可以通过修改/proc/sys/vm/dirty_background_ratio设定(这个值是百分比,入文件中数字为10,则表示占全部内存的10%)
  • 当脏页在内存中存储时间超过一个阈值后,内核必须将脏页回写入磁盘,确保脏页不会无限期驻留内存
  • 用户进程显示调用sync()和fsync()系统调用时,内核会按要求将数据回写进磁盘。

以上工作均有一群pdflush线程执行。为什么是一群了?想象下,如果是单个线程,当回写操作很多时,就会造成拥塞。这是因为单一线程可能堵塞在某个设备的已拥塞请求队列(正在等待将请求提交给磁盘的I/O请求队列上),而其他设备的请求队列无法得到处理。

5.4 页面回写可以人为设置吗?

答案是可以的,上面讲脏数据写会磁盘时,就已经讲了一个例子了,这里做一下汇总。

变量功能
/proc/sys/vm/dirty_background_ratio空闲内存阈值,占全部内存的百分比。内存中的空闲页低于这个比例时,pdflush线程开始回写脏页
/proc/sys/vm/dirty_ratio空闲内存阈值,占全部内存的百分比。当一个进程产生的脏页达到这个比例时,开始回写
/proc/sys/vm/laptop_mode布尔值。用于控制膝上型计算机模式

6. 什么是膝上型计算机模式

这是一个特殊的回写策略,该策略主要目标是:硬盘转动的机械行为最小化,允许硬盘尽可能的长时间停滞,以此延长电池供电时间。目前在我司的线上环境中,没有见过有启用该策略的服务器==

页高速缓存和页回写是必须要搞清楚的,共作中很多情况都要考虑到这一点,比如写计划任务时,如果计划任务中有操作同一个文件的,那这里就会有一个坑,这点我会在其他文章中提到~~~

7.磁盘缓存和磁盘缓冲的区别和联系是什么?缓存需要缓冲吗?缓冲又需要缓存吗?

区别:缓存是针对文件;而缓冲是针对块设备的。   页高速缓存是缓存了缓存冲的,这一部分就叫做缓冲区高速缓存,需要注意的是,缓冲区高速缓存是没有作为独立缓存的,而是作为页高速缓存的一部分。   关于缓存和缓冲之间的联系与区别,可以参考合在页高速缓存里面的缓冲区高速缓存 这篇文章,这里就没必要做陈述了。

8. Linux如何查看缓存以及如何释放缓存了?

查看缓存可以使用free命令,或这top。或者直接看/proc/meminfo

[root@master ~]# free -m
             total       used       free     shared    buffers     cached
Mem:           980        410        570          0         78         30
-/+ buffers/cache:        301        679
Swap:         1999          0       1999

这里补充下:Linux中的空闲内存,是物理free+cache+buffer的总和,比如这里就是570+78+30=678。可以看出这个值和第三行的free值吻合。

最后讲下如何手动释放缓存

首先执行sync命令,然后更改 /proc/sys/vm/drop_caches 文件值(默认值为0),偷个懒,直接引用下内核文档吧

To free pagecache: echo 1 > /proc/sys/vm/drop_caches
To free reclaimable slab objects (includes dentries and inodes):** echo 2 > /proc/sys/vm/drop_caches**
To free slab objects and pagecache: echo 3 > /proc/sys/vm/drop_caches

手动清除缓存,看下效果

[root@master ~]# free -m
             total       used       free     shared    buffers     cached
Mem:           980        410        570          0         78         30
-/+ buffers/cache:        301        679
Swap:         1999          0       1999
[root@master ~]# sync 
[root@master ~]# echo 3 > /proc/sys/vm/drop_caches 
[root@master ~]# free -m
             total       used       free     shared    buffers     cached
Mem:           980        290        690          0          0         15
-/+ buffers/cache:        274        705
Swap:         1999          0       1999

可以发现,buffer和cache值都减小了,物理内存值增大了,这正是回收缓存和缓冲所致。

缓存和页回写就写到这里,关于内存,其实还有很多要写,比如slab机制,OMM-Killer机制,这些我会在后续文章中提到。



作者:燕涛
链接:http://www.jianshu.com/p/d33ec2707e7f
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值