Bash: Modelagem de tráfego dinamicamente rsync usando variáveis ​​para agendamento de horários e desaceleração durante o tempo de execução?

Bash: Modelagem de tráfego dinamicamente rsync usando variáveis ​​para agendamento de horários e desaceleração durante o tempo de execução?

Quais são algumas soluções para executar a modelagem dinâmica de tráfego durante um script bash,depois que um comando já foi iniciado? Isso é possível?

Meu caso de uso é que estou rsyncexecutando um grande conjunto de discos em um local de backup remoto e isso leva muitas horas pela Internet, então gostaria de aplicar modelagem de tráfego à linha onde rsyncé invocado, mas apenas durante horários especificados.

Digamos, por exemplo, que a programação atual é reduzir os uploads para 1.000 kilobytes por segundo (1,0 MB/s) das 5h às 10h E das 15h às 21h.

Eu procurei, --bwlimit=1000mas rsyncisso se molda rsyncdurante todo o tempo em que é executado,não apenas os prazos de modelagem desejados.

É possível desacelerar rsyncdepois de iniciado? Porque se isso for possível de alguma forma, essa seria a minha solução.

Já vi pessoas sugerirem wondershaper, mas estou me perguntando se isso poderia ser "ligado e desligado" programaticamente. E se sim, como fazer isso?

Aqui está um modelo que eu hackeei usando contribuições generosas do Stackoverflow, que oferece a funcionalidade de especificar e verificar um cronograma (com base na hora, o que é adequado para minhas necessidades no 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

Responder1

rsyncnão pode ter seu parâmetro de limite de largura de banda alterado dinamicamente.
No entanto, você poderia

  • Divida o trabalho em várias tarefas menoresonde cada um terá um limite específico de bw com base no horário de início, por exemplo

por exemplo

rsync a b c d e target:/dir/

to

rsync --bw-limit=bw1 a target:/dir/
...
rsync --bw-limit=bw2 e target:/dir/
  • Use a --time-limit=MINSopção

rsyncé inteligente e não irá refazer o que acabou de fazer, se os arquivos estiverem sincronizados, então você pode executar rsyncpor 1 hora com um limite de bw bw1, depois reiniciá-lo com bw2, etc (e pausá-lo se necessário), ou combinar com a solução acima.

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

rsync --bw-limit=bw2 --time-limit=60 ...
  • Alterar sincronização

Se você quiser, rsyncé de código aberto e você pode adicionar algum código para rsyncresponder dinamicamente a algum sinal (sinalematar) que alteraria as opções internas (talvez seja necessário alterar o daemon rsync de destino também, dependendo do código)

rsync --my-new-version ...

kill -SIGNALTOSLOW rsyncpid
...
kill -SIGNALTOSPEED rsyncpid

informação relacionada