7

キャッシュファイルを保存して7日間保持するWebサーバーがあります。ファイル名はmd5ハッシュ、つまり正確に32文字の16進文字であり、次のようなツリー構造で保持されています。

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

あなたはその考えを理解します。

私の問題は、古いファイルの削除に非常に長い時間がかかることです。私は毎日実行するcronジョブを持っています

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

完了するまでに半日以上かかります。スケーラビリティと、これがサーバーのパフォーマンスに与える影響について心配しています。さらに、キャッシュディレクトリは私のシステムのブラックホールになり、時折無実duまたはをトラップしfindます。

LRUキャッシュの標準的なソリューションは、ある種のヒープです。これをファイルシステムレベルにスケーリングする方法はありますか?管理を容易にする方法でこれを実装する他の方法はありますか?

これが私が考えたアイデアです:

  1. 平日ごとに1つずつ、合計7つのトップディレクトリを作成し、毎日1つのディレクトリを空にします。これにより、キャッシュファイルのシーク時間が7倍になり、ファイルが上書きされると非常に複雑になり、削除時間にどのように影響するかわかりません。
  2. 名前と日付にインデックスを付けたMySQLテーブルにファイルをblobとして保存します。これは有望に見えましたが、実際には常にFSよりもはるかに低速でした。多分私はそれを正しくやっていない。

何か案は?

4

5 に答える 5

15

ファイルを保存するときは、名前ではなく日付で整理された2番目のディレクトリ構造へのシンボリックリンクを作成します。

「name」構造を使用してファイルを取得し、「date」構造を使用してファイルを削除します。

于 2008-11-03T09:45:18.780 に答える
4

これが ext2/3 であると仮定すると、インデックス付きディレクトリに追加しようとしましたか? 特定のディレクトリに多数のファイルがある場合、検索は何かを削除するのに非常に遅くなります。
tune2fs -o dir_index を使用して、dir_index オプションを有効にします。
ファイルシステムをマウントするときは、必ず noatime オプションを使用してください。これにより、OS がディレクトリのアクセス時間情報を更新するのを停止します (まだ変更する必要があります)。
元の投稿を見ると、ファイルへの間接化が 2 レベルしかないように見えます。つまり、リーフ ディレクトリに膨大な数のファイルを配置できるということです。これらのエントリが 100 万を超えると、検索と変更が非常に遅くなることがわかります。別の方法として、ディレクトリのより深い階層を使用して、特定のディレクトリ内のアイテムの数を減らし、特定の個々のディレクトリに対する検索と更新のコストを削減することもできます。

于 2008-11-03T10:13:24.447 に答える
1

Reiserfsは、小さなファイルの処理に比較的効率的です。別のLinuxファイルシステムを試しましたか?削除のパフォーマンスについてはよくわかりません。個々のファイルを削除する代わりに、フォーマット(mkfs)を検討できます。たとえば、平日ごとに異なるファイルシステム(cache1、cache2、...)を作成できます。

于 2008-11-03T09:42:22.293 に答える
1

これはどう:

  • 「ToDelete」という別のフォルダを作成します
  • 新しいアイテムを追加するときは、今日の日付を取得し、現在の日付を示す名前を持つ「ToDelete」のサブフォルダーを探します
  • ない場合は作成してください
  • 今日のフォルダに作成したアイテムにシンボリックリンクを追加します
  • 正しい日付の「ToDelete」内のフォルダに移動するcronジョブを作成し、リンクされているすべてのフォルダを削除します。
  • すべてのリンクが含まれているフォルダを削除します。
于 2008-11-03T09:47:30.273 に答える
0

ハッシュをキーとして使用するテーブルをデータベースに配置するのはどうですか。もう1つのフィールドは、ファイルの名前になります。これにより、ファイルを日付に関連した方法で保存してすばやく削除でき、データベースを使用して、ハッシュに基づいてそのファイルの場所をすばやく見つけることができます。

于 2008-11-03T09:35:37.643 に答える