全部產品
Search
文件中心

Object Storage Service:ossfs 1.91.2和1.91.3版本新功能介紹

更新時間:Sep 05, 2024

通過ossfs,您可以像操作本地檔案一樣直接存取和管理OSS中的Object,從而實現資料的無縫共用和操作。本文介紹ossfs 1.91.2和1.91.3版本的新功能情況。

1.91.2版本

新增直讀模式

ossfs讀檔案時,預設從雲上下載的資料會先寫到磁碟,再從磁碟讀取返回給使用者。由於ossfs的磁碟寫操作均為非同步寫,因此下載的資料會先寫到記憶體page cache,作業系統非同步將髒頁刷到磁碟上。使用者讀取時,如果記憶體快取命中則直接返回。

ossfs讀檔案時預設會將預取的資料全部保留在磁碟上,磁碟空間到達上限才會淘汰。

  • 當記憶體足夠大時,所有的資料均緩衝在記憶體page cache中,不受到磁碟頻寬的限制,僅受機器的網路頻寬節流設定。

  • 當記憶體不足以緩衝整個檔案時,下載的資料需要落盤,讀取資料也需要從磁碟讀,因此讀效能同時會受到磁碟頻寬和網路頻寬節流設定。一般磁碟頻寬是主要效能制約。

預設模式下,當檔案較大時,ossfs讀效能受到磁碟效能的制約,因此新增直讀模式。

  • 直讀模式下,ossfs從雲上下載的資料會存放在記憶體buffer中,讀取時資料直接從記憶體buffer返回,整個流程並不涉及磁碟,從而可以充分利用網路頻寬,提升順序讀效能。

  • 直讀模式下,ossfs以chunk(預設4 MB,可通過direct_read_chunk_size參數設定)為單位管理下載的資料,會在記憶體中保留[當前chunk - 1, 當前chunk + direct_read_prefetch_chunks] 區間內的資料,如果下一次讀的位移量超過這個區間,因此ossfs會丟棄已經下載的資料,並從新的位移量處開始重新預取。

直讀模式僅適用於順序讀(唯讀)情境,對於其他情境:

  • 隨機讀:ossfs只會保留當前讀位移量視窗內的資料,如果隨機讀的位移量超過這個區間,則會造成資料被多次下載、釋放,導致網路資源浪費和效能下降。因此大量隨機讀操作的情境不適合開啟直讀模式。

  • 寫:資料寫入仍然會先寫入本地磁碟。為了保證效能與資料一致性,如果當前檔案直讀過程中有寫請求,該檔案將自動回退到預設的讀模式,即下載到磁碟的邏輯。針對某一個檔案的寫不會導致其他檔案退出直讀模式。

直讀模式相關配置請參見下表:

參數

說明

預設值

direct_read

是否開啟直讀模式。直接通過-odirect_read開啟。

disabled

direct_read_chunk_size

每個預取任務下載資料的大小,單位為MB。

4

direct_read_prefetch_chunks

預取的chunk數量。

32

direct_read_prefetch_limit

所有檔案預取資料總量上限,單位為MB。

1024

direct_read_prefetch_thread

預取線程數量。

64

1.91.3版本

新增參數direct_read_backward_chunks

直讀模式下,ossfs保留[當前chunk - 1, 當前chunk + direct_read_prefetch_chunks]區間內的資料,當前讀的位置之前只保留一個chunk的資料,如果使用者向前跳躍讀,則會丟棄大量已經預取的資料,有可能造成頻寬與資源浪費,以及效能下降。

新增參數direct_read_backward_chunks,使ossfs保留[當前chunk - direct_read_backward_chunks, 當前chunk + direct_read_prefetch_chunks]區間內的資料。在AI推理情境下,載入safetensors模型檔案(隨機讀)時,通過調大direct_read_backward_chunks參數,能有更多的資料保留,減少資料重複下載,一定程度上提升效能。

參數

說明

預設值

direct_read_backward_chunks

在直讀模式下,保留當前讀請求位置之前已下載的chunk數量,單位為個。1個chunk的預設大小為4 MB。

本次新增的參數。

1

stat_cache_expire

中繼資料到期時間,單位為秒。新支援設為-1,即永不到期。

失效後會重新載入快取資料。

900

新增混合直讀模式

在隨機讀頻繁且跳躍範圍較大的情境下:

  • 直讀模式的ossfs會頻繁下載資料並丟棄,再重複下載,效能會受到很大影響。

  • 預設模式的ossfs會將資料下載到磁碟上,在磁碟空間到達上限之前不會丟棄,因此無重複下載。

    • 當檔案不大時,下載的資料直接寫到記憶體page cache中隨後直接返回,不會受到磁碟效能限制。

    • 當檔案較大,page cache無法全部緩衝之後,讀效能受到磁碟效能制約。

混合直讀模式兼具了預設落盤模式和純直讀模式的優勢。小檔案可以全部利用page cache加速,大檔案可以充分利用page cache,超過一定上限之後才切換到直讀模式,同樣避免受到磁碟效能限制。

參數

說明

預設值

direct_read_local_file_cache_size_mb

混合直讀模式下,資料預設下載到磁碟上。當下載資料總量超過該值時,切換到直讀模式,單位為MB。

0(等同直讀模式)

1.91.3及以上版本使用最佳實務

純直讀模式

適合順序唯讀大檔案的情境,支援一定亂序(如跳躍範圍為少量chunk)。如:AI推理載入大型safetensors模型檔案。

  • 您需要開啟-odirect_read。

  • 直讀模式的資料保留視窗為[-direct_read_backward_chunks * direct_read_chunk_size, +direct_read_prefetch_chunks * direct_read_chunk_size],其中direct_read_chunk_size預設為4 MB,direct_read_prefetch_chunks預設為32,direct_read_backward_chunks預設為1,即預設資料保留視窗為[-4 MB, +128 MB]。如果讀取亂序確定在小範圍內(例如:部分safetensors模型檔案,連續兩次讀的位置跳躍範圍在[-32 MB, +32 MB]之間),則可以設定-odirect_read_backward_chunks=8,保留當前位移量之前32 MB的資料。

  • 您還可以適當調整direct_read_prefetch_chunks、direct_read_chunk_size參數,提升並行預取的資料量,充分利用網路頻寬。

預設模式

適合小檔案(指page cache能夠快取檔案)和大檔案隨機唯讀情境。如:AI 訓練中大量原始圖片素材檔案。使用純直讀模式,即使開啟了部分亂序仍然讀取效能很差時,建議嘗試使用預設模式。

ossfs讀檔案時,核心會緩衝一份ossfs掛載點檔案的資料在記憶體中,另外ossfs會將資料寫在磁碟快取檔案上,因此記憶體還有一份快取檔案的資料,即一個檔案會在記憶體中有雙倍緩衝。

  • 如果您的作業系統page cache最多緩衝6 GB的髒資料,那麼理論上預設模式適合大小為3 GB以下的檔案讀。

  • 您可以設定parallel_count參數調節下載資料的並發數量,設定multipart_size參數調節單個任務下載資料量。

混合直讀模式

適合小檔案(指page cache能夠快取檔案)和大檔案混雜唯讀情境,支援一定亂序(如跳躍範圍為數個chunk)。如:AI推理載入大型safetensors模型檔案。如果大檔案讀取中出現大幅隨機跳躍,此模式效能會低於預設模式。

  • 您需要開啟-odirect_read。

  • 您需要設定direct_read_local_file_cache_size_mb參數來控制下載落盤的資料大小。如機器page cache最多6 GB時,可以設定-odirect_read_local_file_cache_size_mb=3072,當下載資料到達3 GB時,切換到直讀模式。

  • 直讀模式的資料保留視窗為[-direct_read_backward_chunks * direct_read_chunk_size, +direct_read_prefetch_chunks * direct_read_chunk_size],direct_read_chunk_size預設為4 MB,direct_read_prefetch_chunks預設為32,direct_read_backward_chunks預設為1,則預設資料保留視窗為[-4 MB, +128 MB]。如果讀取亂序確定在少量範圍內(如:部分safetensors模型檔案,連續兩次讀的位置跳躍範圍在[-32 MB, +32 MB]之間),則可以設定-odirect_read_backward_chunks=8,保留當前位移量之前32 MB的資料。

  • 您還可以適當調整direct_read_prefetch_chunks、direct_read_chunk_size參數,提升並行預取的資料量,充分利用網路頻寬。

如何選擇3種模式

  • 如果您的檔案是在通過ossfs寫入時進行讀取,請直接使用預設模式。

  • 如果您的ossfs只會對檔案進行讀取,或通過ossfs寫入和讀取的是不同檔案:

    說明

    當嘗試純直讀模式和混合直讀模式發現效能較差時,建議使用預設模式,將檔案快取至本地磁碟。使用預設模式時,磁碟效能容易成為ossfs的瓶頸,建議提高ossfs使用的磁碟配置。例如:使用ESSD AutoPL,並配置適當的預配置效能或使用效能突發。

    情境

    說明

    只有小檔案

    請使用預設模式。

    只有大檔案

    • 順序讀取或小幅跳躍(部分safetensors模型檔案),請使用純直讀模式。

    • 大幅跳躍隨機讀取,請使用預設模式。

    • 無法確認讀模數式,或使用純直讀模式並調整了direct_read_backward_chunks後,效能仍然差時,請使用預設模式。

    小檔案和大檔案混雜

    • 大檔案為順序讀取或小幅跳躍(部分safetensors模型檔案),請使用混合直讀模式。

    • 大檔案會大幅隨機跳躍讀取、無法確認讀模數式或使用混合直讀模式並調整了direct_read_backward_chunks後,效能仍然差時,請使用預設模式。

效能測試對比

測試1 順序讀

  • 機器規格

    • 記憶體:32GB

    • 磁碟頻寬:130MB/s

    • 內網頻寬:750MB/s

  • 掛載命令

    • 預設模式ossfs掛載命令:

      ossfs [bucket name] [mountpoint] -ourl=[endpoint] -oparallel_count=32 -omultipart_size=16
    • 直讀模式ossfs掛載命令:

      ossfs [bucket name] [mountpoint] -ourl=[endpoint] -odirect_read -odirect_read_chunk_size=8 -odirect_read_prefetch_chunks=64
  • 測試命令:

    dd if=testfile of=/dev/null bs=1M status=progress

    測試結果:

    檔案大小

    預設模式

    直讀模式

    1 GB

    646MB/s

    592MB/s

    5 GB

    630MB/s

    611MB/s

    10 GB

    260MB/s

    574MB/s

測試2 pytorch負載檔案測試

  • 機器規格

    • 記憶體:15GB

    • 磁碟頻寬:150MB/s

    • 內網頻寬:500MB/s

  • 掛載命令

    • 預設模式ossfs掛載命令:

      ossfs [bucket name] [mountpoint] -ourl=[endpoint] -oparallel_count=32 -omultipart_size=16
    • 直讀模式ossfs掛載命令:

      ossfs [bucket name] [mountpoint] -ourl=[endpoint] -odirect_read -odirect_read_chunk_size=8 -odirect_read_prefetch_chunks=64 -odirect_read_backward_chunks=16
    • 混合直讀模式ossfs掛載命令:

      ossfs [bucket name] [mountpoint] -ourl=[endpoint] -oparallel_count=32 -omultipart_size=16 -odirect_read -odirect_read_chunk_size=8 -odirect_read_prefetch_chunks=64 -odirect_read_backward_chunks=16 -odirect_read_local_file_cache_size_mb=3072
  • 測試

    測試指令碼:

    import time
    from safetensors.torch import load_file
    
    file_path = "./my_folder/bert.safetensors"
    start = time.perf_counter()
    loaded = load_file(file_path)
    end = time.perf_counter()
    elapsed = end - start
    print("time_spent:", elapsed)

    測試結果:

    說明

    測試結果僅供參考,實際讀的耗時除了和檔案大小有關,也和safetensors模型結構本身有關。

    檔案大小

    預設模式

    直讀模式

    混合直讀模式

    2.0 GB

    4.00s

    5.86s

    3.94s

    5.3 GB

    20.54s

    27.33s

    19.91s

    6.5 GB

    30.14s

    24.23s

    17.93s