GNU/Linux >> Linux の 問題 >  >> Linux

サーバーを妨害せずに何百万ものファイルを削除する方法

解決策 1:

次のような bash スクリプトを作成します:

#!/bin/bash
rm -- "$*"
sleep 0.5

deleter.sh という名前で保存します 例えば。 chmod u+x deleter.sh を実行 実行可能にします。

このスクリプトは、引数として渡されたすべてのファイルを削除し、0.5 秒間スリープします。

次に、実行できます

find cache.bak -print0 | xargs -0 -n 5 deleter.sh

このコマンドは、cache.bak 内のすべてのファイルのリストを取得し、一度に 5 つのファイル名を削除スクリプトに渡します。

そのため、一度に削除するファイルの数と、各削除操作間の遅延時間を調整できます。

解決策 2:

誰かがコメントで述べたように、マウント/アンマウントできる別のファイルシステムにキャッシュを保存することを検討する必要があります。それまでは、この 1 つのライナー /usr/bin/find /path/to/files/ -type f -print0 -exec sleep 0.2 \; -exec echo \; -delete を使用できます 検索バイナリが /usr/bin の下にあり、進行状況を画面で確認したいとします。それに応じてスリープを調整し、HDD に過剰な負荷をかけないようにします。

解決策 3:

find コマンドの出力を使用するスクリプトで ionice を試してみてください。次のようなもの:

ionice -c3 $(
for file in find cache.bak -type f; do
    rm $file
done
for dir in find cache.bak -depthe -type d -empty; do
    rmdir $dir
done
)

ファイルシステムによっては、各ファイルを削除すると、そのディレクトリ全体が書き換えられる場合があります。非常にヒットする可能性のある大きなディレクトリの場合。 inode テーブルに必要な追加の更新があり、場合によっては空き領域リストがあります。

ファイル システムにジャーナルがある場合、変更はジャーナルに書き込まれます。適用;そして日記から削除。これにより、書き込み集中型アクティビティの I/O 要件が増加します。

キャッシュ用のジャーナルなしでファイルシステムを使用したい場合があります。

ionice の代わりに、sleep コマンドを使用してアクションのレート制限を行うことができます。これは、ionice が機能しなくても機能しますが、すべてのファイルを削除するには時間がかかります。

解決策 4:

ここで多くの有用な回答/コメントを得ました。結論として、私の解決策も示したいと思います.

<オール>
  • はい、防止する最善の方法です そのようなことが起こっているのは、キャッシュディレクトリを別のファイルシステムに保持することです。ファイル システムの Nuking / クイック フォーマットには、そこに存在するファイル / ディレクトリの数に関係なく、常にせいぜい数秒 (場合によっては数分) かかります。

  • ionice / nice 削除プロセスは実際にはほとんど I/O を発生させなかったため、ソリューションは何もしませんでした。 I/O の原因は、削除プロセスによってファイルがあまりにも早く削除されたときに、カーネル / ファイルシステム レベルのキュー / バッファーがいっぱいになったことだと思います。

  • 私が解決した方法は Tero Kilkanen の解決策と似ていますが、シェル スクリプトを呼び出す必要はありませんでした。 --bwlimit に組み込まれている rsync を使用しました 削除速度を制限するように切り替えます。

  • 完全なコマンドは次のとおりです:

    mkdir empty_dir
    rsync -v -a --delete --bwlimit=1 empty_dir/ cache.bak/
    

    現在、bwlimit はキロバイト単位で帯域幅を指定します。この場合、ファイル名またはファイルのパスに適用されます。 1 KBps に設定すると、1 時間あたり約 100,000 ファイル、つまり 1 秒あたり 27 ファイルが削除されました。ファイルには cache.bak/e/c1/db98339573acc5c76bdac4a601f9ec1e のような相対パスがありました 、これは 47 文字の長さなので、1 秒あたり 1000/47 ~=21 ファイルになります。これは、1 時間あたり 100,000 ファイルという私の推測に似ています。

    なぜ --bwlimit=1 なのか ?さまざまな値を試しました:

    • 10000、1000、100 -> 以前のようにシステムの速度が低下
    • 10 -> システムはしばらくの間は問題なく動作しますが、1 分に 1 回ほど部分的な速度低下が発生します。 HTTP 応答時間はまだ 1 秒未満です。
    • 1 -> システムの速度低下はまったくありません。私は急いでいませんし、この方法で 1 日以内に 200 万個のファイルを削除できるので、この方法を選択します。

    rsync の組み込みメソッドのシンプルさが気に入っていますが、この解決策は相対パスの長さに依存します。ほとんどの人は試行錯誤によって適切な値を見つけるので、大きな問題ではありません。


    Linux
    1. KVMサーバーを高速にセットアップする方法

    2. パスワードを入力せずにSSH経由でファイルをリモートコピーする方法は?

    3. LinuxでTomcatサーバーを起動するには?

    1. FOG画像を正しく削除する方法

    2. find コマンドを使用せずに n 日より古いファイルを削除する方法

    3. 実行可能ファイル (別名拡張子のないファイル) のみを削除/削除する方法

    1. ディレクトリ内のファイルの数を数え、その数が5を超えた場合に最も古いものを削除するにはどうすればよいですか?

    2. 解凍せずに zip アーカイブ内のファイルを一覧表示するにはどうすればよいですか?

    3. .fuse_hidden* ファイルを削除するには?