Назад | Перейти на главную страницу

Прекратите замедлять быстрые и подробные операции при использовании ssh через медленные соединения

Я часто копирую много файлов между двумя серверами, подключенными через Ethernet на 1 Гбит, пока я подключен через VPN и SSH через DSL. Проблема в том, что подробный вывод (1 строка на скопированный файл), который необходимо отправить через медленное соединение с моим ssh-клиентом, замедляет операцию копирования (мне так кажется)

Я тестировал это с помощью тестового файла, созданного через

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

Тестовый прогон A (нет вывода)

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

Тестовый запуск B (весь вывод через ssh / vpn)

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

(Я знаю, это плохой тест, но он демонстрирует проблему)

Есть ли способ не замедлять работу и получать вывод асинхронно. Я представил себе что-то вроде отбрасывания всех строк, кроме указанного числа в секунду, или что-то вроде этого.

На данный момент я запускаю экран и отключаюсь, пока выполняется операция.

Я использую шпатлевку для окон и openssh-client для доступа к Linux

Любые идеи?

Вы не говорите, что используете для копирования, но, полагаю, это не имеет значения.

Вы можете попробовать что-то подобное, используя pv:

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

Это дает вам индикатор прогресса с низкими накладными расходами:

502 0:00:20 [25.1/s ]

который показывает количество строк имена файлов (а не содержимое файла), которое вы бы видели в противном случае. В tee команда сохраняет этот вывод в удаленной системе на случай, если вам нужно его увидеть. Затем вывод отбрасывается.

Вот способ сделать что-то подобное без pv

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

где progress это скрипт вроде:

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

Если я правильно понимаю, похоже, вы замедляетесь из-за буферизации терминала!

Вам нужно увидеть вывод перевода? Если нет, используйте -q или соответствующие параметры, чтобы отключить вывод передачи файлов. Если вам нужны эти данные, перенаправьте вывод в файл для последующего просмотра. Тогда ты мог бы tail -f этот файл.

что произойдет, если вы направите вывод в less?, как в cp a b | Меньше