web-dev-qa-db-ja.com

サブツリーの削除( `rm -rf`)がディスクI / Oの他のプロセスを枯渇させないようにするにはどうすればよいですか?

ビジーなサイト用に非常に大きな(マルチGB)Nginxキャッシュディレクトリがあり、一度にすべてクリアする必要がある場合があります。私は過去に、キャッシュフォルダーを新しいパスに移動し、古いパスに新しいキャッシュフォルダーを作成してから、古いキャッシュフォルダーをrm -rfすることで、これを解決しました。

ただし、最近、忙しい朝にキャッシュをクリアする必要がある場合、Nginxとその前にあるサーバーの両方が読み取りを多用するため、rm -rfからのI/Oがサーバープロセスのディスクアクセスを枯渇させています。 CPUがアイドル状態にあり、rm -rfがディスクの98〜99%を占める間、負荷の平均が上昇するのを見ることができますIO in iotop

rmを呼び出すときにionice -c 3を試しましたが、観察された動作に感知できるほどの影響はないようです。

rm -rfを飼いならしてディスクをもっと共有する方法はありますか? ioniceから手がかりを得る別の手法を使用する必要がありますか?

更新:

問題のファイルシステムはAWSEC2インスタンスストアです(プライマリディスクはEBSです)。 /etc/fstabエントリは次のようになります。

/dev/xvdb       /mnt    auto    defaults,nobootwait,comment=cloudconfig 0       2
8
David Eyk

このページから収集されたすべてのデータ。 以下は、ファイルの大きなディレクトリを削除するためのいくつかのオプションです。これがどのように作成されたかの詳細については、記事をチェックしてください。

コマンド経過システム時間%CPU cs1 *(Vol/Invol)
 rsync -a –delete empty/a 10.60 1.31 95%106/22 
 find b/-type f-削除28.5114.46 52%14849/11 
 find c/-type f | xargs -L 100 rm 41.69 20.60 54%37048/15074 
 find d/-type f | xargs -L 100 -P 100 rm 34.32 27.82 89%929897/21720 
 rm -rf f 31.29 14.80 47%15134/11 

* cs1は自発的および非自発的なコンテキストスイッチです

3
Back2Basics

ファイルを削除すると、ファイルシステムでメタデータ操作のみが実行され、ioniceの影響を受けません。

最も簡単な方法は、現在ディスクスペースが必要ない場合、オフピーク時にrmを実行することです。

MIGHTが機能するより複雑な方法は、時間の経過とともに削除を分散させることです。次のようなことを試すことができます(パスとファイル名にスペースが含まれていないことを前提としていることに注意してください!):

while find dir -type f | head -n 100 | xargs rm; do sleep 2; done
while find dir -type d -depth | head -n 100 | xargs rmdir; do sleep 2; done

また、最初のコマンドでrm -fを使用することはできません。これは、ループが停止しないためです(引数がない場合は、rmのエラー終了コードによって異なります)。

サイクルあたりの削除数(この例では100)とスリープ期間を変更することで微調整できます。ただし、ファイルシステムがメタデータの更新をまとめて、IOの読み込みで問題が発生する可能性があるため、実際には機能しない可能性があります。試してみる必要があります。

9
aferber