通過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。
執行以下命令,部署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最佳化功能及直讀功能進行簡單驗證。