ビジーなサイト用に非常に大きな(マルチ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
このページから収集されたすべてのデータ。 以下は、ファイルの大きなディレクトリを削除するためのいくつかのオプションです。これがどのように作成されたかの詳細については、記事をチェックしてください。
コマンド経過システム時間%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は自発的および非自発的なコンテキストスイッチです
ファイルを削除すると、ファイルシステムでメタデータ操作のみが実行され、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の読み込みで問題が発生する可能性があるため、実際には機能しない可能性があります。試してみる必要があります。