Bash: Dynamische Verkehrsgestaltung für rsync mithilfe von Variablen für Zeitpläne und Verlangsamung während der Laufzeit?

Bash: Dynamische Verkehrsgestaltung für rsync mithilfe von Variablen für Zeitpläne und Verlangsamung während der Laufzeit?

Welche Lösungen gibt es, um dynamisches Traffic Shaping während eines Bash-Skripts auszuführen?nachdem ein Befehl bereits gestartet wurde? Ist das überhaupt möglich?

Mein Anwendungsfall ist, dass ich rsynceine große Anzahl von Festplatten zu einem Remote-Backup-Speicherort transferiere und dies über das Internet viele, viele Stunden dauert. Daher möchte ich Traffic Shaping auf die Leitung anwenden, wo rsynces aufgerufen wird, aber nur während festgelegter Zeiten.

Nehmen wir beispielsweise an, der aktuelle Zeitplan sieht eine Reduzierung der Uploads auf 1.000 Kilobyte pro Sekunde (1,0 MB/s) in der Zeit von 5 bis 10 Uhr und von 15 bis 21 Uhr vor.

--bwlimit=1000Ich habe mir das angesehen, rsyncaber das formt sich rsyncwährend der gesamten Laufzeit,nicht nur die gewünschten Gestaltungszeiträume.

Ist es möglich, es zu verlangsamen, rsyncwenn es einmal begonnen hat? Denn wenn das irgendwie möglich ist, wäre das meine Lösung.

Ich habe schon Vorschläge von Leuten gesehen wondershaper, aber ich frage mich, ob man das programmgesteuert „ein- und ausschalten“ könnte. Und wenn ja, wie geht das?

Hier ist ein Modell, das ich mithilfe großzügiger Beiträge von Stackoverflow zusammengehackt habe und das die Funktion bietet, einen Zeitplan anzugeben und zu überprüfen (stundenbasiert, was für meine derzeitigen Anforderungen völlig ausreichend ist) …

#!/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

Antwort1

rsyncDer Parameter für die Bandbreitenbegrenzung kann nicht dynamisch geändert werden.
Sie können jedoch

  • Teilen Sie den Job in mehrere kleinere Aufgaben aufwobei jedes eine bestimmte Bandbreitenbegrenzung hat, die auf der Startzeit basiert, z. B.

zum Beispiel

rsync a b c d e target:/dir/

to

rsync --bw-limit=bw1 a target:/dir/
...
rsync --bw-limit=bw2 e target:/dir/
  • Nutzen Sie die --time-limit=MINSOption

rsyncist intelligent und wiederholt nicht, was es gerade getan hat, wenn die Dateien synchronisiert sind. Sie können es also rsynceine Stunde lang mit einem BW-Limit von BW1 ausführen, es dann mit BW2 usw. neu starten (und bei Bedarf anhalten) oder es mit der obigen Lösung kombinieren.

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

rsync --bw-limit=bw2 --time-limit=60 ...
  • Rsync ändern

Wenn Sie möchten, rsyncist es Open Source und Sie können Code hinzufügen, um rsyncdynamisch auf ein Signal zu antworten (SignalUndtöten), das würde die internen Optionen ändern (je nach Code muss möglicherweise auch der Ziel-Rsync-Daemon geändert werden)

rsync --my-new-version ...

kill -SIGNALTOSLOW rsyncpid
...
kill -SIGNALTOSPEED rsyncpid

verwandte Informationen