現代文件系統中數百萬個文件的性能影響是什麼?
假設我們使用 ext4(啟用 dir_index)來託管大約 3M 個文件(平均大小為 750KB),我們需要決定我們將使用哪種文件夾方案。
在第一個解決方案中,我們對文件應用雜湊函式並使用兩級文件夾(第一級為 1 個字元,第二級為 2 個字元):因此
filex.for
雜湊等於abcde1234,我們將其儲存在 /path / a/bc /abcde1234-filex.for.在第二種解決方案中,我們對文件應用雜湊函式並使用兩級文件夾(第一級為 2 個字元,第二級為 2 個字元):因此
filex.for
雜湊等於abcde1234,我們將其儲存在 /path / ab/de /abcde1234-filex.for.對於第一個解決方案,我們將採用以下方案
/path/[16 folders]/[256 folders]
,每個文件夾平均有 732 個文件(最後一個文件夾,文件所在的位置)。而在第二種解決方案中
/path/[256 folders]/[256 folders]
,每個文件夾平均有 45 個文件。考慮到我們要從這個方案中寫入/取消連結/讀取文件(但主要是讀取)(基本上是 nginx 記憶體系統),如果我們選擇一個或其他解決方案,它在性能意義上是否重要?
此外,我們可以使用哪些工具來檢查/測試此設置?
創建這種目錄結構的原因是文件系統必須在目錄中定位文件,目錄越大,操作越慢。
慢多少取決於文件系統設計。
ext4 文件系統使用B-tree來儲存目錄條目。對該表的查找預計需要*O(log n)*時間,大部分時間少於 ext3 和以前的文件系統使用的幼稚線性表(如果不是,則目錄太小而無法使用)真的很重要)。
XFS 文件系統使用B+tree代替。與雜湊表或 B-tree 相比,它的優點是任何節點都可以有多個子b,其中在 XFS 中b變化並且可以高達 254(或根節點為 19;並且這些數字可能已經過時)。這為您提供了*O(log b n)*的時間複雜度,這是一個巨大的改進。
這些文件系統中的任何一個都可以處理單個目錄中的數万個文件,在具有相同 inode 數量的目錄中,XFS 比 ext4 快得多。但是您可能不想要具有 3M inode 的單個目錄,因為即使使用 B+樹,查找也可能需要一些時間。這就是導致首先以這種方式創建目錄的原因。
至於您提出的結構,您給出的第一個選項正是 nginx 範例中顯示的內容。它在任何一個文件系統上都能很好地執行,儘管 XFS 仍然有一點優勢。第二個選項的性能可能稍好或稍差,但它可能非常接近,即使在基準測試中也是如此。