Estou usando pv
para enviar arquivos via ssh
.
Posso alterar o limite de "pv ativo" para menos de 100M sem nenhum problema. Quando defino o processo ativo pv
para 100M ou 1G ou superior, não consigo mais alterar a taxa...
MAS! se eu mudar 5-10 vezes 1M para 2M, 2M para 1M pv
pode ser definido às vezes para uma nova taxa.
Não consegui encontrar nenhuma solução para o problema. Qualquer ideia?
Exemplos:
pv -R "15778" -f -F "%p***%t***%e***%r***%b" -L 1M
pv -R "15778" -f -F "%p***%t***%e***%r***%b" -L 1G
pv -R "15778" -f -F "%p***%t***%e***%r***%b" -L 1M (not working anymore)
Isso é causado pela contabilização em
pv
, o que significa efetivamente que sua limitação de taxa é limitada por leitura em vez de limitada por gravação. Observar o código-fonte mostra que a limitação de taxa é impulsionada por um “alvo”, que é a quantidade restante para enviar. Se o rate-limiting estiver ativado, uma vez por ciclo de avaliação do rate limit, o alvo é aumentado em quanto devemos enviar de acordo com o rate limit; o alvo é então diminuído por quanto é realmente escrito. Isso significa que se você definir o limite de taxa para um valor maior do que a capacidade de gravação real, o destino continuará subindo; reduzir o limite de taxa não terá nenhum efeito atépv
que tenha alcançado seu objetivo (incluindo o que é permitido gravar de acordo com o novo limite de taxa).Para ver isso em ação, inicie um básico
pv
:Então controle isso:
Você verá o impacto dos cálculos de alvo variando a duração do segundo sono...
Devido à limitação de gravação, isso só causa um problema quando você define o limite de taxa para um valor maior que a capacidade de gravação.
Com um pouco mais de detalhes, veja como funciona a contabilidade com um fluxo inicialmente limitado a 1M, depois a 1G por 5s, depois de volta a 1M, em uma conexão capaz de transmitir 400M:
Demora 7s para que o limite de taxa seja aplicado novamente. Quanto mais tempo gasto com um limite de taxa alto, mais tempo levará para que o limite de taxa reduzida seja aplicado...
A correção para isso é bastante direta, se você puder recompilar
pv
: emloop.c
, altere a linha 154 paratarget =
(detarget +=
), resultando emFeito isso, as reduções do limite de taxa são aplicadas imediatamente (bem, dentro de um ciclo de limite de taxa).
Parece ser um problema de buffer. Aqui está minha cama de teste:
e aqui está o meu controle:
Com um intervalo de um segundo, leva cerca de 13 segundos para a execução
pv
reduzir de sua tentativa de 100 MB/s (1 Gb/s) para sua meta final de 1 KB/s. Aumentar osleep
intervalo em 1 segundo aumenta o tempo para atingir o objetivo final em quase 10 segundos:Quatro amostras não são suficientes para uma linha de tendência, então vou evitar sugerir que é uma correlação linear.
Estou me corrigindo; pv pode alterar a velocidade.. Não sei por que, mas precisa de algum tempo de acordo com o seu limite de velocidade... Se você definir para 1G, terá que esperar 45 segundos para reduzir a velocidade.
5G - 5 min.
10G - 7 min.
Por exemplo:
Comandos:
-ON placa de rede 10Gb/s:
Após 7 minutos a velocidade mudou finalmente...
-ON placa de rede 1Gb/s:
Comecei novamente com limite de 10G.
Os resultados são os mesmos. Se você alterar a velocidade de 10G para 1M, precisará aguardar pelo menos 7 minutos. Mas se você alterar a velocidade de 1M para 10G, não precisará esperar nenhum segundo. Eu não acho que seja apenas com buffer porque 7min (45Gb) deve ser muito grande para o buffer. Mas esta é apenas a minha opinião.