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上使用單線程測試)
這些都是粗略數字,你的測試結果可能相差很大。比如說,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缓存简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ATS缓存相关话题
- 下一篇: CDN和Web Cache领域相关的经典