通用檔案系統快取

概述

此功能是用於網路檔案系統的通用快取,但也可用於快取其他內容,例如 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 提供頁面的理念,因為:

  1. 必須能夠實際地在沒有快取的情況下執行。

  2. 任何可訪問檔案的大小不得受限於快取大小。

  3. 所有開啟檔案(包括對映庫)的總大小不得受限於快取大小。

  4. 使用者不應被迫下載整個檔案,只為一次性訪問其中一小部分(例如透過“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

將開啟所有函式入口除錯。