磁碟快取記憶體disk cache

2021-06-19 11:20:33 字數 2390 閱讀 3642

disk cache是一種將磁碟上的一些資料保留著ram中的軟體機制,這使得對這部分資料的訪問可以得到更快的效能。

disk cache在linux中有三種型別:1.dentry cache 2. page cache 3. buffer cache

dentry cache是目錄項的cache,這裡不對此展開。

page cache是以page為單位的cache,這裡記錄了乙個物理記憶體中.

address_space

address_space是頁快取記憶體中最為重要的資料結構,它把頁和頁相應的host聯絡在了一起。

address_space包含5種型別的頁:

1)普通檔案和磁碟檔案系統的目錄

2)記憶體對映檔案的資料

3)直接從塊裝置檔案讀取的資料(跳過檔案系統層)

4)已經交換到磁碟上的使用者態程序資料

5)ipc(程序間通訊)的共享線性區

也就是說頁快取記憶體有上面5種型別。

比如當address_space指向磁碟檔案的頁時,它的host就指向該磁碟檔案的inode。該磁碟檔案對應的所有page就分別記錄在clean_pages,dirty_pages和locked_pages這三個鍊錶中。另外乙個非常重要的成員就是a_ops,它定義了一系列屬於當前頁型別的操作函式。它會根據不同的頁型別提供不同的操作函式。

頁雜湊表

當程序讀大檔案時,那address_space對應的三個鍊錶就會很長,那要找到相應的快取記憶體頁就需要遍歷這幾個鍊錶,相當費時。linux的解決方法是建立乙個頁雜湊表page_hash_table,它的hash值是address_space的指標和偏移量。

page_hash_table的大小取決於ram的容量。

page cache處理函式

find_get_page(),add_to_page_cache(),find_or_create_page(),remove_inode_page()

緩衝區是對塊裝置進行快取的記憶體區域,不管讀與寫,對塊裝置的請求都要通過緩衝區進行。由下圖可以看出讀寫塊裝置是通過發出請求來實現的。一次請求的塊在裝置上必須是連續的,不過對緩衝區來說就不必是連續的。ll_rw_block()函式就是用來產生塊裝置請求的。

不過其實這個函式就是建立乙個請求描述符,然後把它插入到相應塊裝置的請求佇列中去。然後通過各自塊裝置的裝置驅動程式來完成實際的讀寫操作。讀就是把裝置的內容讀到緩衝區,寫就是把緩衝區的內容寫到裝置中。當然在這個過程中會通過一些策略程序來優化請求等等操作。所有的這些緩衝區都會放在乙個hash表中,便於在使用時可以找到相應的緩衝區,以避免i/o操作。

知道了什麼是緩衝區,緩衝區首部(buffer head)就是記錄緩衝區資訊的頭,它是由slab分配的。

緩衝區頁

緩衝區並不作為乙個單獨的記憶體單元來分配,而是存放在名為緩衝區頁(buffer pages)中。乙個嚴格的約束是緩衝區頁中的所有緩衝區必須指向基本塊裝置的相鄰塊。

我們用兩種方式來看待緩衝區頁:

1)緩衝區頁是一些緩衝區的容器,可以通過緩衝區快取記憶體對這些緩衝區單獨地訪問。

2)另一方面,每乙個緩衝區頁包含塊裝置檔案的4kb(一頁的大小)的內容,因此緩衝區頁就包含在頁快取記憶體中。換言之,緩衝區快取記憶體所存放的ram部分總是頁快取記憶體的乙個子集。這樣就極大地減少了緩衝區快取記憶體和頁快取記憶體的同步問題。

下圖是緩衝區首部和頁之間的關係:

分配緩衝區頁

當核心發現緩衝區高速衝沒有包含給定塊的資料時,就分配乙個新的緩衝區頁。核心呼叫grow_buffers()函式

當核心需要讀寫物理裝置上某個塊的時候,核心必須檢查所請求緩衝區的緩衝區首部是否已經包括在緩衝區快取記憶體中。getblk函式會去找緩衝區的hash表,如果沒有就呼叫grow_buffers()函式來申請乙個新的緩衝區(包括緩衝區首部)。

把髒緩衝區寫入磁碟

bdflush核心執行緒

kupdate核心執行緒

linux DNS快取記憶體

配置名稱伺服器 本機ip 172.25.254.117 1 安裝 bind 軟體包 yum install y bind2 編輯 etc named.conf listen on port 53 開啟埠 allow query 允許訪問 forwarders 如果伺服器沒有這個位址就去訪問250 3...

快取記憶體DNS

dns 客戶端修改dns 服務端yum install bind y firewall cmd permanent add service dns firewall cmd reload setenforce 0 netstat antulpe grep named vim etc named.co...

快取記憶體DNS

yum install bind y systemctl start named 啟動dns服務 此時可能需要在虛擬機器中進行無規律的敲鍵盤,動滑鼠等操作 systemctl enable named firewall cmd add service dns 設定dns可通過火牆 step1 首先配...