Запуск нескольких потоков scp одновременно

11

Запуск нескольких потоков scp одновременно:

Задний план:

Я часто нахожу себя зеркальным отражением набора файлов сервера, и в эти файлы сервера входят тысячи маленьких файлов размером от 1 до 3 КБ. Все серверы подключены к портам 1 Гбит / с, как правило, в разных дата-центрах.

Проблема:

SCP передает эти небольшие файлы, ОДИН за ОДНЫМ, и на это уходит много времени, и я чувствую, что теряю прекрасные сетевые ресурсы, которые у меня есть.

Решение?:

У меня была идея; Создание сценария, который делит файлы на равные количества и запускает 5-6 потоков scp, что теоретически будет выполняться в 5-6 раз быстрее, не так ли? Но у меня нет опыта написания сценариев для Linux!

Вопросов):

  • Есть ли лучшее решение упомянутой проблемы?
  • Есть ли что-то подобное, что уже существует?
  • Если нет, есть ли кто-то, кто мог бы дать мне старт или помочь?
  • Если не 2 или 3, где было бы хорошее место, чтобы начать изучать сценарии Linux? Как Bash или другой.
caesay
источник

Ответы:

11

Я бы сделал это так:
tar -cf - /manyfiles | ssh dest.server 'tar -xf - -C /manyfiles'

В зависимости от файлов, которые вы передаете, может иметь смысл включить сжатие в tarкомандах:
tar -czf - /manyfiles | ssh dest.server 'tar -xzf - -C /manyfiles'

Также может иметь смысл выбрать для sshкоманды шифр, более дружественный к процессору (например, arcfour): tar -cf - /manyfiles | ssh -c arcfour dest.server 'tar -xf - -C /manyfiles'

Или объедините их обоих, но это действительно зависит от того, какое у вас узкое место.
Очевидно, rsyncбудет намного быстрее, если вы делаете инкрементные синхронизации.

обманщик
источник
10

Используйте rsyncвместо scp. Вы можете использовать rsyncболее sshлегко , как scpи он поддерживает «конвейерную передачи файлов для минимизации задержки расходов».

Один совет: если данные сжимаемы, включите сжатие. Если это не так, отключите его.

Дэвид Шварц
источник
Я только что сделал одну передачу вчера вечером с помощью scp, и я делаю другую подобную передачу с rsync - кажется, намного быстрее. Тем не менее, кажется, что он по-прежнему передает один файл за раз - любая идея, как заставить это делать несколько потоков (помимо --include'ing и --exclude'ing связки каталогов с помощью скрипта; см .: sun3.org/archives / 280 )
Эндрю
Нет смысла передавать несколько файлов одновременно, учитывая ограниченную пропускную способность. Я считаю, что вы не будете рассматривать эту команду, когда пропускная способность достаточна. Устранение затрат на задержку уже очень помогло, когда вы копируете много маленьких файлов. Даже если вы можете копировать несколько файлов одновременно, ограниченная пропускная способность не ускорит передачу файлов.
Джо
1

Я собирался предложить GNO Parallel (который все еще требует некоторой работы сценариев с вашей стороны), но потом я нашел pscp (который является частью pssh ). Это может просто соответствовать вашим потребностям.

Rilindo
источник
1
Кажется, psshработает одновременно на нескольких машинах. Я не думаю, что он реализует параллелизм на уровне файлов.
Дэвид Шварц
Я, вероятно, должен быть конкретным - я имел в виду pscp.
Rilindo
1

Не scp напрямую, но опция для многопоточной передачи (даже для отдельных файлов) - bbcp - https://www2.cisl.ucar.edu/resources/storage-and-file-systems/bbcp .

используйте параметр -s для количества потоков, которые вы хотите передать данные. Отлично подходит для высокой пропускной способности, но с задержкой соединений, поскольку задержка ограничивает размер окна TCP на поток.

thetoolman
источник
0

Возможно, не связано, но если вы хотите что-то более в реальном времени, вы можете попробовать GlusterFS . Работает хорошо, но требует некоторой настройки, если вы хотите эффективно читать небольшие файлы.

рукав моря
источник