tarがCPUとディスクを使いすぎないようにする(100%の場合、古いラップトップがクラッシュする)


15

1テラバイトのデータを外部ディスクにバックアップしたい。

私はこのコマンドを使用しています: tar cf /media/MYDISK/backup.tar mydata

問題:CPUまたは100%のディスクを100%使用すると、ラップトップがフリーズしてクラッシュします(これについて反応したい場合は、ここに書いてください。したがって、CPUの最大50%、ディスクの最大50%にとどまりたいと思います。

私の質問:tarコマンドでCPUとディスクを調整する方法は?

Rsyncには--bwlimitオプションがありますが、1)多くの小さなファイルがあるため2)ツリーではなく単一のファイルを管理したいので、アーカイブが必要です。それが私が使用する理由ですtar


1
このような巨大なtarball:DDDを作成するなんて賢いアイデアでしょうか。
ジリブ

1
@JiriXichtkniha:niceCPU使用率100%を妨げません
ニコラスラウル

回答:


22

pvパイプの帯域幅を調整するために使用できます。ユースケースはIOに強くバインドされているため、パイプを通過する際のCPUオーバーヘッドの増加は目立たないはずであり、CPUスロットリングを行う必要はありません。

tar cf - mydata | pv -L 1m >/media/MYDISK/backup.tar

1
私が期待していたものよりもさらに良い!IOを5 mb /秒に制限していますが、CPUは13%のままです(暗号化が行われていると合理的と思われます)。
ニコラスラウル

1
非常に素晴らしい!。プログレスバーを削除するために、-qフラグもお勧めします。
szabgab

このような素晴らしいコマンド!!! Debian / Ubuntuにない場合は、単に実行してくださいapt-get install pv。後に `-b`を追加することをお勧めし-L 1mます。この方法では、増分バイトカウンターが印刷され、毎秒更新されます。このようにして、これまでに何バイトが書き込まれたかを知ることができます
-lucaferrario

また、(使用してあなたが圧縮出力場合というくださいノートtar czfの代わりにtar cf)制限が圧縮された出力を参照(これで-L 1m、あなたのディスクの書き込み1メガバイト/秒を超えることはありません....しかし、あなたのディスクの読み取りは、1メガバイト/秒の間でしょうおよびコンテンツタイプに応じて5 MB / s)
-lucaferrario

素晴らしいトリック!xzで圧縮する場合、最初にpvを介して、次にxzを介してパイプします。
ジャン=ベルナールヤンセン

8

CPUの割合を制限するcpulimitツールを試すことができます。これは標準のツールではないため、インストールする必要があります。READMEの抜粋を以下に示します。

「Cpulimitは、プロセスのCPU使用量を制限しようとするツールです(CPU時間ではなく、パーセンテージで表されます)。[...]使用されたCPU量の制御は、SIGSTOPおよびSIGCONT POSIXシグナルをプロセスに送信して行われます。指定されたプロセスの子プロセスとスレッドは、CPUの同じ割合を共有します。」

次に、IOの使用を制限するためのioniceをお勧めしますが、制限されるのは同時アクセスであり、最大スループットではありません。それでも使用方法は次のとおりです。

ionice -c 3 <your_command>

すごい!cpulimitが私が探していたもののようです。
ニコラスラウル

2

実際に実行するプロセスを減らすことはできません。niceより低い優先度を与えるために使用できますが、それは他のプロセスに関連しています。プロセスの実行中にCPUクーラーを実行する方法はusleep(3)、特定の時間だけプロセスを実行状態から強制的に解除することですが、それにはパッチを適用するtarか、LD_PRELOAD的に解除することですtarが、それにはパッチを適用する多くを使用するパッチ機能を提供するメカニズムを(例:fopen(3))。

あなたの最善の回避策は、SuperUserであなたが言及したハードウェアであると思われます:ラップトップをクールに保ち、CPUクロックを下げる。

迷惑ではあるが実行可能な可能性のある回避策(実際には手抜き)は、「巨視的」レベルで機能します。tar200msごとに100ms実行するのではなく、2回ごとに1秒実行するようにできます。注:これは恐ろしい、恐ろしいクラッジです。しかし、ちょっと、それはうまくいくかもしれません!

tar cjf some-file.tar.bz2 /some-directory &
while true; do
    sleep 1  # Let it run for a second
    kill -STOP $! 2>/dev/null || break
    sleep 1  # Pause it for a second
    kill -CONT $! 2>/dev/null || break
done

最初はsleepスリープ時間を調整し、2番目はランタイムを調整します。現在のところ、50%のデューティサイクルになっています。温度を下げるには、デューティサイクルをおそらく25%以下に下げる必要があります(1秒実行、3秒スリープ= 4秒ごとに1 = 25%デューティサイクル)。sleepちなみに、シェルコマンドは、わずかな時間しかかかりません。だからあなたも言うことができますsleep 0.1。念のため0.001を超えないようにしてください。また、スクリプトの実行が時間を増やすことを忘れないでください。


+1いいね!Huygensが示唆するcpulimitツールに似ていると思います。
ニコラスラウル

Huuygensのツールがはるかに優れており、より実用的であることを除けば、その答えは私自身の+1を得た理由です。:)
アレクシオス

0

CPUを制限するより一般的な目的の方法は、を使用すること/sysです。これはとにかくあなたが望むもののようですtar計算量の多いタスクを実行ができるからtarです。

これを行う方法は次のとおりです。

  1. /sys/devices/system/cpu/cpuX/cpufreq各CPUに移動します(置き換えますcpuX各CPUとします)。
  2. 次に、ファイルを調べます scaling_available_frequenciesを調べて、CPUがサポートする周波数を確認します。
  3. 周波数を選択して(1234567と言う)、実行する echo 1234567 > scaling_max_freq

これにより、CPUが指定された周波数を超えることがなくなります。


ありがとう、しかし、私はすでに最低の頻度でいます。言及すべきだった。これらの問題が現れ始めるとすぐに、アンダークロックを開始しました。
ニコラスラウル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.