Pare de desacelerar operações rápidas e detalhadas ao usar o ssh em conexões lentas

2

Costumo copiar muitos arquivos entre dois servidores conectados via Ethernet de 1GB, enquanto estou conectado via VPN e SSH por DSL. O problema é que a saída detalhada (1 linha por arquivo copiado) que precisa ser enviada através da conexão lenta para o meu cliente ssh e diminui a operação de cópia (isso me parece assim)

Eu testei isso com um testfile criado via

dd if=/dev/urandom | base64 | dd of=testfile count=10M bs=1

Teste executado A (sem saída)

# time sh -c 'cat testfile > /dev/null'
sh -c 'cat testfile > /dev/null'  0.00s user 0.02s system 97% cpu 0.025 total

Teste de execução B (todas as saídas via ssh / vpn)

# time sh -c 'cat testfile'
sh -c 'cat testfile'  0.00s user 0.45s system 0% cpu 4:31.10 total

(Eu sei, não é um bom teste, mas demonstra o problema)

Existe uma maneira de não desacelerar a operação e obter a saída de forma assíncrona. Eu imaginei algo como soltar todas as linhas, exceto uma contagem especificada por segundo ou algo assim.

No momento, inicio a tela e desanexo enquanto a operação está em andamento.

Estou usando o putty para windows e o openssh-client para acesso ao linux

Alguma idéia?

    
por krissi 24.07.2010 / 14:06

3 respostas

2

Você não diz o que está usando para fazer a cópia, mas suponho que isso realmente não importe.

Você pode tentar algo assim usando pv :

your-copy-command 2>&1 | tee progress.out | pv -trlb >/dev/null

Isso fornece um indicador de progresso de baixa sobrecarga:

502 0:00:20 [25.1/s ]

que mostra o número de linhas de nomes de arquivos (não conteúdo do arquivo) que você teria visto de outra forma. O comando tee salva essa saída no sistema remoto, caso você precise vê-la. Então a saída é descartada.

Aqui está uma maneira de fazer algo semelhante sem pv

your-copy-command 2>&1 | tee progress.out | progress >/dev/null

onde progress é um script como:

#!/bin/bash
SECONDS=0    # auto update variable
while read -r line
do
    if ((count++ % 10 == 9))
    then
        printf "%s sec, %s lines\r" $SECONDS $count >&2
    fi
    echo "$line"
done
    
por 24.07.2010 / 15:50
0

o que acontece se você canalizar a saída em menos ?, como em cp a b | menos

    
por 24.07.2010 / 15:46
0

Se eu entendi isso corretamente, parece que você está ficando mais lento devido ao buffer de terminal!

Você precisa ver a saída da transferência? Caso contrário, use as opções -q ou apropriadas para silenciar a saída de transferência por arquivo. Se você precisar desses dados, redirecione a saída para um arquivo para revisão posterior. Você poderia então tail -f desse arquivo.

    
por 24.07.2010 / 16:30