通用檔案系統快取¶
概述¶
此功能是用於網路檔案系統的通用快取,但也可用於快取其他內容,例如 ISO9660 檔案系統。
FS-Cache 在快取後端(例如 CacheFiles)和網路檔案系統之間進行協調。
+---------+
| | +--------------+
| NFS |--+ | |
| | | +-->| CacheFS |
+---------+ | +----------+ | | /dev/hda5 |
| | | | +--------------+
+---------+ +-------------->| | |
| | +-------+ | |--+
| AFS |----->| | | FS-Cache |
| | | netfs |-->| |--+
+---------+ +-->| lib | | | |
| | | | | | +--------------+
+---------+ | +-------+ +----------+ | | |
| | | +-->| CacheFiles |
| 9P |--+ | /var/cache |
| | +--------------+
+---------+
換句話說,FS-Cache 是一個模組,它為網路檔案系統提供快取功能,使快取對使用者透明。
+---------+
| |
| Server |
| |
+---------+
| NETWORK
~~~~~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
| +----------+
V | |
+---------+ | |
| | | |
| NFS |----->| FS-Cache |
| | | |--+
+---------+ | | | +--------------+ +--------------+
| | | | | | | |
V +----------+ +-->| CacheFiles |-->| Ext3 |
+---------+ | /var/cache | | /dev/sda6 |
| | +--------------+ +--------------+
| VFS | ^ ^
| | | |
+---------+ +--------------+ |
| KERNEL SPACE | |
~~~~~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|~~~~~~|~~~~
| USER SPACE | |
V | |
+---------+ +--------------+
| | | |
| Process | | cachefilesd |
| | | |
+---------+ +--------------+
FS-Cache 不遵循在允許訪問之前將每個開啟的網路檔案(netfs 檔案)完全載入到快取中,然後從該快取而不是從網路檔案系統 inode 提供頁面的理念,因為:
必須能夠實際地在沒有快取的情況下執行。
任何可訪問檔案的大小不得受限於快取大小。
所有開啟檔案(包括對映庫)的總大小不得受限於快取大小。
使用者不應被迫下載整個檔案,只為一次性訪問其中一小部分(例如透過“file”程式進行的操作)。
它而是根據使用它的網路檔案系統的請求,以塊為單位提供快取。
FS-Cache 提供以下功能:
可以同時使用多個快取。快取可以透過使用標籤明確選擇。
快取可以隨時新增/移除,即使在訪問過程中也行。
網路檔案系統提供了一個介面,允許任何一方從檔案中撤銷快取功能((2) 所需)。
網路檔案系統的介面儘可能少地返回錯誤,寧願讓網路檔案系統保持不知情。
有三種類型的 cookie:快取 cookie、卷 cookie 和資料檔案 cookie。快取 cookie 代表整個快取,通常對網路檔案系統不可見;網路檔案系統獲得一個卷 cookie 來表示檔案集合(通常是網路檔案系統為超級塊獲取的內容);資料檔案 cookie 用於快取資料(通常是為 inode 獲取的內容)。
卷透過一個鍵進行匹配。這是一個可列印字串,用於編碼可能需要區分一個超級塊與另一個超級塊的所有資訊。這可能是一個組合,例如單元名稱或伺服器地址、卷名稱或共享路徑。它必須是一個有效的路徑名。
Cookie 透過一個鍵進行匹配。這是一個二進位制塊(blob),用於表示卷中的物件(因此卷鍵無需構成 blob 的一部分)。這可能包括 inode 號和唯一識別符號或檔案控制代碼等。
透過將 cookie 標記為“使用中”,可以設定並固定 cookie 資源。這可以防止後臺資源被清除。採用定時垃圾回收機制來清除短期內未使用的 cookie,從而減少資源過載。這旨在用於檔案開啟或關閉時。
一個 cookie 可以同時被多次標記為“使用中”;每次標記都必須被取消使用。
提供了開始/結束訪問函式,以在操作期間延遲快取撤回,並防止在我們檢視結構體時其被釋放。
資料 I/O 透過非同步 DIO 完成,資料在網路檔案系統使用 iov_iter 描述的緩衝區之間傳輸。
提供了一個失效機制,用於從快取中丟棄資料,並處理正在進行中訪問舊資料的 I/O 操作。
Cookie 在釋放時可以被“退役”,從而導致物件從快取中移除。
FS-Cache 的網路檔案系統 API 可以在此處找到:
FS-Cache 的快取後端 API 可以在此處找到:
統計資訊¶
如果 FS-Cache 編譯時啟用了以下選項:
CONFIG_FSCACHE_STATS=y
它將收集特定統計資訊並透過以下路徑顯示:
/proc/fs/fscache/stats
這顯示了 FS-Cache 中可能發生的多個事件的計數。
類別 |
事件 |
含義 |
|---|---|---|
Cookie |
n=N |
已分配的資料儲存 cookie 數量 |
v=N |
已分配的卷索引 cookie 數量 |
|
vcol=N |
卷索引鍵衝突次數 |
|
voom=N |
分配卷 cookie 時發生 OOM 事件的次數 |
|
獲取 |
n=N |
已接收的獲取 cookie 請求數量 |
ok=N |
成功獲取請求的數量 |
|
oom=N |
因 ENOMEM 失敗的獲取請求數量 |
|
LRU |
n=N |
當前在 LRU 上的 cookie 數量 |
exp=N |
從 LRU 過期移除的 cookie 數量 |
|
rmv=N |
從 LRU 移除的 cookie 數量 |
|
drp=N |
已釋放/撤回的 LRU cookie 數量 |
|
at=N |
下次 LRU 清除的時間(jiffies) |
|
失效 |
n=N |
失效次數 |
更新 |
n=N |
已接收的更新 cookie 請求數量 |
rsz=N |
調整大小請求數量 |
|
rsn=N |
跳過的調整大小請求數量 |
|
釋放 |
n=N |
已接收的釋放 cookie 請求數量 |
rtr=N |
具有 retire=true 的釋放請求數量 |
|
drop=N |
不再阻止重新獲取的 cookie 數量 |
|
無空間 |
nwr=N |
因空間不足而被拒絕的寫入請求數量 |
ncr=N |
因空間不足而被拒絕的建立請求數量 |
|
cull=N |
為騰出空間而清除的物件數量 |
|
I/O |
rd=N |
快取中的讀取運算元量 |
wr=N |
快取中的寫入運算元量 |
Netfslib 也會新增一些自己的統計計數器。
快取列表¶
FS-Cache 提供快取 cookie 列表:
/proc/fs/fscache/cookies
其顯示內容大致如下:
# cat /proc/fs/fscache/caches
CACHE REF VOLS OBJS ACCES S NAME
======== ===== ===== ===== ===== = ===============
00000001 2 1 2123 1 A default
其中各列的含義是:
列
描述
快取
快取 cookie 除錯 ID(也出現在跟蹤中)
引用計數
快取 cookie 上的引用計數
卷數
此快取中的卷 cookie 數量
物件數
正在使用的快取物件數量
訪問次數
固定快取的訪問次數
狀態
狀態
名稱
快取的名稱。
狀態可以是 (-) 非活躍、(P) 準備中、(A) 活躍、(E) 錯誤或 (W) 撤回中。
卷列表¶
FS-Cache 提供卷 cookie 列表:
/proc/fs/fscache/volumes
其顯示內容大致如下:
VOLUME REF nCOOK ACC FL CACHE KEY
======== ===== ===== === == =============== ================
00000001 55 54 1 00 default afs,example.com,100058
其中各列的含義是:
列
描述
卷
卷 cookie 除錯 ID(也出現在跟蹤中)
引用計數
卷 cookie 上的引用計數
cookie 數
卷中的 cookie 數量
訪問計數
固定快取的訪問次數
標誌
卷 cookie 上的標誌
快取
快取名稱或“ - ”
鍵
卷的索引鍵
除錯¶
如果啟用了 CONFIG_NETFS_DEBUG,FS-Cache 功能和 NETFS 支援可以透過調整以下位置的值來啟用執行時除錯:
/sys/module/netfs/parameters/debug
這是一個用於啟用除錯流的位掩碼:
位
值
流
點
0
1
快取管理
函式入口跟蹤
1
2
函數出口跟蹤
2
4
通用
3
8
Cookie 管理
函式入口跟蹤
4
16
函數出口跟蹤
5
32
通用
6-8
(未使用)
9
512
I/O 操作管理
函式入口跟蹤
10
1024
函數出口跟蹤
11
2048
通用
應將相應的值進行或運算,並將結果寫入控制檔案。例如:
echo $((1|8|512)) >/sys/module/netfs/parameters/debug
將開啟所有函式入口除錯。