1. 程式人生 > >常見快取演算法和快取策略

常見快取演算法和快取策略

快取演算法:快取法通過設計良好的資料分塊、預取、順序預取、快取替換等演算法來提高對快取內容的命中率。快取演算法可以分為基於訪問時間的策略、基於訪問頻率的策略、訪問時間與頻率兼顧策略、時間距離分佈策略等型別。

快取策略:快取策略主要三方面:

  • 快取什麼內容
  • 何時進行快取
  • 當快取空間已滿時如何進行替換,即快取替換演算法。

對於第二方面,大部分快取演算法使用預取策略來提前將部分磁碟資料放入快取,以進一步減少磁碟I/O,加大快取命中率。通過記錄、分析以往的資料請求模式來預測將來可能被請求到的資料段,將訪問可能性大的資料段放入快取。

快取策略的資料塊分割:

首部快取和分塊快取策略普遍應用於VoD影片檔案。首部快取將影片檔案開始的一部分放入快取以減小點播使用者的啟動延遲,對於影片檔案其他部分的訪問需要直接讀取磁碟。

分塊快取通過將影片檔案切分成小塊,以塊為單位進行快取操作。分塊快取分為定長分塊與變長分塊。定長分塊將檔案切分為大小相同的塊,變長分塊,變長演算法是基於影片檔案越靠後的部分被訪問的概率越低的推斷,將檔案按照首尾位置分塊,各塊大小按指數遞增。

但以上定長與變長分塊均忽略了兩點:

  • 影片檔案會存在一些“熱點片段”而這些熱點片段並不均處於影片首部
  • 同一影片內“熱點片段”的熱度會隨著時間不斷改變,不同影片的熱度也隨時間不斷變化。

需設計良好的演算法自適應影片熱點的不同位置與變化。

快取策略的分類:

由於不同系統的資料訪問模式不盡相同,同一種快取策難以在各種資料訪問模式下均取得滿意效能,研究人員提出不同快取策略以適應不同需求。

快取策略可分為以下幾類:

  • 基於訪問時間:此類演算法按各快取項的被訪問時間來組織快取佇列,決定替換物件。如LRU。
  • 基於訪問頻率:此類演算法用快取項的被訪問頻率來組織快取。如LFU、LRU-2、2Q、LIRS。
  • 訪問時間與頻率兼顧:通過兼顧訪問時間與頻率,使得在資料訪問模式變化時快取策略仍有較好效能。如FBR、LRFU、ALRFU。多數此類演算法具有一個可調或自適應引數,通過該引數的調節使快取策略在基於訪問時間與頻率間取得一定平衡。
  • 基於訪問模式:某些應用有較明確的的資料訪問特點,進而產生與其相適應的快取策略。如專為VoD系統設計的A&L快取策略,同時適應隨機、順序兩種訪問模式的SARC策略。
  • 基於訪問時間的快取策略:LRU (LeastRecentlyUsed)是一種應用廣泛的快取演算法。該演算法維護一個快取項佇列,佇列中的快取項按每項的最後被訪問時間排序。當快取空間已滿時,將處於隊尾,即刪除最後一次被訪問時間距現在最久的項,將新的區段放入佇列首部。但LRU演算法僅維護了快取塊的訪問時間資訊,沒有考慮被訪問頻率等因素,在某些訪問模式下無法獲得理想命中率。例如對於VoD系統,在沒有VCR操作的情況下,資料被由前至後順序訪問,已訪問過的資料不會被再次訪問。所以LRU演算法將最新被訪問的資料最後被替換不適用於VoD系統。
  • 基於訪問頻率的快取策略:LFU (LeastFrequentlyUsed)按每個快取塊的被訪問頻率將快取中的各塊排序,當快取空間已滿時,替換掉快取佇列中訪問頻率最低的一項。與LRU的缺點類似, LFU僅維護各項的被訪問頻率資訊,對於某快取項,如果該項在過去有著極高的訪問頻率而最近訪問頻率較低,當快取空間已滿時該項很難被從快取中替換出來,進而導致命中率下降。
    LRU-2[2, 3]演算法記錄下每個快取頁面最後兩次被訪問的時間。替換頁面時替換掉倒數第二次訪問時間距現在最久的一項。在IRM (IndependentReferenceModel)訪問模式下,LRU-2有著最好的預期命中率,由於LRU-2演算法要維護一個優先順序佇列,所以該演算法複雜度為logN(N為快取佇列中快取項的數量)。
    2Q[4](2 Queues)使用LRU佇列替換了LRU-2中的優先順序佇列,將演算法時間複雜度由logN降為常數,且維護快取項的各資訊所需空間比LRU-2小。
    LIRS[5](Low Inter-ReferenceRecency Set)維護一個變長的LRU佇列,該佇列的LRU端為最近至少被訪問過2次的第Llirs項(Llirs為演算法引數)。LIRS演算法在IRM訪問模式下可以獲得很高的命中率,但對於SDD訪問模式效率明顯下降。
    對於VoD系統,基於訪問頻率的策略可以捕捉到熱點影片片段,使得對熱點片段的大量請求免於進行緩慢的磁碟I/O。但影片熱點會隨時間不斷變化,且此類策略無法利用VoD的順序訪問模式,所以純粹以訪問頻率為度量來進行替換操作不適合VoD系統。
  • 兼顧訪問時間與頻率:FBR[6](Frequency Based Replacement)維護一個LRU佇列,並將該佇列分為New、Middle、Old三段。對佇列中的每一快取項均維護一個計數值。當快取中的一項被命中時,被命中的快取項被移至New段的MRU端,如果該項原本位於Old或Middle段,則其計數值加1,原位於New段則計數值不變。當進行替換操作時,刪除Old段計數值最小的一項(LRU端)。
    LRFU[7](LeastRecently FrequentlyUsed)為每一個快取項維護一個權值C(x),其初始值為0, C(x)按以下公式變化。
    在t時刻, C(x) =1+2-λC(x): x被訪問到2-λC(x) : x未被訪問進行替換操作時,C(x)值最小的一項被刪除。當時, LRFU演算法行為類似於LFU;而當時,該演算法行為逼近LRU演算法。該演算法通過選用合適的λ值來獲得時間與頻率因素的平衡。
    LRFU雖然通過一個值來兼顧訪問時間與頻率因素,但由於值固定,當訪問模式變化時,該演算法無法做出相應的調整而造成效能下降。ALRFU[8](Adaptive LRFU)在此方面對LRFU進行了改進。通過對資料訪問模式的歷史進行監控,ALRFU動態調整值來適應資料訪問模式的改變,表現出比LRFU更好的適應性。
  • 基於訪問模式的快取策略:針對VoD系統的特點提出A&L演算法。該演算法通過記錄每個快取項的歷史訪問時間與訪問數量來估計該項的未來被訪問頻率。以該頻率值為度量,在進行快取替換時替換掉該值最小的一項。由於該演算法考慮了VoD系統的資料訪問特點,所以廣泛應用於VoD系統。
    但A&L演算法通過直接計算快取區段生成以來的總的訪問數量、頻率來生成快取權值,沒有考慮VoD影片的訪問熱點會隨時間不斷變化。當某些快取區段歷史訪問頻率較高但最近訪問頻率下降時,仍保持較大權值,影響新的熱點片段的快取,無法適應影片熱點的動態變化。
    IBM提出的SARC[10]是針對於大型伺服器的快取演算法,可在隨機訪問與順序訪問的資料訪問模式下做出動態適應。SARC通過將隨機訪問與順序訪問分為兩個佇列分別管理來實現對兩種不同訪問模式的適應。並通過分析快取大小-命中率的模擬試驗資料曲線,得出對隨機佇列與順序佇列項分別進行替換的代價函式。當進行快取替換時,通過兩佇列的代價函式來對代價小的佇列進行替換。