ATS中的RAM缓存简介

2024-03-18 15:18
文章标签 缓存 简介 ats ram

本文主要是介绍ATS中的RAM缓存简介,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

RAM缓存

新RAM缓存算法(CLFUS)

新的RAM缓存使用的创意来自许多缓存替换策略和算法,包括LRU,LFU,CLOCK,GDFS及2Q,它被命名为时钟周期内最小频繁使用大小算法CLFUS(Clocked Least Frequently Used by Size)。它避开了任何专利算法,具有如下特性:

  • 均衡最近性(Recentness),频率(Frequency)和大小(Size)以最大化命中率(hit byte,不是字节命中率byte hit rate)
  • 耐扫描(scan resistant),命中率提取可靠,即使工作集并不适应RAM Cache
  • 支持3级压缩率: fastlz, gzip(libz库)和xz(liblzma库),压缩工作可以移至另外一个线程处理
  • 非常低的CPU开销,仅略高于基础的LRU,没有使用O(lgn)堆,而是使用O(1)成本的概率替换策略(probabilistic replacement policy)
  • 相对低的内存开销,内存中的每个对象平均大约200字节

强调命中率而不是字节命中率的合理性,是因为从次级存储设备(硬盘)读取更多字节的开销(overhead)较之一个请求的成本(cost)更低。

RAM缓存由最前面的两个LRU/CLOCK对象哈希链表和一个seen哈希表组成。第一个缓存链表包含内存中的对象,但是第二个链表包含了近来放入缓存中或者打算放入缓存中的对象的历史信息(history of objects),seen哈希表用来使算法耐扫描。

下表中的元素(对应源码中的RamCacheCLFUSEntry)记录了下面的信息:

  • key
    16字节的唯一对象标识符
  • auxkeys
    相当于8字节的版本号(系统中分区的块),当对象的版本号改变时,旧元素将从缓存中删除掉
  • hits
    当前时钟周期内的命中数
  • size
    缓存中对象的大小,包括填充
  • len
    对象的实际长度,因为压缩和填充的原因,和size有区别。
  • compressed_len
    对象压缩后的长度
  • compressed
    压缩类型,可能的值是fastlz, libz和liblzma,不可压缩时值为none
  • uncompressible
    true表示对象内容可以压缩,false表示不可压缩
  • copy
    对象是否应该复制进来或复制出去(比如,HTTP HDR)
  • LRU link
    所在的LRU链表,有两个(cached list和history list)
  • HASH link
    所在bucket的双链表
  • IOBufferData
    数据缓存(data buffer)的智能指针

缓存接口是Get和Put操作,Get操作检查一个对象是否在缓存中,在将要读取时调用,Put操作决定是否将给定的对象放入缓存中,它在从磁盘中读取对象后调用。

RamCacheCLFUS::get伪代码算法分析:
if X is in cached list thenmove X to the tail of cached list, and return the data in X
else if X is in history list thenmove X to the tail of history list"cache miss"
else"cache miss"
end ifRamCacheCLFUS::put伪代码算法分析:
if X is in cached list thenmove X to the tail of cached list, and update its data
else if X is in history list thenif cached list has room to place X theninsert X to the tail of cached list, and update its dataelsecreate list Vdo                  pop one page Y from cached list//simulate the aging algorithm, for avoiding cache pollution pop one page Z from history listif HIT_VALUE(Z) is not greater than 1 thendelete Zelse let the HIT_VALUE(Z) with 1, and reinserted Z to the tail of history list   end if//endif CACHE_VALUE(X) is greater than CACHE_VALUE(Y) then push it to Velse insert X to the tail of history list and update its data, returnend ifutil cached list has enough room for placing Xend dofor(Z in V)if cached list has room for both Z and X, then reinsert Z to the tail of cached listinsert X to the tail of cached list, and update its dataend ifend forend if
else // X is neither in history list nor in cached list//judge X is or not first accessed by seen hashif X is first accessed and history list has no room for it, thensave the record of X in seen hashelseinsert X to the tail of history listend if
end if
Seen Hash

ATS冷启动后,Cached链表和History链表填满,将激活Seen链表。该链表的作用是缓存耐扫描,这意味着,经过对缓存中只见到一次的对象们做一长串的Get和Put操作,缓存状态一定不能受到影响。这是最本质的,如果没有这点保证,不仅缓存会受到污染,而且会丢失它所关注的对象相关的重要信息。所以,Cache链表和History链表不会受到第一次见到的对象上的Put操作和Get操作的影响是非常关键的。Seen Hash维护着一个16比特哈希标签(hash tags)的集合,未命中对象缓存(Cache链表和History链表中的)的请求,以及不匹配哈希标签的请求,导致哈希标签被更新,否则会被忽略。Seen Hash的大小近似缓存中的对象数,为了匹配用Cached链表和History链表的CLOCK率传给它的个数。

Cached List

Cached链表含有实际在内存中的对象,基本操作就是LRU,新对象插入FIFO队列中,命中导致对象被重新插入链表尾部。当要考虑插入一个对象时,会有一个有趣的bit位,首先检查对象哈希去看对象是否在Cached链表或者History链表中。命中意味着更新hit域并重新插入对象到链表尾部。History命中导致hit域被更新,然后比较对象是否保存在内存中。比较基于Cached链表中的最近最少使用元素,并基于一个加权频率:

CACHE_VALUE = hits / (size + overhead)

该公式类似GDFS算法,用于计算对象的缓存值,这里hits是请求对象的命中率,size是该对象的大小,overhead是一个加权值,在代码中设置为256。该公式从直观上比较易于理解,那些访问次数多的小对象将会更易于进入RAM中,这比较符合事实。
新对象必须有足够的字节值得当前缓存的对象去覆盖它。每次,当一个对象被认为可替换时,CLOCK就向前移动。假如History对象的值更大,就将它插入Cached链表,被替换的对象从内存中移除,并插入到History链表中。视作替换(至少一个)但还没有替换的对象,它们的hits域设为0,被重新插入Cached链表中,这就是Cached链表上的CLOCK操作。

History List

每个CLOCK操作时,History链表中的最少最近使用的元素被取出,假如hits域不超过1(History链表和Cached链表中至少命中一次)将被删除。否则,hits域设为0,被重新放入History链表中。

压缩和解压

压缩被后台操作执行(当前称作Put操作的一部分),后台操作维护了一个指向Cached链表的指针,并向头部正在压缩的元素前进。在Get操作过程中,解压根据要求进行。当对象被标记为copy时,压缩版本将被再次插入LRU中,因为我们需要做一次拷贝,没有标记为copy的那些对象被插入未压缩LRU中,希望它们能以未压缩形式重用。有一个编译时间选项,或许是我们想改变的东西。

下面是三种压缩算法和级别的对比(在Intel i7 920系列CPU上使用单线程测试)

RAM compression and decompression algorithm

这些都是粗略数字,你的测试结果可能相差很大。比如说,JPEG并不会用上述任何一种算法压缩(或者至少只会在个别级别做这种测试,压缩和解压成本完全没有说服力),对其它许多嵌入某种压缩形式的媒体和二进制文件类型也是如此。RAM缓存探测不到具体的压缩级别,假如压缩后的文件大小不能达到原来大小的90%以下,RAM缓存就认为该文件是不可压缩的,并将这个值缓存下来,RAM缓存不会企图再去压缩它(至少在history中的这段时间内)。

参考文献

https://docs.trafficserver.apache.org/en/latest/developer-guide/architecture/ram-cache.en.html
http://blog.chinaunix.net/uid-23242010-id-147401.html
http://blog.chinaunix.net/uid-23242010-id-147989.html

这篇关于ATS中的RAM缓存简介的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/822759

相关文章

缓存雪崩问题

缓存雪崩是缓存中大量key失效后当高并发到来时导致大量请求到数据库,瞬间耗尽数据库资源,导致数据库无法使用。 解决方案: 1、使用锁进行控制 2、对同一类型信息的key设置不同的过期时间 3、缓存预热 1. 什么是缓存雪崩 缓存雪崩是指在短时间内,大量缓存数据同时失效,导致所有请求直接涌向数据库,瞬间增加数据库的负载压力,可能导致数据库性能下降甚至崩溃。这种情况往往发生在缓存中大量 k

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

业务协同平台--简介

一、使用场景         1.多个系统统一在业务协同平台定义协同策略,由业务协同平台代替人工完成一系列的单据录入         2.同时业务协同平台将执行任务推送给pda、pad等执行终端,通知各人员、设备进行作业执行         3.作业过程中,可设置完成时间预警、作业节点通知,时刻了解作业进程         4.做完再给你做过程分析,给出优化建议         就问你这一套下

容器编排平台Kubernetes简介

目录 什么是K8s 为什么需要K8s 什么是容器(Contianer) K8s能做什么? K8s的架构原理  控制平面(Control plane)         kube-apiserver         etcd         kube-scheduler         kube-controller-manager         cloud-controlle

【Tools】AutoML简介

摇来摇去摇碎点点的金黄 伸手牵来一片梦的霞光 南方的小巷推开多情的门窗 年轻和我们歌唱 摇来摇去摇着温柔的阳光 轻轻托起一件梦的衣裳 古老的都市每天都改变模样                      🎵 方芳《摇太阳》 AutoML(自动机器学习)是一种使用机器学习技术来自动化机器学习任务的方法。在大模型中的AutoML是指在大型数据集上使用自动化机器学习技术进行模型训练和优化。

Redis中使用布隆过滤器解决缓存穿透问题

一、缓存穿透(失效)问题 缓存穿透是指查询一个一定不存在的数据,由于缓存中没有命中,会去数据库中查询,而数据库中也没有该数据,并且每次查询都不会命中缓存,从而每次请求都直接打到了数据库上,这会给数据库带来巨大压力。 二、布隆过滤器原理 布隆过滤器(Bloom Filter)是一种空间效率很高的随机数据结构,它利用多个不同的哈希函数将一个元素映射到一个位数组中的多个位置,并将这些位置的值置

防止缓存击穿、缓存穿透和缓存雪崩

使用Redis缓存防止缓存击穿、缓存穿透和缓存雪崩 在高并发系统中,缓存击穿、缓存穿透和缓存雪崩是三种常见的缓存问题。本文将介绍如何使用Redis、分布式锁和布隆过滤器有效解决这些问题,并且会通过Java代码详细说明实现的思路和原因。 1. 背景 缓存穿透:指的是大量请求缓存中不存在且数据库中也不存在的数据,导致大量请求直接打到数据库上,形成数据库压力。 缓存击穿:指的是某个热点数据在

PHP APC缓存函数使用教程

APC,全称是Alternative PHP Cache,官方翻译叫”可选PHP缓存”。它为我们提供了缓存和优化PHP的中间代码的框架。 APC的缓存分两部分:系统缓存和用户数据缓存。(Linux APC扩展安装) 系统缓存 它是指APC把PHP文件源码的编译结果缓存起来,然后在每次调用时先对比时间标记。如果未过期,则使用缓存的中间代码运行。默认缓存 3600s(一小时)。但是这样仍会浪费大量C

SaaS、PaaS、IaaS简介

云计算、云服务、云平台……现在“云”已成了一个家喻户晓的概念,但PaaS, IaaS 和SaaS的区别估计还没有那么多的人分得清,下面就分别向大家普及一下它们的基本概念: SaaS 软件即服务 SaaS是Software-as-a-Service的简称,意思是软件即服务。随着互联网技术的发展和应用软件的成熟, 在21世纪开始兴起的一种完全创新的软件应用模式。 它是一种通过Internet提供

缓存策略使用总结

缓存是提高系统性能的最简单方法之一。相对而言,数据库(or NoSQL数据库)的速度比较慢,而速度却又是致胜的关键。 如果使用得当,缓存可以减少相应时间、减少数据库负载以及节省成本。本文罗列了几种缓存策略,选择正确的一种会有很大的不同。缓存策略取决于数据和数据访问模式。换句话说,数据是如何写和读的。例如: 系统是写多读少的吗?(例如基于时间的日志)数据是否是只写入一次并被读取多次?(例如用户配