You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于配置Rsync在系统资源争用时减速或停止的技术咨询

配置Rsync在系统资源争用时减速或停止的技术咨询

当然可以搞定!我之前维护服务器的时候也碰到过一模一样的问题——Rsync跑起来占资源,导致系统其他服务卡得不行。其实Rsync本身虽然没自带资源检测的功能,但我们可以搭配系统工具或者自己写点小脚本,让它变得“识趣”起来,资源紧张就减速甚至暂停,空闲了再继续干活。

基础方案:调整Rsync的资源优先级

这是最省心的办法,不用写脚本,直接用系统自带的工具降低Rsync的优先级,让系统资源紧张时优先满足其他进程:

  • CPU优先级调整:用nice命令给Rsync设置最低CPU优先级(数值越大优先级越低,范围是-20到19):
    nice -n 19 rsync -avz /your/source/path/ /your/dest/path/
    
    这样当CPU使用率很高时,系统会优先把CPU时间分给其他更重要的进程,Rsync会自动放慢速度。
  • 磁盘IO优先级调整:如果是磁盘IO争用的问题,用ionice把Rsync设为“空闲类”IO进程,只有当系统磁盘空闲时才会执行Rsync的磁盘操作:
    ionice -c 3 rsync -avz /your/source/path/ /your/dest/path/
    
    这个对磁盘压力大的场景特别有用,比如备份大文件的时候,不会影响其他依赖磁盘的服务。

进阶方案:写监控脚本动态启停Rsync

如果需要更精细的控制(比如同时监控CPU、内存、磁盘,达到阈值就暂停),可以写个简单的bash脚本,实时监控系统资源,动态控制Rsync进程的启停:

#!/bin/bash

# 先启动Rsync并记录它的进程ID
rsync -avz --progress /your/source/path/ /your/dest/path/ &
RSYNC_PID=$!
echo "Rsync启动,进程ID:$RSYNC_PID"

# 循环监控直到Rsync完成
while kill -0 $RSYNC_PID 2>/dev/null; do
    # 获取系统资源使用率(这里的命令可以根据你的系统调整)
    # 1分钟平均CPU使用率(减去空闲率得到使用率)
    CPU_USAGE=$(top -bn1 | grep 'Cpu(s)' | sed 's/.*, *\([0-9.]*\)%* id.*/\1/' | awk '{print 100 - $1}')
    # 内存使用率
    MEM_USAGE=$(free | grep Mem | awk '{print $3/$2 * 100.0}')
    # 磁盘IO使用率(以sda为例,换成你实际的磁盘设备)
    DISK_USAGE=$(iostat -d sda 1 1 | grep sda | awk '{print $14}')

    # 设置资源阈值,你可以根据自己的需求修改
    CPU_THRESHOLD=80
    MEM_THRESHOLD=85
    DISK_THRESHOLD=70

    # 判断是否需要暂停Rsync
    if (( $(echo "$CPU_USAGE > $CPU_THRESHOLD" | bc -l) )) || \
       (( $(echo "$MEM_USAGE > $MEM_THRESHOLD" | bc -l) )) || \
       (( $(echo "$DISK_USAGE > $DISK_THRESHOLD" | bc -l) )); then
        # 发送暂停信号
        kill -STOP $RSYNC_PID
        echo "$(date +'%Y-%m-%d %H:%M:%S') 资源紧张(CPU:${CPU_USAGE}% | 内存:${MEM_USAGE}% | 磁盘IO:${DISK_USAGE}%),暂停Rsync"
    else
        # 检查Rsync是否处于暂停状态,是的话恢复
        if ps -p $RSYNC_PID -o stat= | grep -q 'T'; then
            kill -CONT $RSYNC_PID
            echo "$(date +'%Y-%m-%d %H:%M:%S') 资源充足,恢复Rsync"
        fi
    fi

    # 每10秒检查一次,可调整间隔
    sleep 10
done

echo "Rsync任务完成"

使用的时候记得替换脚本里的源路径、目标路径,还有磁盘设备(比如sda换成你的nvme0n1之类的),阈值也可以根据系统性能调整。

补充:针对网络Rsync的带宽限制

如果你的Rsync是跨网络同步的,还可以用--bwlimit参数动态调整带宽,比如脚本根据网络负载或者系统资源修改这个值,不过本地同步的话,前面的方法更直接。

备注:内容来源于stack exchange,提问作者webwalkerant

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 07:39:38