2008-11-03 71 views
7

我有一個網絡服務器,它可以保存緩存文件並保存7天。文件名是MD5哈希值,即正好32個十六進制字符長,被保存在一個樹狀結構,看起來像這樣:處理大量臨時小文件

00/ 
    00/ 
    00000ae9355e59a3d8a314a5470753d8 
    . 
    . 
00/ 
    01/ 

你的想法。

我的問題是刪除舊文件需要很長時間。我有一個每天運行的cron任務

find cache/ -mtime +7 -type f -delete 

需要超過半天時間才能完成。我擔心可擴展性及其對服務器性能的影響。此外,緩存目錄現在在我的系統中是一個黑洞,它偶爾陷入無辜的dufind

LRU緩存的標準解決方案是某種堆。有沒有辦法將其擴展到文件系統級別? 有沒有其他的方式來實現這一點,使其更容易管理?

這裏有想法我認爲:

  1. 創建7個頂部目錄,每天一個星期每一天,空單目錄。這會將緩存文件的搜索時間延長7倍,當文件被覆蓋時會使其變得非常複雜,而且我不確定它會對刪除時間起什麼作用。
  2. 將文件保存爲帶名稱和日期索引的MySQL表中的blob。這似乎很有希望,但實際上它總是比FS慢得多。也許我做得不對。

任何想法?

回答

15

當你存儲一個文件時,建立一個符號鏈接到按日期而不是按名稱組織的第二個目錄結構。

使用「名稱」結構檢索您的文件,使用「日期」結構刪除它們。

+0

錯誤:)你擊敗了我。 +1這個答案。 – 2008-11-03 09:48:01

0

如何在數據庫中使用散列作爲關鍵字的表。其他字段將成爲文件的名稱。這樣文件可以以日期相關的方式存儲以便快速刪除,並且數據庫可以用於以快速方式基於散列來查找文件的位置。

1

Reiserfs在處理小文件方面相對高效。你有沒有嘗試不同的Linux file systems?我不確定刪除性能 - 您可以考慮格式化(mkfs)作爲單個文件刪除的替代。例如,您可以爲每個工作日創建一個不同的文件系統(cache1,cache2,...)。

1

如何:

  • 呼籲,比如說另一個文件夾,「ToDelete」
  • 當您添加一個新的項目,得到今天的日期,並尋找在「ToDelete」子文件夾,有一個名字表示當前日期的
  • 如果它不存在,創建它
  • 添加符號鏈接到你在今天的文件夾中創建
  • 創建轉到文件夾「ToDelete」,這是一個cron作業項目的屍體切換日期並刪除所有鏈接的文件夾。
  • 刪除包含所有鏈接的文件夾。
4

假設這是ext2/3你試過在索引目錄中添加嗎?當你在任何特定目錄中有大量的文件時,查找將會非常緩慢地刪除某些東西。
使用tune2fs -o dir_index啓用dir_index選項。
安裝文件系統時,請確保使用noatime選項,該選項可以阻止操作系統更新目錄的訪問時間信息(仍然需要修改它們)。
看看原來的帖子,好像你只有兩個層次的間接文件,這意味着你可以在葉目錄中有大量的文件。如果有超過一百萬個條目,您會發現搜索和更改非常緩慢。另一種方法是使用更深層次的目錄,減少任何特定目錄中的項目數量,從而降低搜索和更新個別目錄的成本。