第三章 設計與實作
3.1 Hybrid Disk-Aware Buffer Cache 管理機制
3.1.2 Evicted Buffer 過濾機制
如前所述,evicted-buffer過濾機制會從被剔除的buffers中選擇出適合放入flash
memory內的資料。明確來說,此過濾機制會將具有下列特性的資料放入flash memory中:
不常修改的資料: Flash memory 資料的更新通常使用non-in-place update方式,將新 的資料儲存在其他未使用的page中而將原資料設成無效(Invalid,Garbage data)。若我們 搬進的資訊常常被更新,那麼無效資料將隨著資料的更新不斷地增多,可用資料變少,
erase的頻率也會隨著提高。另外,hybrid disk在一般模式下不能作為write cache,資料的 寫入仍然需要磁碟IO。因此將經常更新的資料放入flash memory中不但無法提升寫入效
On accessing a block X:
If X is in LRU then
for(i=0;i++;i<demote_length) j = FIFO.tail - i
Y = jth element of the FIFO list if Y.already_in_flash is 1 evict this block adjust_list( );
return
evict the block corresponding to FIFO.tail adjust_list( );
return }
能,更需要額外負擔來作資料在磁碟與flash memory間的同步。鑑於此,我們只會將 read-mostly的資料搬入flash memory中。
系統長期常用的資料:我們使用flash memory來做為second level cache就是希望讓系 統在主記憶體buffer cache找尋不到資料時可以從flash memory裡面獲得資料以減少硬碟 的存取。換句話說,flash 本身就是要承接buffer cache移出的資料來保留更多的硬碟資 訊。而被移出的資料有三種情況,第一是只被讀取1次的資訊。第二是曾經短期常用的 資訊,第三是長期常用的資訊(i.e., 在workload大的時候,這些資訊仍有可能從buffer cache被剔除出去)。因為第一和第二種情況並不能保證這些資料之後將會很常被使用
非大量連續性的資料: 因為rotation time和seek time的影響,所以硬碟在做random access的速度上比flash memory來的緩慢許多。但是當硬碟在做sequential access的時候,
如果access的資料量超過170 Kbytes~200 Kbytes,則硬碟的讀取速度就會比flash memory 讀取的速度來的快。由上可知,將一個在硬碟中size超過200 Kbytes的連續資料搬進flash memory裡面是不明智的。因此我們需要避免放入連續資料到flash中。
為了判定一個從buffer cache被剔除掉的buffer是否具有以上特性,我們必須與buffer cache的管理機制合作,動態地記錄buffers的特性。以下我們說明在3.1.1節所提及的buffer cache management algorithm中應該做哪些記錄以及如何做這些記錄。
為了判斷一筆資料是否常用,我們會檢視其是否進入過LRU list。如前所述,常用 的資料才有機會進入LRU list,而只使用過一次的資料只會在FIFO list中。然而,我們要 判定的不只是常用資料,而是長期常用的資料。為達此一目的,我們利用enter_lru_count 這個參數,當資訊進入LRU list時此參數就會加1,而若是此資料持續不被使用,它將會 再一次的回到FIFO list裡面。當這些資料在FIFO list中又被頻繁使用時,會再次回到LRU list。當資料的enter_lru_count大於或等於某個threshold N時,表示其已經至少進入LRU list N次,所以我們把此資料判斷成是長期有被系統使用的資料。
為了要選出read-mostly的資訊,我們利用一個叫做dirty的參數。當資料被修改過,
此參數就會被記錄成1,我們選取從頭到尾dirty皆為零的資料來做為read-mostly資料的 依據。因為dirty為零代表此資料在進入主記憶體後一直未被修改過,所以我們認為其未 來修改的機率也不大,放入flash memory中應該不會造成flash 經常性的update。然而,
因為我們只觀察一段時間,所以我們不敢保證其永遠不會update,這也是我們稱其為 read-mostly,而不是read-only的原因。
如前所述,我們也必須避免屬於大量連續資料的blocks進入flash memory。然而,因
為我們無法得知每個block的資料被讀取進來時是否是屬於大量連續資料的一部分,所以 我們用了一個更保守的策略:避免cache大檔案到flash memory中。大部分的連續資料存取 是發生在對某一檔案的循序存取,因此此一策略可以避免大量連續資料進入flash memory中。然而,對某一檔案的循序存取並不完全是大量連續資料的存取,有些大檔 案的資料分佈仍然是碎裂的(fragmented),這些碎裂資料即使常用也會被我們目前較保守 的策略排除在flash memory外。
圖五顯示我們的過濾機制的流程,圖六則為此過濾機制的虛擬碼(pseudo code)。首 先,當一個evicted block被選出時,我們會先利用enter_lru_count這個變數來判斷此 evicted block是否為長期(long term)被使用的資料,如果enter_lru_count小於我們設定的 threshold N,就不符合我們的標準,此時我們判斷block是否dirty將它做write back或直接 丟棄的處理。當此資料既是long term被使用的資料並且沒有被修改過時,我們檢查此 block所代表的檔案大小有沒有超過200Kbytes。如果有,代表其可能屬於大量連續性資 料的一部份,不適合放入flash memory中,因此我們就將之丟棄。如果沒有,就代表此 一block是符合所以上面我們所提及特性的目標,因此對hybrid disk下pin的指令,將這個 block複製一份到flash memory中。
圖五 判斷 data 是否該搬進 flash memory 的流程
圖六 虛擬碼