web-dev-qa-db-ja.com

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

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

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

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

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

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

15
Nicolas Raoul

pv を使用して、パイプの帯域幅を調整できます。ユースケースは強くIOにバインドされているため、パイプを通過することによる追加のCPUオーバーヘッドは顕著ではなく、CPUスロットルを実行する必要はありません。

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

CPUパーセンテージを制限する cpulimitツール を試すことができます。これは標準のツールではないため、インストールする必要があります。以下は、READMEの簡単な抜粋です。

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

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

ionice -c 3 <your_command>
8
Huygens

実際にプロセスを実行することはできませんlessNiceを使用して優先度を低くすることもできますが、これは他のプロセスとの関係です。プロセスの実行中にCPUクーラーを実行する方法は、usleep(3)を使用して、プロセスを一定時間実行状態から強制的に解放することですが、これにはtarのパッチ適用または使用_LD_PRELOAD_メカニズムにより、tarが頻繁に使用するパッチが適用された関数を提供します(例:fopen(3))。

あなたの最善の回避策は、SuperUserで述べたハードウェアの1つだと思います。ラップトップを涼しく保つか、CPUクロックを下げることです。

煩わしいが実行可能な回避策(実際にはkludge)は「巨視的」レベルで機能します。 tarを200msごとに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を超えないようにしてください。また、スクリプトの実行によって時間も増えることを忘れないでください。

2
Alexios