我想将 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
修补函数(例如)。tar
fopen(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
最多的东西。
实现此目的的方法是:
- 转到
/sys/devices/system/cpu/cpuX/cpufreq
您的每个 CPU(替换cpuX
为每个 CPU)。 - 然后查看该文件
scaling_available_frequencies
以查看您的 CPU 支持的频率。 - 选择一个频率(比方说 1234567)并执行
echo 1234567 > scaling_max_freq
这将防止 CPU 超过指定频率。