我需要使用 nginx 提供大約 70,000 個靜態檔案 (jpg)。我應該將它們全部轉儲到一個目錄中,還是有更好(有效)的方法?由於檔案名稱是數字,我考慮採用以下目錄結構:
xxx/xxxx/xxx
作業系統是CentOS 5.1
答案1
標竿、標竿、標竿!你可能會發現無顯著差異在這兩個選項之間,這意味著您的時間最好花在其他問題上。如果您進行基準測試並發現沒有真正的差異,請選擇更容易的方案 - 如果只有程式必須存取文件,那麼什麼是易於編碼的,或者如果人們需要經常使用文件,則什麼是易於人類使用的。
至於哪個更快,我相信目錄查找時間與目錄中文件數量的對數成正比。因此,嵌套結構的三個查找中的每一個都會比一次大查找更快,但所有三個查找的總和可能會更大。
但別相信我,我不知道我在做什麼!衡量績效當重要的時候!
答案2
這實際上取決於您用來儲存文件的檔案系統。
當一個目錄中有數千個檔案時,某些檔案系統(例如 ext2 和較小程度的 ext3)會非常慢,因此使用子目錄是一個非常好的主意。
其他檔案系統,如 XFS 或 reiserfs(*),不會因一個目錄中包含數千個檔案而減慢速度,因此無論您有一個大目錄還是許多較小的子目錄都沒有關係。
(*) reiserfs 有一些不錯的功能,但它是一個實驗性玩具,有過災難性失敗的歷史。不要在任何非常重要的事情上使用它。
答案3
正如其他人所說,目錄雜湊很可能是最佳的。
我建議你做的是讓你的 URI獨立的無論你使用什麼目錄方案,使用nginx的重寫模組,例如將example.com/123456.jpg對應到/path/12/34/123456.jpg
然後,如果您的目錄結構因效能原因需要更改,您可以更改目錄結構,而無需更改已發布的 URI。
答案4
你可以在你的 nginx 伺服器前面放置一個魷魚快取。 Squid 可以將流行的圖像保留在記憶體中,也可以使用它自己的文件佈局進行快速查找。
對於Squid,預設為16個一級目錄和256個二級目錄。這些是我的檔案系統的合理預設值。
如果您不使用 Squid 這樣的產品,並創建自己的檔案結構,那麼您需要為您的檔案製定合理的雜湊演算法。如果檔案名稱是隨機產生的,這很容易,您可以使用檔案名稱本身來劃分儲存桶。如果您的所有檔案看起來都像 IMG_xxxx,那麼您要么需要使用最低有效數字,要么對檔案名稱進行雜湊並根據該雜湊號碼進行劃分。