ossfs 2.0.8 及以後版本支援本機資料緩衝,通過將讀取過的檔案資料緩衝到本地磁碟,加速後續的重複讀取並降低 OSS 請求量。本文介紹本機資料緩衝的工作原理、配置方法與效能表現。
背景資訊
使用 ossfs 2.0 訪問 OSS 時,每次讀取檔案都需要從遠端拉取資料。對於 AI 訓練、模型載入等需要多輪重複讀取相同資料的情境,頻繁的遠端訪問會帶來較高的網路時延和頻寬消耗。
ossfs 2.0 的本機資料緩衝通過在本地磁碟保留已讀取過的檔案資料,使後續訪問直接從本地擷取,從而顯著提升重複讀效能、降低 OSS 請求費用。
ossfs 2.0 本機資料緩衝具備以下特點:
-
效能更優:大檔案、小檔案重複讀情境下頻寬均顯著優於 ossfs 1.0,具體可見下文效能對比。
-
自動淘汰:內建 LRU 淘汰策略,緩衝寫滿時自動回收最久未訪問的檔案,無需手動清理。
-
海量小檔案支援:配合中繼資料快取(
--max_inode_cache_count、--attr_timeout),可大幅加速 AI 訓練資料集的多輪載入。
本機資料緩衝僅用於讀緩衝,不影響寫路徑——寫入操作不經過本機快取。這與 ossfs 1.0 的 -ouse_cache 不同,後者會同時緩衝讀寫資料。
工作原理
緩衝粒度
緩衝以 OSS 對象(檔案)為基本單位。每個被讀取過的檔案在緩衝目錄中對應一個快取檔案,採用按需填充的方式。
讀取流程
-
首次讀取:資料從 OSS 拉取並同步寫入本機快取目錄。
-
後續讀取:直接從本機快取讀取。
空間回收
當緩衝接近容量上限時,自動按 LRU(最近最少使用)策略淘汰舊檔案,騰出空間給新資料,回收操作以單個快取檔案為最小單位進行。
配置方法
|
配置項 |
是否必填 |
說明 |
預設值 |
|
disk_data_cache_dir |
否 |
本機快取目錄路徑。配置為非空時啟用資料緩衝。 |
空 |
|
disk_data_cache_size |
條件必填 |
緩衝容量上限,按 GiB 對齊。不可超過緩衝目錄所在磁碟/分區的可用空間。disk_data_cache_dir 可以為空白;disk_data_cache_dir 指定之後,本參數必須填入合法值。 |
空 |
|
disk_data_cache_io_engine |
否 |
磁碟緩衝 IO 引擎,可選 psync 或 libaio。 |
psync |
約束:
-
--disk_data_cache_dir 指向的目錄必須存在且為空白目錄,盡量保證緩衝路徑為獨立分區 / 獨立盤。
-
--disk_data_cache_size 不可超過緩衝目錄所在磁碟的可用空間。
-
同一台機器上掛載多個 ossfs2 執行個體時,每個執行個體必須使用獨立的緩衝目錄。
-
ossfs2 進程退出時不會自動清理緩衝目錄,需要手動清理。
-
掛載後盡量不要對緩衝目錄路徑進行操作,避免發生未知錯誤。
掛載命令樣本:
ossfs2 mount /mnt/oss/ \
--oss_bucket <your-bucket> \
--oss_endpoint <your-endpoint> \
--oss_access_key_id <ak> \
--oss_access_key_secret <sk> \
--disk_data_cache_dir /mnt/disk/ossfs2/cache \
--disk_data_cache_size 256G
環境要求
|
參數 |
要求 |
|
緩衝盤檔案系統 |
ext4、xfs 或 tmpfs(僅限 psync 模式),其他檔案系統未驗證 |
|
緩衝盤類型 |
推薦彈性臨時盤 / 本地 NVMe;ESSD PL0/PL1/PL2 的吞吐容易成為瓶頸,此時使用體驗可能較差;記憶體充裕時可使用 tmpfs(僅限 psync) |
|
緩衝盤可用空間 |
不小於 --disk_data_cache_size 設定的值 |
使用建議
本機資料緩衝適用於“讀多寫少”且需要重複訪問相同資料的情境。
IO 引擎(disk_data_cache_io_engine)配置建議:
-
psync:使用同步讀寫系統調用,讀取時資料會經過作業系統 PageCache。當快取資料量接近或小於可用記憶體時,熱資料自然駐留在 PageCache 中,可獲得接近記憶體的讀取速度。適用於通用情境、低規格雲端硬碟以及 tmpfs 緩衝盤(tmpfs 不支援 libaio)。
-
libaio:使用 Linux 非同步 IO 介面,繞過 PageCache 直接操作磁碟。適用於大容量本地 NVMe + 資料集遠大於記憶體的情境,相比 psync 通常有 20% 左右的額外提升。
下表列出典型情境及推薦配置:
|
情境 |
使用建議 |
|
AI 訓練資料多輪載入(多 epoch 重複訪問同一資料集)、固定資料集多次查詢 / 分析 |
啟用本機資料緩衝,按資料集大小×1.1 設定 --disk_data_cache_size。緩衝盤為本地 NVMe 且資料量較大時,推薦 --disk_data_cache_io_engine=libaio,充分發揮磁碟效能。 |
|
大模型推理 / vLLM 載入(GB 級模型檔案反覆載入) |
推薦機型記憶體大於模型總大小時,使用 tmpfs 盤作為緩衝盤。若記憶體不足以全緩衝模型檔案,也可選擇本地碟作為緩衝盤,但此時效能會受盤效能限制,需要具體評估後判斷是否開啟本機資料緩衝。 |
若對資料即時性要求高且資料頻繁修改的情境下,不建議開啟資料緩衝(緩衝存在一定時效性差異)。
效能對比
測試對象:ossfs 2.0.9 vs ossfs 1.91.10。表中“首次讀 / 後續讀”分別對應緩衝未命中(需從 OSS 拉取)與命中本機快取。“—”表示該配置無緩衝,不區分首次/後續讀。
情境一:大檔案順序讀(4 線程讀取 100GB 檔案)
測試環境
-
機器:ecs.i4.4xlarge(16 vCPU,128 GiB)
-
本地 NVMe 盤:3576 GiB NVMe(讀頻寬 6 GB/s,寫頻寬 3 GB/s,IOPS 90w)
-
ossfs 2.0:--disk_data_cache_dir=<path> --disk_data_cache_size=3T,分別測試 --disk_data_cache_io_engine=psync 和 libaio
-
ossfs 1.0:-ouse_cache=<path> -oparallel_count=128
結果
|
配置 |
io 模式 |
頻寬(首次讀 / 後續讀) |
CPU (avg/max) |
峰值記憶體 |
|
ossfs 2.0(無緩衝) |
- |
2841 MB/s — |
385% / 468% |
5170 MB |
|
ossfs 2.0 |
psync |
2561 / 4516 MB/s |
371% / 526% |
2118 MB |
|
libaio |
2343 / 6625 MB/s |
298% / 322% |
2146 MB |
|
|
ossfs 1.0 |
- |
1249 / 2648 MB/s |
815% / 1214% |
137 MB |
結論:
-
啟用緩衝後,ossfs 2.0 在大檔案後續讀情境下相比 ossfs 1.0 效能提升約 2.5 倍(libaio 模式 6625 vs 2648 MB/s),可達到本地 NVMe 效能上限;同時 CPU 佔用大幅降低(≈300% vs 800%)。
情境二:海量小檔案讀取(ImageNet 訓練資料集載入)
測試環境
-
機器:ecs.i4.32xlarge(128 vCPU,1024 GiB)
-
本地 NVMe 盤:8 × 3576 GiB NVMe
-
資料集:ImageNet 訓練集(約 1.3M 張圖片),多 epoch 重複載入
-
ossfs 2.0:--disk_data_cache_dir=<path> --disk_data_cache_size=1500G --disk_data_cache_io_engine=libaio --attr_timeout=36000 --max_inode_cache_count=11000000(啟用中繼資料快取)
-
ossfs 1.0:-ouse_cache=<path> -oreaddir_optimize -omax_stat_cache_size=11000000 -ostat_cache_expire=72000
結果
|
配置 |
頻寬(首次讀 / 後續讀) |
CPU (avg/max) |
峰值記憶體 |
|
ossfs 2.0(無緩衝) |
304 MB/s —(約 2400 img/s) |
67% / 209% |
5062 MB |
|
ossfs 2.0 |
286 / 1292 MB/s(約 10000 img/s) |
219% / 1068% |
6470 MB |
|
ossfs 1.0 |
38 / 224 MB/s(約 2000 img/s) |
66.1% / 206% |
31.6 GB |
結論:
-
啟用磁碟緩衝 + 中繼資料快取後,ossfs 2.0 後續 epoch 載入效能達到無磁碟緩衝的 4.25 倍(1292 vs 304 MB/s),且完全消除 OSS 網路請求。多輪重複載入相同資料集的 AI 訓練負載,強烈推薦使用 ossfs 2.0 本機快取 + libaio。