我有一个备份脚本:
- 压缩一些文件
- 生成 md5
- 将压缩文件复制到另一台服务器。
- 另一台服务器完成MD5比较(以查找复制错误)。
这是核心脚本:
nice -n 15 tar -czvf $BKP $PATH_BKP/*.* \
| xargs -I '{}' sh -c "test -f '{}' && md5sum '{}'" \
| tee $MD5
scp -l 80000 $BKP $SCP_BKP
scp $MD5 $SCP_BKP
此例程在 gzip 例程中 CPU 占用率达到 90%,导致生产服务器速度变慢。我尝试添加,nice -n 15
但服务器仍然挂起。
我已经读过了1但谈话并没有帮助我。
解决这个问题的最佳方法是什么?我愿意接受新的架构/解决方案:)
答案1
如果您使用 nice,您可以改变优先级,但这只有在 CPU 使用率接近 100% 时才会产生明显的影响。
就您的情况而言,服务器变慢不是因为 CPU 使用率,而是因为存储上的 I/O。使用ionice
更改 I/O 优先级并保持nice
CPU 优先级。
答案2
您可以尝试使用查特将tar程序的调度策略改为SCHED_BATCH。
根据手册页sched_setscheduler(2)
SCHED_BATCH:调度批处理进程(自 Linux 2.6.16 起)。SCHED_BATCH 只能在静态优先级 0 时使用。此策略类似于 SCHED_OTHER,因为它根据进程的动态优先级(基于 nice 值)来调度进程。不同之处在于,此策略将导致调度程序始终假设该进程占用大量 CPU。因此,调度程序将针对唤醒行为应用较小的调度惩罚,因此该进程在调度决策中略微处于不利地位。
This policy is useful for workloads that are noninteractive, but do not want to lower their nice value, and for workloads that want a determin‐ istic scheduling policy without interactivity causing extra preemptions (between the workload's tasks).
如果你仍然不走运,你可以尝试 SCHED_IDLE。这将使该程序仅在没有其他程序可运行时才被唤醒。
这将批处理中的 tar 行更改为如下形式:
nice -n 15 chrt -b tar -czvf $BKP $PATH_BKP/*.* \
答案3
您是否尝试过使用猪而不是 gzip?