Glusterfs目錄ls性能優化方案分析

目的和優化思路

討論了glusterfs對文件系統爬蟲rsync/ls目錄性能的現有優化措施和可能的進一步優化方案。優化思路是減少本地文件系統的元數據操作,減少fuse client的負載,減少req的網絡輪詢次數,減少一次網絡通信時間,緩存預抓取,併發,異步,bulk 傳輸

fuse readdirplus

centos 6.4最新內核,支持fuse readdirplus。微調mount timeout參數。

readdir-ahead

這個已經合併到3.5release以後了。主要進行了單線程ls順序目錄讀的優化。通過在opendir時(在執行回調時)去提前抓取目錄項作爲緩存,同時也會在glusterfs readdirplus支持(內核和glusterfs fuse都支持)的情況下,抓取目錄項的inode屬性和擴展屬性,readdir(p)時可以直接返回或者此時抓取目錄項緩存。基於fuse readdirplus性能會更加優化。基於fd生命週期進行的緩存。功能還很不強大,需要強化。

FUSE_AUTO_INVAL_DATA

根據內核FUSE_AUTO_INVAL_DATA支持,啓用--fopen-keep-cache mount選項。 新內核版本支持。glusterfs fuse默認行爲是寫操作是同步的,讀文件操作從page cache中讀。當打開一個文件時,失效原來file的page cache。啓用此選項後,就可以根據需要,如果原來file page cache 內容沒變,就不進行失效操作。

quick-read

glusterfs3.4把quick-read(3.3就這一個translaotr)分解爲openbehind和quick-read。原來設計不管操作文件的目的是什麼,都要獲取真正的fd。重構後,可以根據文件操作目的,如果是修改文件內容,就在背景打開文件並進行操作。如果僅僅是fstat等類似操作,就利用匿名fd來進行,不會等待真正的fd。這樣根據操作目的,優化了性能。在lookup時根據需要,設置xdata key,在posix translator層就抓取文件內容。read操作執行到quick-read層時就返回文件內容。

md-cache

主要是inode attr和xattr在readdir (p)時抓取;lookup只抓取當時操作的目錄或文件的inode屬性,而不是所有目錄項。這個translator可以對ls時候對stat和擴展屬性抓取導致的延遲進行優化。但目前我們一般關閉selinux和acl擴展屬性支持,所以擴展屬性的ls優化暫時不起作用。

其他可能影響的translator,有待分析

  • io-threads 服務器和客戶端設置

  • libaio

  • scatter-gather IO

進一步的優化方向

  • fuse內核當前支持4k readdir buffer大小。可以修改內核代碼支持較大chunk的buffer。readdir-ahead就是用一個glusterfs rpc 128k buffer進行了bulk獲取,但也僅僅是在用戶空間進行了預抓取。Brian Foster進行了這方面的優化實驗。

  • 強化readdir-ahead,做成一個強大的client緩存架構,先做目錄項緩存,後面再考慮其他的。

    • 多線程,非順序目錄讀的情況

    • 緩存基於inode,進行持久緩存

    • Xavier Hernandez提出了取代inodelk/entrylk的一種無鎖架構,有助於在client實現一個強大的緩存。目前社區已經進行了一次討論緩存架構的頭腦風暴。正在跟進。

    • dht讀目錄本來就是順序(一個一個brick進行讀取),應該分析是否可以放寬這樣的限制

  • 小文件合併爲大文件的transtlaotr。這個可以參考hystack和tfs的實現。

  • 參考hdfs的中央緩存架構,不在client做真正的緩存,而在brick端緩存,client只做路由。或者client和brick都做緩存。

  • 分層存儲。這個glusters 已經在開始做了。

參考資料

gluster maillist,irc,code,review。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章