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

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

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

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

问题:每当我使用 100% CPU 或 100% 磁盘时,我可怜的笔记本电脑就会死机并崩溃(如果您想对此做出反应,请写在这里。所以我希望 CPU 利用率和磁盘利用率保持在 50% 左右。

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

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

答案1

您可以使用pv限制管道的带宽。由于您的用例是强烈 IO 绑定的,因此通过管道增加的 CPU 开销应该不会明显,并且您不需要进行任何 CPU 限制。

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

答案2

您可以尝试cpu限制工具这确实限制了 CPU 百分比。它不是标准工具,因此您必须安装它。以下是自述文件的快速摘录:

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

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

ionice -c 3 <your_command>

答案3

你无法真正让一个进程运行较少的。您可以nice给它一个较低的优先级,但这与其他进程有关。在进程运行时运行 CPU 冷却器的方法是在usleep(3)一定时间内强制进程退出运行状态,但这将涉及修补tar或使用机制来提供使用大量的LD_PRELOAD修补函数(例如)。tarfopen(3)

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

一个烦人但可能可行的解决方法(实际上是一个拼凑)在“宏观”层面上起作用。tar您可以让它每两秒运行一秒,而不是每 200 毫秒运行 100 毫秒。注意:这是一个可怕的、可怕的拼凑。但是,嘿,它甚至可能有效!

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 以上,并且不要忘记脚本执行也会增加时间。

答案4

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

相关内容