Вопрос или проблема
Я использую rsync -rvhe ssh --partial-dir=path/to/partial/dir dir_to_copy remote_server:path/to/target/directory
, чтобы попытаться скопировать локальный каталог на удаленный сервер. Я также пробовал это без использования аргумента --partial-dir
. Локальная версия rsync – 3.1.3 (включена в WSL), а удаленная версия – 3.1.1 (включена в удаленную установку Ubuntu). Я уже успешно завершил этот процесс для большинства файлов, используя сжатие (-z
) и исключая большие файлы, и теперь я пытаюсь завершить процесс, скопировав и большие файлы.
Тем не менее, rsync просто зависает на определенных файлах. Это происходит как 1) при передаче, так и 2) при проверке, завершена ли передача. Чтобы подробнее пояснить это, для 1) я вижу, что частичная передача появляется в /path/to/partial/dir
(я также видел частичный файл в целевом каталоге, если я опускаю команду --partial-dir
, как и ожидалось), и иногда передача даже завершается в частичном каталоге, прежде чем процесс останавливается. Когда происходит 2), передача просто останавливается, даже если файл уже присутствует на удаленном сервере.
Кроме того, rsync продолжает работать на моем локальном компьютере и на удаленном сервере, он просто прекращает выполнять какие-либо действия. В результате он не выдает никаких ошибок, чтобы я мог диагностировать проблему. Когда я прекращаю локальную задачу, используя ^C
, выводится rsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(644) [sender=3.1.3]
, но он не сразу возвращает меня к терминальному приглашению – он зависает на некоторое время после получения SIGINT
, прежде чем вывести [sender] io timeout after 60 seconds -- exiting
и затем вернуть меня к терминальному приглашению.
Это похоже на то, что описано здесь: rsync keeps stopping on one directory with no errors, но я не могу использовать их решение, которое заключалось в использовании cp
, так как мне нужно передать более 10 ГБ и я не хочу рисковать тем, что копирование будет прервано и мне придется начинать снова с нуля.
Есть идеи, как я могу определить коренную причину и решить эту проблему? Спасибо!
Вы пропустили флаг -t
для захвата временных меток, поэтому rsync
должен использовать контрольные суммы для проверки копий. Это крайне медленно и может быть причиной кажущихся замедлений.
Попробуйте это вместо этого,
rsync -rtvh dir_to_copy remote_server:path/to/target/directory
Запустите заново вашу копию «только маленькие файлы», а затем копию «все файлы», чтобы увидеть эффект.
Ответ или решение
Когда вы сталкиваетесь с проблемой зависания утилиты rsync
при копировании небольших файлов, не получая при этом никаких сообщений об ошибках, важно провести всесторонний анализ и определить возможные причины возникновения данной ситуации. Давайте подробно рассмотрим возможные аспекты, которые могут привести к такому поведению.
1. Версии rsync
Вы отметили, что используете rsync
версии 3.1.3 на локальном компьютере и 3.1.1 на удалённом сервере. Хотя разница в версиях между клиентом и сервером rsync
не всегда вызывает проблемы, рекомендуется использовать актуальные версии обеих сторон, чтобы исключить возможные баги, которые могли быть исправлены в более поздних релизах.
2. Уровень производительности
При копировании больших файлов rsync
, как правило, использует алгоритм, который различает изменения в метаданных, чтобы эффективно выполнять только необходимые операции. Если вы не используете флаг -t
, который сохраняет временные метки, rsync
должен использовать контрольные суммы для проверки файлов, что значительно замедляет процесс. Я рекомендую использовать команду следующего вида:
rsync -rtvh --partial-dir=path/to/partial/dir dir_to_copy remote_server:path/to/target/directory
3. Наличие сетевых проблем
Зависание rsync
может быть связано не только с локальными настройками, но и с сетью. Проверьте стабильность соединения между вашим локальным компьютером и удалённым сервером. Используйте команду ping
для мониторинга потерь пакетов:
ping remote_server
Если вы замечаете высокую задержку или частые потери пакетов, это может привести к зависаниям при передаче данных.
4. Использование параметров сжатия
Если вы используете параметр -z
, который активирует сжатие, это может также замедлить процесс, особенно если ваши файлы уже сжаты. Вы можете попробовать отключить этот параметр, чтобы увидеть, повлияет ли это на производительность.
5. Логирование
Используйте расширенное логирование, добавив флаг --log-file=имя_файла
, чтобы записать все действия rsync
в файл. Это может помочь в диагностике проблем и позволяет видеть, на каком этапе происходит зависание.
6. Мониторинг ресурсов
Проверьте, какие ресурсы загружаются на локальном и удалённом серверах во время выполнения rsync
. Используйте команды top
или htop
, чтобы следить за загрузкой процессора и памяти, а также за сетевой активностью.
7. Обработка сигналов
Вы упомянули, что после прерывания rsync
с помощью ^C
программа не сразу возвращает вам управление терминалом. Это может указывать на наличие "подвисших" процессов, или rsync
ждет завершения каких-либо операций на уровне сети или диска. Убедитесь, что у вас нет других процессов, использующих большой объём ресурсов.
Заключение
Итак, для решения проблемы с зависанием rsync
на малых файлах рекомендуется:
- Убедиться, что клиенты
rsync
на обеих машинах обновлены до последней версии. - Использовать флаг
-t
для повышения производительности операций. - Проверить сетевое соединение на стабильность.
- Вести журнал операций
rsync
для дальнейшего анализа. - Мониторить ресурсы системы во время передачи данных.
Следуя этим рекомендациям, вы сможете значительно повысить эффективность передачи данных с помощью rsync
и устранить долгое зависание на малых файлах.