У меня есть сценарий резервного копирования rsync для передачи данных между двумя серверами Ubuntu (расположенными в разных странах). Резервное копирование данных довольно велико с точки зрения количества файлов. Его общий размер составляет около 17 ГБ. Скрипт запускается на приемник сервер. Итак, это в основном вытащить. Аутентификация с открытым и закрытым ключом, используемая для входа.
Скрипт работает нормально; резервное копирование успешно выполняется уже много месяцев.
В последнее время, в течение последних 6 дней или около того, резервное копирование не выполнялось. Процесс rsync длится около 45 минут. А потом просто заканчивается. Понятия не имею, почему это останавливается. Насколько я могу судить, он даже не завершает построение и сканирование списка файлов. У меня вывод cron направлен в файл журнала. В журнале все, что я вижу: receiving file list ... done
. Но я вижу, что в место назначения резервной копии ничего не было перенесено.
Если я запустил скрипт вручную, примерно через 45 минут я просто увидел это: ./sync.sh: line 51: 9078 Killed $RSYNC $OPTIONS $SOURCE $DESTINATION
Как и где я вижу причину сбоя? Как мне узнать, какой сервер на самом деле убивает процесс, отправитель или получатель?
В тянущий машина (на которой выполняется скрипт) - это младшая коробка. Это виртуальная машина KVM с 256 МБ ОЗУ. Итак, мне интересно, не занимает ли построение файловой структуры слишком много оперативной памяти, что приводит к ошибке OOM. Но как мне проверить, так ли это? Более того, не было значительного увеличения файлов, чтобы это могло вызвать внезапный сбой.
Любые советы будут оценены.
Спасибо.
Как было предложено @APZ, я добавил еще пару подробных флагов (всего 3) и запустил скрипт вручную, перенаправив вывод в файл. Вот результат в конце:
(.... lots of file names....)
received 5795917 names
done
recv_file_list done
get_local_name count=5795917 /storage/ <======== Reached here after about 40 minutes. Was stuck here for about 10 minutes or so.
[Receiver] _exit_cleanup(code=14, file=main.c, line=788): about to call exit(14)
rsync: fork failed in do_recv: Cannot allocate memory (12)
rsync error: error in IPC code (code 14) at main.c(788) [Receiver=3.0.9]
Чтобы ответить @TimHaegele, насколько я знаю, хост виртуальной машины (Prometeus / IperWeb) не ограничивает CPU, IO или что-то еще. Хотя я мог бы их спросить. Они очень высоко оценены.
В моей установке Ubuntu на виртуальной машине настроен своп на 512 МБ. Может быть, я могу увеличить это до 2 ГБ или около того? Место на диске не проблема.
Когда rsync запущен, это результат работы free -m
:
total used free shared buffers cached
Mem: 239 236 2 0 0 3
-/+ buffers/cache: 232 7
Swap: 511 510 1
Основываясь на этих доказательствах, будет ли по-прежнему иметь значение изменение настроек SSH Daemon, как предлагается?
Похоже, что все согласны с тем, что проблема в нехватке памяти. Итак, я добавил новый файл подкачки размером 2 ГБ и активировал его. Итак, теперь у меня всего 2,5 ГБ подкачки.
Затем я снова запустил сценарий (вручную). На этот раз он длился более 90 минут. К этому времени он пересылал файлы. Но вдруг процесс остановился. В логах я вижу, что он завершился со следующей ошибкой:
Invalid packet at end of run (4330026) [sender]
[generator] _exit_cleanup(code=12, file=io.c, line=1532): about to call exit(12)
rsync error: protocol incompatibility (code 2) at main.c(695) [sender=3.0.7]
rsync: writefd_unbuffered failed to write 23 bytes to socket [generator]: Broken pipe (32)
rsync error: error in rsync protocol data stream (code 12) at io.c(1532) [generator=3.0.9]
[receiver] _exit_cleanup(code=19, file=main.c, line=1316): about to call exit(19)
rsync error: received SIGUSR1 (code 19) at main.c(1316) [receiver=3.0.9]
Как видите, машина-отправитель имеет версию 3.0.7, а получатель (съемник) - 3.0.9. Я не совсем понимаю, в чем ошибка.
Тем временем я увидел комментарий @APZ и изменил свой скрипт, чтобы заменить --delete-after
с участием --delete-delay
. Я снова запускаю его. Вернусь с обновлениями.
Добавление дополнительных свопов и использование --delete-delay
вместо того --delete-after
похоже, добился цели. Обычное задание cron, похоже, тоже работает нормально.
Также я следил Эта статья чтобы запустить rsync с sudo на отправляющей машине. Это также удалило Permission denied (13)
предупреждения во время передачи.
Спасибо всем за помощь.
P.S .: Все, кто участвовал в этом Q&A, давали полезные предложения. К сожалению, я могу отметить только один правильный ответ.
В качестве указателя я бы посоветовал заглянуть в журналы rsync на стороне сервера. Также попробуйте подробный режим rysnc:
-v, --verbose Этот параметр увеличивает объем информации, предоставляемой вам во время передачи. По умолчанию rsync работает тихо. Один -v даст вам информацию о том, какие файлы передаются, и краткое описание в конце. Две опции -v предоставят вам информацию о том, какие файлы пропускаются, и немного больше информации в конце. Более двух параметров -v следует использовать только при отладке rsync.
Управляется ли виртуальная машина KVM, на которой выполняется сценарий rsync, хостером, который ограничивает такие ресурсы, как ввод-вывод, время ЦП и т. Д.?
Пытаясь ответить на ваш вопрос, предлагаю:
Запустите sync.sh на хосте с большим количеством ресурсов, чем 256 МБ, и управляйте им самостоятельно, и посмотрите, работает ли он успешно. Если да, то источником вашей проблемы является клиент.
Секонд, и немного непонятный, но стоит попробовать запустить его в разное время.
В дополнении к сократить таймауты:
Используйте более агрессивный отключить Настройка в / etc / ssh / sshd_config на сервере, например:
ClientAliveInterval 5
ClientAliveCountMax 3