闲话缓存:ZFS 读缓存深入研究-ARC(二)

摘要:
·ZFSARC可以同时支持多个块大小。ZFSARC允许锁定某些页面,以便它们不会过时。虽然自动将过时页面放入L2ARC似乎是正确的逻辑,但这将产生非常严重的负面影响。首先,突发顺序读取将覆盖L2ARC缓存中的许多页面,因此这种突发顺序读取会在短时间内消除L2ARC缓存的许多页面。因此,L2ARC被该脉冲串读数污染的概率将降低。ZFSARC利用了他们的基本操作理论,因此命中率的效益应该与原始设计类似。

Solaris ZFS ARC的改动(相对于IBM ARC

如我前面所说,ZFS实现的ARC和IBM提出的ARC淘汰算法并不是完全一致的。在某些方面,它做了一些扩展:

·         ZFS ARC是一个缓存容量可变的缓存算法,它的容量可以根据系统可用内存的状态进行调整。当系统内存比较充裕的时候,它的容量可以自动增加。当系统内存比较紧张(其它事情需要内存)的时候,它的容量可以自动减少。

·         ZFS ARC可以同时支持多种块大小。原始的实现假设所有的块都是相同大小的。

·         ZFS ARC允许把一些页面锁住,以使它们不会被淘汰。这个特性可以防止缓存淘汰一些正在使用的页面。原始的设计没有这个特性,所以在ZFS ARC中,选择淘汰页面的算法要更复杂些。它一般选择淘汰最旧的可淘汰页面。

有一些其它的变更,但是我把它们留在对arc.c这个源文件讲解的演讲中。

L2ARC

L2ARC保持着上面几个段落中没涉及到的一个模型。ARC并不自动地把那些淘汰的页面移进L2ARC,而是真正淘汰它们。虽然把淘汰页面自动放入L2ARC是一个看起来正确的逻辑,但是这却会带来十分严重负面影响。首先,一个突发的顺序读会覆盖掉L2ARC缓存中的很多的页面,以至于这样的一次突发顺序读会短时间内淘汰很多L2ARC中的页面。这是我们不期望的动作。

另一个问题是:让我们假设一下,你的应用需要大量的堆内存。这种更改过的Solaris ARC能够调整它自己的容量以提供更多的可用内存。当你的应用程序申请内存时,ARC缓存容量必须 变得越来越小。你必须立即淘汰大量的内存页面。如果每个页面被淘汰的页面都写入L2ARC,这将会增加大量的延时直到你的系统能够提供更多的内存,因为你必须等待所有淘汰页面在被淘汰之前写入L2ARC。

L2ARC机制用另一种稍微不同的手段来处理这个问题:有一个叫l2arc_feed_thread会遍历那些很快就会被淘汰的页面(LRU和LFU链表的末尾一些页面),并把它们写入一个8M的buffer中。从这里开始,另一个线程write_hand会在一个写操作中把它们写入L2ARC。

这个算法有以下一些好处:释放内存的延时不会因为淘汰页面而增加。在一次突发的顺序读而引起了大量淘汰页面的情况下,这些数据块会被淘汰出去在l2arc——feed_thread遍历到那两个链表结尾之前。所以L2ARC被这种突发读污染的几率会减少(虽然不能完全的避免被污染)。

结论

Adjustable Replacement Cache的设计比普通的LRU缓存设计有效很多。Megiddo和 Modha用它们的Adaptive Replacement Cache得出了更好的命中率。ZFS ARC利用了它们的基本操作理论,所以命中率的好处应该与原始设计差不多。更重要的是:如果这个缓存算法帮助它们得出更好的命中率时,用SSD做大缓存的想法就变得更加切实可行。

想了解更多?

1.      The theory of ARC operation in One Up on LRU, written by Megiddo and Modha, IBM Almanden Research Center

2.      ZFS ARC源代码:http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/uts/common/fs/zfs/arc.c

免责声明:文章转载自《闲话缓存:ZFS 读缓存深入研究-ARC(二)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇python 监控主机tcp状态脚本制作B站直播简介下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Asp.Net 4.0 新特性之 使用自定义OutputCache Provider

Asp.Net 4.0 新特性之 使用自定义OutputCache Provider 在Asp.Net 4.0 的web.config文件中添加了关于缓存的配置节,如下所示: <system.web> <compilation debug="true" targetFramework="4.0" /> <...

微信小游戏的本地缓存和清除的使用 (text.js image.js file-util.js)

 参考: 微信小游戏,文件系统 UpdateManager-小游戏 一、Egret提供的本地缓存工具类( 备注:新版本进行了修改,并增加了sound.js等) 在微信小游戏项目中,Egret提供了file-util.js、image.js、text.js来控制微信的50M缓存。 二、尝试缓存一个json文件 现在我们尝试使用text.js来缓存json配...

H5 缓存机制解析

在web项目开发中,我们可能都曾碰到过这样一个棘手的问题: 线上项目需要更新一个有问题的资源(可能是图片,js,css,json数据等),这个资源已经发布了很长一段时间,为什么页面在浏览器里打开还是没有看到更新? 有些web开发经验的同学应该马上会想到,可能是资源发布出了岔子导致没有实际发布成功,更大的可能是老的资源被缓存了。说到web缓存,首先我们要弄...

引用静态资源时加上时间戳,处理浏览器缓存问题

项目问题 更新上传CSS文件或JS文件后,安卓手机浏览器刷新,页面样式没有改变 问题解决 利用PHP语言,在引用静态资源时加上时间戳 1 <link rel="stylesheet" type="text/css" href="http://t.zoukankan.com/css/style.css?time=<?php echo date("...

如何修改phpstorm的缓存目录

相信使用phpstorm的人们都被缓存目录的大小困扰过。怎么修改到其它地方呢? 1. 找到idea.properties 文件,配置信息都在此文件中,F:Program FilesJetBrainsPhpStorm 2018.1.6in 按照自己的安装目录修改就可以。 2. 3. 图中红框的位置,默认时没有下面黑色代码的,拷贝出来,修改为要保存的地址重启p...

Sqlserver内存管理:限制最大占用内存

一、Sqlserver对系统内存的管理原则是:按需分配,且贪婪(用完不还)。它不会自动释放内存,因此执行结果集大的sql语句时,数据取出后,会一直占用内存,直到占满机器内存(并不会撑满,还是有个最大限制,比机器内存稍小),在重启服务前,sqlserver不会释放该内存,也没有任何办法可人为释放。以下命令虽然可释放缓存,但sqlserver并不会因此释放已占...