防止tar使用过多的CPU和磁盘(如果100%旧笔记本电脑崩溃)


15

我想将1 TB的数据备份到外部磁盘。

我正在使用此命令: tar cf /media/MYDISK/backup.tar mydata

问题:每当我使用100%CPU或100%磁盘时,我可怜的笔记本电脑就会死机并崩溃(如果您要对此做出反应,请在此处写。所以我想保持大约50%的CPU和50%的最大磁盘空间。

我的问题:如何使用tar命令限制CPU和磁盘?

Rsync具有--bwlimit选项,但是我想要一个存档,因为1)有很多小文件2)我更喜欢管理单个文件而不是树。这就是为什么我使用tar


1
制作如此庞大的tarball多么聪明的主意:'nice'命令呢?
12

1
@JiriXichtkniha:nice不会阻止100%的CPU使用率
Nicolas Raoul

Answers:


22

您可以pv用来限制管道的带宽。由于您的用例受到IO的强烈限制,因此通过管道增加的CPU开销应该不会引起注意,并且您不需要进行任何CPU限制。

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

1
甚至比我期望的还要好!我将IO限制为5mb /秒,CPU保持在13%(对于进行加密似乎是合理的)。
Nicolas Raoul

1
非常好!。也许还建议使用-q标志来消除进度条。
szabgab,2015年

如此棒的命令!!!如果您的Debian / Ubuntu中没有它,请运行apt-get install pv。我建议在之后添加`-b`,-L 1m这样将打印增量字节计数器,每秒更新一次。通过这种方式,您知道到目前为止已经写入了多少字节
lucaferrario

另外,请注意,如果您压缩输出(使用tar czf而不是tar cf),则该限制是指压缩后的输出(因此,-L 1m磁盘写入速度不会超过1 MB / s ....但是磁盘读取速度可能会在1 MB / s之间和5 MB / s,具体取决于您的内容类型)
lucaferrario

大把戏!使用xz压缩时,我先通过pv传递管道,然后通过xz传递管道。
Jean-Bernard Jansen

8

您可以尝试使用cpulimit工具来限制CPU百分比。它不是标准工具,因此您必须安装它。这是自述文件的简短摘录:

“ cpulimit是一种试图限制进程的CPU使用率的工具(以百分比表示,而不是以CPU时间表示。)对已使用cpu量的控制已通过向进程发送SIGSTOP和SIGCONT POSIX信号来完成。子进程和指定进程的线程将共享相同百分比的CPU。”

然后,我建议使用ionice来限制IO的使用,尽管将限制并发访问,而不是最大吞吐量...不过,这里是如何使用它:

ionice -c 3 <your_command>

大!似乎cpulimit是我想要的。
Nicolas Raoul 2012年

2

你真的无法得到一个运行更少的过程。您可以使用nice较低的优先级,但这与其他进程有关。在进程运行时运行CPU冷却器的方法是用于usleep(3)迫使进程退出运行状态一定时间,但这将涉及修补tar或使用该LD_PRELOAD机制提供tar使用很多功能的修补函数(例如fopen(3))。

我怀疑您最好的解决方法是您在SuperUser上提到的硬件:保持笔记本电脑凉爽和/或降低CPU时钟。

一个烦人但可能可行的解决方法(实际上是杂点)在“宏观”层面上起作用。与其让tar运行时间每200ms变为100ms,不如让它每两秒运行一次。注意:这是可怕的,可怕的恶棍。但是,嘿,它甚至可以工作!

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调整睡眠时间,第二个调整运行时间。目前,它的占空比为50%。为了降低温度,您很有可能需要将占空比降低到大约25%或更低(1秒运行,3秒睡眠=每4秒1次= 25%占空比)。sleep顺便说一句,shell命令可能需要小数时间。所以你甚至可以说sleep 0.1。请确保将其保持在0.001以上,并且不要忘记脚本执行也会增加时间。


+1好主意!我猜它类似于惠更斯建议的cpulimit工具。
Nicolas Raoul

除了Huuygens的工具更好,更实用之外,这就是为什么答案得到我自己的+1的原因。:)
Alexios 2012年

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超过指定频率。


谢谢,但是我已经处于最低频率。我应该提到这一点。这些问题开始出现后,我便开始降频。
Nicolas Raoul 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.