数百万の小さなファイル (平均で約 50 KB) の大容量ストレージで、20 分以上経過したファイルを自動プルーニングするための適切な戦略は何ですか? それらを書き、Web サーバーからアクセスする必要があります。
私は現在 ext4 を使用しており、削除中 (cron でスケジュール) に HDD の使用率が 100% まで急増し、負荷を作成するプロセスとして [flush-8:0] が表示されます。この負荷は、サーバー上の他のアプリケーションに干渉します。削除がない場合、最大 HDD 使用率は 0 ~ 5% です。状況は、ネストされたディレクトリ構造とネストされていないディレクトリ構造で同じです。最悪の部分は、負荷のピーク時の一括削除が挿入の速度よりも遅いように見えることです。そのため、削除する必要があるファイルの量はますます大きくなります。
スケジューラー (deadline、cfq、noop) を変更しようとしましたが、役に立ちませんでした。また、スクリプトを削除するようにioniceを設定しようとしましたが、どちらも役に立ちませんでした。
MongoDB 2.4.3 で GridFS を試してみましたが、うまく機能しますが、古いファイルを大量に削除するときはひどいものです。ジャーナリングをオフにして(nojournal)、削除と挿入の両方の書き込み確認なし(w = 0)でMongoDBを実行しようとしましたが、役に立ちませんでした。削除が行われていない場合にのみ、高速かつスムーズに機能します。
また、innodb_buffer_pool=2GB、innodb_log_file_size=1GB、innodb_flush_log_on_trx_commit=2 を使用するように InnoDB エンジンを設定して、MySQL 5.5、BLOB 列、InnoDB テーブルにデータを保存しようとしましたが、パフォーマンスは悪く、HDD 負荷は常に 80% でした。 100% (予想されますが、試してみる必要がありました)。テーブルは BLOB 列、DATETIME 列、および CHAR(32) latin1_bin UUID のみを使用し、UUID 列と DATETIME 列にインデックスを使用していたため、最適化の余地がなく、すべてのクエリでインデックスが使用されていました。
pdflush 設定 (一括削除中に負荷を作成する Linux フラッシュ プロセス) を調べましたが、値を変更しても何の役にも立たなかったため、デフォルトに戻しました。
自動プルーニング スクリプトを 1 秒ごと、1 分ごと、5 分ごと、30 分ごとにどれだけ頻繁に実行しても、いずれにしてもサーバーが大幅に中断されます。
iノード値を保存しようとしましたが、削除するときは、最初にiノード番号でソートして古いファイルを順番に削除しましたが、役に立ちませんでした。
CentOS 6を使用。HDDはSSD RAID 1です。
自動プルーニングのパフォーマンスの問題を解決する、私のタスクにとって適切で賢明なソリューションは何でしょうか?