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源**:
閒話快取 概述
每當我們討論快取時,總是會對如下幾個詞比較熟悉,write back,write through,write around 似乎,快取主要是為 寫 設計的,其實這是錯誤的理解,寫從快取中獲得的好處是非常有限的,快取主要是為 讀 服務的。之所以我們要順帶提一下,在乙個快取系統中,如何處理寫的順序,是因...
mysql快取機制 讀快取篇
最近進行了一系列mysql相關的研究,了解了一遍mysql的快取機制,在這裡集中總結一下。本文是基於mysql innodb的快取機制解析 快取機制是一種常用的機制,在作業系統中,因為不同儲存介質的讀寫效率天差地別,所以採取快取機制來加快系統的讀寫效率,將一些常用的資料放在讀寫效率較高的快取裡,避免...
《深入HDFS》 HDFS快取
hdfs快取是為了減少對資料的重複訪問請求,hdfs的快取通過快取塊實現。快取塊快取塊由普通檔案塊轉換得來。快取指在要訪問的datanode的記憶體中,訪問時命中快取則無需讀取磁碟,可以大大提高使用者讀取檔案的速度。快取塊的生命週期 在快取塊中,其內部列舉state 如下 private stati...