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


8

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

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

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

rm -rfさらにディスクを共有するために飼いならす方法はありますか?手がかりを得る別のテクニックを使用する必要がありioniceますか?

更新:

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

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

また、使用しているファイルシステムとその方法(マウントオプション)についても言及する必要があります。
クリスティアンCiupitu 2013年

更新しました。また、問題がある場合、これはUbuntu 12.04にあります。
David Eyk 2013年

Amazon EBSのIOパフォーマンスはかなり悪い場合があることに注意してください。perfcap.blogspot.com/2011/03/…を参照してくださいこれは、長期的な最大100 iopsを推奨し、短期(1分)のバーストは最大1000です。あなたのケースは1分よりもはるかに高いようです、したがって問題。
Moshe Katz

そのため、キャッシュにはEBSではなくインスタンスストアを使用しています。私の更新コメントを参照してください。それが明確でない場合は申し訳ありません。
David Eyk 2013年

申し訳ありませんが、遅くなりましたが、cgroupsとblkioコントローラーを調査できます:kernel.org/doc/Documentation/cgroups/blkio-controller.txt
AndreasM '22 / 10/13

回答:


3

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

コマンド経過システム時間%CPU cs1 *(Vol / Invol)
rsync -a –delete empty / a 10.60 1.31 95%106/22
検索b / -type f -delete 28.51 14.46 52%14849/11
c / -type fを見つける| xargs -L 100 rm 41.69 20.60 54%37048/15074
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は、自発的および非自発的なコンテキストスイッチです


これにより理論的には質問に答えることができますが、ここに答えの本質的な部分を含め、参照用のリンクを提供することが望ましいでしょう
トムO'Connor

魅力的です!私はそれを試してみます。
David Eyk 2013年

rsync現在実行中です。多分それは言うには時期尚早であり、忙しい朝の真っ只中にそれを実行していないことは助けになるかもしれませんが、サーバーはまだ応答性があり、負荷平均は管理可能です。
David Eyk 2013年

私が使用している正確な呼び出し:ionice -c 3 nice -19 rsync -a --delete /mnt/empty/ /mnt/nginx-cache-old
David Eyk 2013年

まあ、それだけで4時間かかりました。;)私は簡単な呼び出しのように私のように、この答え(申し訳ありません@aferber)を受け入れるつもりだ、影響を受けやすいように見えるniceionice、またはのような、少なくともそれは、サーバーを破壊しなかったrm -rfでした。
David Eyk 2013年

9

ファイルを削除すると、ファイルシステムでメタデータ操作のみが実行され、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負荷で問題が発生する可能性があるため、実際には機能しない可能性があります。あなただけ試してみなければなりません。


その多くのファイルの削除には長い時間がかかるため、それを含む「オフピーク」期間は実際にはありません。:(
David Eyk 2013年

whileループは時にトリックを行うようですhead -n 50。100はまだ負荷平均をクリティカルよりもゆっくりと上げていました。これは、リソースの競合が多すぎることを示しています。
David

実行に長い時間がかかります!
David Eyk 2013年

検索では、whileループの反復ごとに、ディレクトリ内のすべてのファイルとすべてのサブディレクトリがリストされます。あなたはおそらく次のようなものでもっとうまくやることができます
Randy Orrison

1
検索では、whileループの反復ごとに、ディレクトリ内のすべてのファイルとすべてのサブディレクトリがリストされます。おそらくfind dir -type f -print0 | xargs -l50 -0 rmwaitここで、rmwaitはrm "$ @"を実行するスクリプトです。sleep 2.スペースを含むファイル名を処理するための-print0および-0の使用に注意してください。-l50は、xargsに一度に50しか実行しないように指示します。
Randy Orrison 2013年

-1

「nice」コマンドとペアにすることができます。 ionice -c 3 nice -19 rm -rf /some/folder

これにより、マシン上のプロセスの優先順位が変更されます。


残念ながら、niceと同じくらいの効果があるようioniceです。
David Eyk 2013年

@DavidEyk。niceとioniceが「注目に値する」効果を持たない場合、それは他に何も認識できるほどリソースを争っていないことを意味するか、単に肉眼で効果に気づいていないだけです。実際の効果を確認するには、iostatとvmstatを使用してベンチマークする必要があります。
Michael Martinez

私は@aferberが彼の答えでこれに対処したと信じています:「ファイルを削除すると、ファイルシステム上でメタデータ操作のみが実行され、ioniceの影響を受けません。」競合を確認しました。CPUがローフしrm -rfていて、99%がオンである間、私のサーバープロセスは読み取り時間に飢えていましたiotop
David Eyk 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.