バックアップ中のディスクI / Oを制限するにはどうすればよいですか?


14

私は基本的に夜に単純な「tar zcf」を行うcronを持っています。

サーバーには次のものがあります。

  • 8コア-Intel(R)Xeon(R)CPU E5606 @ 2.13GHz
  • 25GB RAM
  • Ubuntu 12.04.2 LTS
  • ハードウェアRAID 1(LSI Logic / Symbios Logic MegaRAID SAS SMC2108)と2つの2.728TBハードドライブ

監視画面のホストで確認できるように:

http://clip2net.com/s/57YRKP

tarのほぼすべての時間で、ディスクI / Oが90%を超え、他のすべてのアプリ(mysql、apache)が非常に遅くなります。

2つの質問:

  • バックアップ中に非常に高いディスクI / Oが発生するのは正常ですか?
  • 他のアプリが正常に動作し続けることができるように、ディスクI / Oを制限する方法はありますか?

ありがとうございました!

回答:


11

かなり一般的なアプローチに加えioniceて、(DM)ブロックデバイスへの帯域幅を正確に制御できるデバイスマッパーターゲット(ioband)があります。残念ながら、それは標準カーネルの一部ではありません。

さらに、おそらく次の方法でtarを高速化できます。

  1. ファイル名をディスクキャッシュに読み込む: find /source/path -printf ""
  2. iノードをディスクキャッシュに読み込む: find /source/path -perm 777 -printf ""
  3. たとえば、mbufferまたはバッファー(少なくとも100 MiBのRAM)を備えたパイプを使用して、tarがディスクに対して大きなブロックを読み書きするようにします。 tar ... | mbuffer -m 256M -P 100 -p 1 ...

ファイル名/ iノードをキャッシュに読み込むと、tar処理中のディスクIOが減少するのはなぜですか?合計時間をわずかに短縮しながら、平均IOを増加させると予想されます。
scai

3
@scaiこれはSSDには役立ちません。私の推奨事項は、ハードディスクの回転のみに言及しています。それらでパフォーマンスを損なうのは、頭の動きです。ファイル名は連続ブロックに保存され、iノードは連続ブロックに保存され、ファイルの内容は連続ブロックに保存されます。tarの方法で実行すると、1つのディレクトリのファイル(およびサブディレクトリ)名を読み取り、1つのファイルのiノード、ファイル自体、次のファイルのiノード、次に次のファイル自体にアクセスします。すべての名前とiノードを順番に読み取るよりも頭の動きが多くなります。
ハウケレイジング

@scaiパフォーマンスへの影響は、実行内容によって異なります。フルバックアップではかなり小さい(おそらくファイルサイズに依存します)が、差分バックアップでは大きな違いに気付きました(ただし、tarではなく、使用しないのでこれは一般的な効果です)。
ハウケレイジング

私が正しく理解したことを確認するだけです。1.および2.では、findコマンドを呼び出すだけで、Linuxは自動的にキャッシュしますか?
acemtp

@acemtpそれは正しいです。find(たとえば)without -permは、ファイルiノードにアクセスしません。ただし、最適化では2つのfind呼び出しを使用できます。同じfind呼び出しを2回(間に少しの時間を置いて)行うと、2番目の呼び出しは通常数秒以内(またはそれ以下)に終了します。空きメモリの量と特定の時点でキャッシュされたデータの量に応じて、データはキャッシュからスローされます。したがって、読みすぎると操作が遅くなるだけです。バックアッププログラムにstdin経由でファイル名を入力できる場合は、たとえば100個のファイルのブロックを読み取ることでこれを防ぐことができます。
ハウケレイジング

13

通常、大規模ファイルを含む大規模ファイルツリーで作成されるため、バックアップ中に高いI / Oが発生することが予想されます。ioniceLinuxのI / Oジョブの優先順位付けにクラスとレベルを使用できます。IIRC、クラス2、レベル7は、他のI / O負荷やユーザーには実質的に見えない、飢えない最低レベルです。参照してください。man ionice使用方法や詳細については。


1

tarを捨ててrsyncを使用することをお勧めします(Dogsbodyによると)。BackupPCを使用してWindowsおよびLinuxシステムのファイルをバックアップします。tarとrsyncの使用をサポートし、ハードリンクを自動的に処理し、優れたWebインターフェイスを提供します。

http://backuppc.sourceforge.net/


0

他の人が答えたように、はい、これは正常ioniceであり、システムに影響を与えない良い一般的な方法です。

何度も私は人々がtar物事を見なければならないのに、彼らがそうする必要がないのを見ました。コピーしているデータの割合が最後のコピー以降変更されていない場合はrsync、試してみることをお勧めします。

これにより、最後のコピー以降に変更されたファイルのみをコピーすることでIOが削減されます。すべてのデータを読み取る必要があるため、IOを半分以上減らすことはできませんが、書き込まれるデータの量を大幅に減らすことができます(ハードウェアによっては、操作が遅くなることもあります)。

実行するたびに個別のコピー/バックアップが必要な場合、最も強力なオプションは-link-destで、変更されていないファイルを以前のバックアップにハードリンクできます。これにより、バックアップサーバーのスペースが大幅に節約されます。たとえば、マシン(Fred)をバックアップし、Fredには20GBのHDがあり、/ procと/ devを除くドライブ全体をバックアップ/コピーします。バックアップサーバーに20GBのディレクトリができました。翌日、Fredを再度バックアップし、–link-destを昨日のバックアップに戻します。Rsyncは、リモートファイルとローカルコピーを比較し、まったく同じ場合はそれらを転送しませんが、新しいファイルを昨日のファイルにハードリンクします。変更されたファイルは新しいものにコピーされます(または可能であれば昨日のバックアップを使用して部分的にコピーされます)。昨日から100MBのファイルのみが変更された場合、20GBのファイルを含む2つのディレクトリがありますが、20個しか占有していません。

それがあなたの質問の助けになり、それでも答えられることを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.