Bash: ¿El tráfico da forma dinámica a rsync utilizando variables para la programación de tiempos y la desaceleración durante el tiempo de ejecución?

Bash: ¿El tráfico da forma dinámica a rsync utilizando variables para la programación de tiempos y la desaceleración durante el tiempo de ejecución?

¿Cuáles son algunas soluciones para ejecutar la configuración dinámica del tráfico durante un script bash?después de que un comando ya haya comenzado? ¿Es esto siquiera posible?

Mi caso de uso es que estoy rsyncejecutando un gran conjunto de discos en una ubicación de copia de seguridad remota y esto lleva muchas horas a través de Internet, por lo que me gustaría aplicar la configuración de tráfico a la línea donde rsyncse invoca, pero solo durante momentos específicos.

Digamos, por ejemplo, que el cronograma actual es reducir las cargas a 1000 kilobytes por segundo (1,0 MB/s) de 5 a. m. a 10 a. m. Y de 3 p. m. a 9 p. m.

He buscado --bwlimit=1000pero rsyncesta forma rsyncdurante todo el tiempo que se ejecuta,no sólo los plazos de configuración deseados.

¿Es posible reducir la velocidad rsyncuna vez que ha comenzado? Porque si eso es posible de alguna manera, esa sería mi solución.

He visto a gente sugerirlo wondershaper, pero me pregunto si esto podría "activarse y desactivarse" mediante programación. Y en caso afirmativo, ¿cómo hacerlo?

Aquí hay una maqueta que he pirateado usando generosas contribuciones de Stackoverflow, que brinda la funcionalidad de especificar y verificar un cronograma (basado en la hora, lo cual está bien para mis necesidades en este momento)...

#!/bin/bash

declare -A shapingTimes
declare -A keycount

useTrafficShaping=1

# schedule
shapingTimes=([0-from]=5 [0-to]=10)  # 5am to 10am
shapingTimes+=([1-from]=15 [1-to]=21)  # 3pm to 9pm

# because keys and array content differs in order from the way they are defined, we need to tidy this up by setting up the shaping times order in the way in which it is defined above
# to do this, count how many keys used in array entry (https://stackoverflow.com/questions/63532910)
# we use this result to to dynamically calculate the total number of entries ($totalshapingTimes)
for i in "${!shapingTimes[@]}"; do keycount[${i//[0-9]-/}]=""; done
totalshapingTimes=$((${#shapingTimes[*]} / ${#keycount[@]}))
x=1; while [[ $x -le "$totalshapingTimes" ]]; do shapingTimes_order+="$(( x-1 )) "; x=$(( $x + 1 )); done
# 'shapingTimes_order' array is used later in this script to process which shapingTimes are handled in what order


if [[ -n $useTrafficShaping ]] && [[ $useTrafficShaping == 1 ]]; then
    echo "Traffic shaping: ON"
    # get current time (hour) to determine if we're inside peak times
    currentHour=$(date +%H)
        
        # display our traffic shaping time windows as defined in above array
        echo "Defined schedule:"
        for i in ${shapingTimes_order[*]}; do
            echo "${shapingTimes[$i-from]}hrs to ${shapingTimes[$i-to]}hrs"
            # work out which peak times we're using, thanks to the help of Glenn Jackman (https://stackoverflow.com/questions/18128573)
            if (( ${shapingTimes[$i-from]} <= 10#$currentHour && 10#$currentHour < ${shapingTimes[$i-to]} )); then
                # current time matches a specified shaping timeframe, so rsync should go SLOW!
                shape=1
            fi
        done

        echo "The current hour is $currentHour"
        if [[ -z $shape ]]; then
            echo "Not in a shaping window, rsync can run as normal."
            # some command here, run rsync as normal
        else
            echo "Matches a shaping schedule. *** SHAPING NETWORK TRAFFIC ***"
            # command here to kick in traffic shaping
        fi

else
    echo "Traffic shaping: OFF"
    # run rsync as normal
fi

Respuesta1

rsyncno se puede cambiar dinámicamente su parámetro de límite de ancho de banda.
Sin embargo podrías

  • Divida el trabajo en varias tareas más pequeñas.donde cada uno tendrá un límite de peso corporal específico según el momento en que comienza, por ejemplo

por ejemplo

rsync a b c d e target:/dir/

to

rsync --bw-limit=bw1 a target:/dir/
...
rsync --bw-limit=bw2 e target:/dir/
  • Usa la --time-limit=MINSopción

rsynces inteligente y no rehará lo que acaba de hacer, si los archivos están sincronizados, por lo que podría ejecutar rsyncdurante 1 hora con un límite de bw bw1, luego reiniciarlo con bw2, etc. (y pausarlo si es necesario), o combinar con la solución anterior.

rsync --bw-limit=bw1 --time-limit=60 ...

rsync --bw-limit=bw2 --time-limit=60 ...
  • Cambiar sincronización

Si lo desea, rsynces de código abierto y puede agregar algún código para rsyncresponder dinámicamente a alguna señal (señalymatar) que cambiaría las opciones internas (es posible que también tenga que cambiar el demonio rsync de destino dependiendo del código)

rsync --my-new-version ...

kill -SIGNALTOSLOW rsyncpid
...
kill -SIGNALTOSPEED rsyncpid

información relacionada