通過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。
ossfs相關功能僅支持在ECS節點上使用。
基礎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優化功能。 | 直接使用 | disable |
| 開啟時,用于記錄軟鏈接的擴展信息,以確保創建的軟鏈接對象正常顯示。 | 直接使用 | disable |
新增直讀功能
新增直讀功能,優化大文件順序讀(只讀)的性能。
掛載OSS存儲卷時,為支持完整的寫及隨機讀場景,從OSS服務端讀文件時,需要先將數據存儲至磁盤,再從磁盤中讀取數據返回,即ossfs的最大讀性能將受到磁盤IO限制。
直讀功能將使用內存預取數據,跳過數據刷盤即直接寫入數據而不立刻同步到磁盤,直接從內存讀取返回,提升順序讀性能。但需要注意以下事項:
建議適用于順序讀(只讀)場景,打開某個文件后:
隨機讀操作:將觸發ossfs重新預取新數據,大量的隨機讀操作可能影響讀性能。
寫操作:為保證性能與數據一致性,將自動回退到默認的刷盤邏輯。
開啟直讀功能時,
use_cache
配置項會失效。使用內存存儲預取數據,可能會導致內存使用增加。可參考下表中direct_read_prefetch_limit配置項限制內存使用量。當到達內存上限時,將自動停止預取,最大讀性能將受網絡IO限制。
直讀功能相關的配置項如下表所示:
配置項 | 說明 | 1.91及以上版本默認值 |
| 是否開啟直讀功能。直接使用-o direct_read開啟,無需value。 | disable |
| 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個文件執行ls
及find
指令的耗時對比如下。
由以上性能對比圖示看出,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性能壓測。
操作步驟
創建OSS存儲卷與存儲聲明PVC,建議您在新創建的Bucket或子路徑下測試。具體操作,請參見使用OSS靜態存儲卷。
使用以下sysbench.yaml內容,創建sysbench應用,并掛載上一步已創建的PVC。
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
執行以下命令,部署sysbench應用。
kubectl apply -f sysbench.yaml
登錄到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優化功能及直讀功能進行簡單驗證。