全部產品
Search
文件中心

Container Service for Kubernetes:ossfs 1.91及以上版本新功能介紹及效能壓測

更新時間:Sep 04, 2024

通過ossfs,您可以像操作本地檔案一樣直接存取和管理OSS中的Object,從而實現資料的無縫共用和操作。ossfs版本隨著CSI組件版本的迭代進行升級。在1.30.1及以上版本的CSI組件中,您可以開啟特性門控將ossfs切換至1.91及以上新版本來提升檔案操作效能。本文介紹ossfs 1.91及以上版本的新功能以及壓測效能。

如果您對檔案操作效能有較高要求,建議您將ossfs版本切換至1.91及以上版本。關於ossfs 1.91及以上版本的啟用情境,請參見ossfs 1.91及以上版本啟用最佳實務。如何切換ossfs版本,請參見將ossfs切換至1.91及以上版本

ossfs 1.91及以上版本新增功能

與ossfs 1.88.x版本相比,ossfs 1.91及以上版本主要功能變更如下。以下功能配置項僅說明重要訊息,完整配置項及更多版本變更資訊,請參見ossfs changelog

基礎POSIX操作最佳化和缺陷修複

  • 支援OSS儲存卷掛載OSS Bucket中不存在的子路徑。

  • 建立對象時取消0 byte檔案上傳,並修複分區上傳時偶發的EntityTooSmall錯誤,最佳化追加寫表現。

  • 基於開源ossfs版本與實際壓測結果,修改部分配置項的預設值。

    配置項

    說明

    1.88.x預設值

    1.91及以上版本預設值

    stat_cache_expire

    元資訊到期時間(秒)

    不失效 (-1)

    900

    multipart_threshold

    使用分區上傳的檔案閾值(MB)

    5 x 1024

    25

    max_dirty_data

    髒資料強制刷盤的閾值(MB)

    不強制(-1)

    5120

    為了最佳化大檔案處理效能,以下部分配置項相容此前1.88.x版本,與開源ossfs版本有差異。

    配置項

    說明

    開源1.91及以上版本預設值

    1.91及以上版本預設值

    multipart_size

    以分區模式上傳資料時分區的大小,單位為MB。

    10

    30

    parallel_count

    以分區模式上傳大檔案時分區的並發數。

    5

    20

    在使用1.91及以上版本ossfs時,如果您需要復原或調整配置,可以通過PV中的選擇性參數otherOpts修改。

新增readdir最佳化功能

新增readdir最佳化功能,最佳化readdir操作的效能以提高檔案系統遍曆的效率。

掛載OSS儲存卷時,為支援使用者鑒權和chmod等POSIX操作,系統會發送大量headObject請求以擷取路徑下的所有對象的擴充資訊,例如許可權、修改時間、UID和GID等。當某些路徑下的檔案較多時,可能會影響ossfs的整體效能。

開啟readdir最佳化功能後,系統將忽略這些擴充資訊,以提升ossfs的readdir操作效能。但有如下注意事項:

  • chmod、chown操作不生效。

  • 通過symlink操作(軟連結)建立的對象可能會顯示異常,ossfs本身不支援永久連結。

readdir最佳化功能相關的配置項如下表所示:

配置項

說明

開啟方式

1.91及以上版本預設值

readdir_optimize

是否開啟readdir最佳化功能。

直接使用-o readdir_optimize開啟,無需value。

disable

symlink_in_meta

開啟時,用於記錄軟連結的擴充資訊,以確保建立的軟連結化物件正常顯示。

直接使用-o symlink_in_meta開啟,無需value。

disable

新增直讀功能

新增直讀功能,最佳化大檔案順序讀(唯讀)的效能。

掛載OSS儲存卷時,為支援完整的寫及隨機讀情境,從OSS服務端讀檔案時,需要先將資料存放區至磁碟,再從磁碟中讀取資料返回,即ossfs的最大讀效能將受到磁碟IO限制。

直讀功能將使用記憶體預取資料,跳過資料刷盤即直接寫入資料而不立刻同步到磁碟,直接從記憶體讀取返回,提升順序讀效能。但需要注意以下事項:

  • 建議適用於順序讀(唯讀)情境,開啟某個檔案後:

    • 隨機讀操作:將觸發ossfs重新預取新資料,大量的隨機讀操作可能影響讀效能。

    • 寫操作:為保證效能與資料一致性,將自動回退到預設的刷盤邏輯。

  • 開啟直讀功能時,use_cache配置項會失效。

  • 使用記憶體儲存預取資料,可能會導致記憶體使用量增加。可參考下表中direct_read_prefetch_limit配置項限制記憶體使用量量。當到達記憶體上限時,將自動停止預取,最大讀效能將受網路IO限制。

直讀功能相關的配置項如下表所示:

配置項

說明

1.91及以上版本預設值

direct_read

是否開啟直讀功能。直接使用-o direct_read開啟,無需value。

disable

direct_read_prefetch_limit

ossfs進程可使用的直讀預取記憶體池大小,即最大閾值。單位為MB。

1024(最小128)

使用直讀功能時,如果您不希望通過預取提升順序讀效能,可以增加-o direct_read_prefetch_chunks=0配置,即從OSS服務端讀檔案後直接讀取資料返回,最大讀效能受網路IO限制。

ossfs 1.91及以上版本啟用最佳實務

  • 當OSS服務端在某層級下檔案量較多時(與節點可用資源相關,一般為千層級及以上),若業務對檔案擴充資訊無需求,建議您將ossfs切換至1.91及以上版本並增加-o readdir_optimize配置。若您的Bucket開啟了版本控制,建議同時增加-o listobjectsv2配置項。

  • 讀寫情境,建議您優先考慮OSS儲存讀寫分離最佳實務進行讀寫分離。否則,建議您將ossfs切換至1.91及以上版本,修複分區上傳偶發的EntityTooSmall錯誤問題。為保證資料一致性,建議同時增加-o max_stat_cache_size=0配置。

  • 唯讀情境

    • 對無需使用緩衝的大檔案順序讀情境,建議增加-o direct_read來開啟直讀功能。

    • 對檔案需要反覆讀取的情境,建議您使用本機快取來加速二次讀取效能,同時可以增加以下任一配置項來使用緩衝。

      • 增加-o kernel_cache配置項,使用page cache緩衝。

      • 增加-o use_cache=/path/to/cache配置項,使用磁碟緩衝。

1.88.x和1.91及以上版本ossfs效能對比

重要

採用不同的工具進行測試,測試結果會存在差異。本文中的壓測資料僅為採用開源測試載入器sysbench或自訂指令碼獲得的測試結果。

讀寫吞吐對比

未開啟readdir最佳化功能及直讀功能時,在ecs.g7.xlarge(系統硬碟為PL0)的節點上,使用sysbench壓測工具建立128個8MiB的檔案進行順序讀(sequential Read)、順序寫(sequential Write)、隨機讀(Random Read)和隨機寫(Random Write)測試對比如下。

由以上讀寫吞吐對比圖示看出,當未開啟readdir最佳化功能及直讀功能時

  • 1.88.x版本的ossfs在create file和sequential Read上有優勢。

  • 1.91及以上版本的ossfs在sequential Write、Random Read和Random Write上有優勢。

開啟readdir最佳化功能後ls和find操作效能對比

開啟readdir最佳化功能前後,對1000個檔案執行lsfind指令的耗時對比如下。

由以上效能對比圖示看出,1.91及以上版本 with-o readdir_optimize,即1.91及以上版本ossfs開啟readdir最佳化功能後:

  • ls操作效能較1.88.x版本耗時減少74.8%,效能提升至4.0倍;較1.91及以上版本未開啟readdir最佳化功能耗時減少74.3%,效能提升至3.9倍

  • find操作效能較1.88.x版本耗時減少58.8%,效能提升至2.4倍;較1.91及以上版本未開啟readdir最佳化功能耗時減少58.8%,效能提升至2.4倍

開啟直讀功能後大檔案順序讀取效能對比

開啟直讀功能前後,並發順序讀取10個10 GB檔案的耗時和磁碟、記憶體佔用峰值對比如下。

說明

記憶體佔用為整個ossfs進程使用的記憶體,包括直讀功能預取使用的記憶體和其他記憶體。

由以上效能對比圖示看出,1.91及以上版本 with-o direct_read,即1.91及以上版本的ossfs開啟直讀功能後:

  • 大檔案讀取耗時較1.88.x版本減少85.3%,較1.91及以上版本未開啟直讀功能時減少79%

  • 磁碟佔用峰值為0,效果最好。

  • 記憶體佔用峰值略有增加,用少量記憶體換取0磁碟的效果。

如何進行ossfs效能壓測

ossfs效能壓測可以在容器環境或直接在ECS環境中進行,以上效能資料普遍使用開源壓測工具sysbench或自訂指令碼擷取,您也可以在測試環境中切換至1.91及以上版本ossfs進行測試對比。下文以在容器環境中部署測試環境為例介紹如何進行ossfs效能壓測。

操作步驟

  1. 建立OSS儲存卷與儲存聲明PVC,建議您在新建立的Bucket或子路徑下測試。具體操作,請參見使用OSS靜態儲存卷

  2. 使用以下sysbench.yaml內容,建立sysbench應用,並掛載上一步已建立的PVC。

    展開查看sysbench.yaml範例程式碼

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: sysbench
      labels:
        app: sysbench
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: sysbench
      template:
        metadata:
          labels:
            app: sysbench
        spec:
          containers:
          - name: sysbench
            image: registry.cn-beijing.aliyuncs.com/tool-sys/tf-train-demo:sysbench-sleep
            ports:
            - containerPort: 80
            volumeMounts:
              - name: pvc-oss
                mountPath: "/data"
            livenessProbe:
              exec:
                command:
                - sh
                - -c
                - cd /data
              initialDelaySeconds: 30
              periodSeconds: 30
          volumes:
            - name: pvc-oss
              persistentVolumeClaim:
                claimName: pvc-oss
  3. 執行以下命令,部署sysbench應用。

    kubectl apply -f sysbench.yaml
  4. 登入到sysbench容器內,即可使用sysbench工具進行壓測。例如,測試讀寫吞吐可在掛載路徑下參考以下指令執行。

    說明
    • 測試參數請根據測試節點規格或業務情況進行調整。

    • 如需連續測試,請重新準備測試檔案,以避免緩衝的影響。

    實現功能

    執行指令

    準備測試檔案

    sysbench --num-threads=2 --max-requests=0 --max-time=120 --file-num=128 --file-block-size=16384 --test=fileio --file-total-size=1G --file-test-mode=rndrw prepare

    測試順序寫IO

    sysbench --num-threads=2 --max-requests=0 --max-time=120 --file-num=128 --file-block-size=16384 --test=fileio --file-total-size=1G --file-test-mode=seqwr --file-fsync-freq=0 run

    測試順序讀IO

    sysbench --num-threads=2 --max-requests=0 --max-time=120 --file-num=128 --file-block-size=16384 --test=fileio --file-total-size=1G --file-test-mode=seqrd --file-fsync-freq=0 run

    測試隨機讀寫IO

    sysbench --num-threads=2 --max-requests=0 --max-time=120 --file-num=128 --file-block-size=16384 --test=fileio --file-total-size=1G --file-test-mode=rndrw --file-fsync-freq=0 run

    清除測試檔案

    sysbench --test=fileio --file-total-size=1G cleanup 

後續步驟

  • 您可以使用sysbench內建的MySQL測試載入器,在不同的ossfs版本下對其效能進行壓測。

  • 您也可以在該環境中通過ls+find或並發順序讀操作對readdir最佳化功能及直讀功能進行簡單驗證。