关于配置Rsync在系统资源争用时减速或停止的技术咨询
配置Rsync在系统资源争用时减速或停止的技术咨询
当然可以搞定!我之前维护服务器的时候也碰到过一模一样的问题——Rsync跑起来占资源,导致系统其他服务卡得不行。其实Rsync本身虽然没自带资源检测的功能,但我们可以搭配系统工具或者自己写点小脚本,让它变得“识趣”起来,资源紧张就减速甚至暂停,空闲了再继续干活。
基础方案:调整Rsync的资源优先级
这是最省心的办法,不用写脚本,直接用系统自带的工具降低Rsync的优先级,让系统资源紧张时优先满足其他进程:
- CPU优先级调整:用
nice命令给Rsync设置最低CPU优先级(数值越大优先级越低,范围是-20到19):
这样当CPU使用率很高时,系统会优先把CPU时间分给其他更重要的进程,Rsync会自动放慢速度。nice -n 19 rsync -avz /your/source/path/ /your/dest/path/ - 磁盘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
相关产品推荐
相关产品推荐

