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

Rsync зависает: расширить массив указателей file_list до N байтов, переместился

Rsync переходит в режим «прерывистого сна» после переноса некоторых файлов из локальной папки в папку NFS. Папка, которую я пытаюсь сделать резервную копию, содержит более 180 ГБ данных.

Вот что выводит rsync перед тем, как зависнуть:

[sender] expand file_list pointer array to 524288 bytes, did move

Я использую Ubuntu Server 14.04 LTS с протоколом rsync версии 3.1.0 версии 31, и я запускаю rsync со следующими параметрами:

/usr/bin/rsync -rHAXxvvut --numeric-ids --progress {SRC_FOLDER} {NFS_FOLDER}

Спасибо за любые подсказки

Учитывая, что rsync вы используете программное обеспечение с открытым исходным кодом, получить доступ к связанный исходный код.

После скачивания основного .tar.gz и применив патч Ubuntu (rsync_3.1.0-2ubuntu0.4.diff.gz), вы получите именно тот код, который лежит в основе используемого вами rsync. Что-то вроде этого:

$ mkdir rsync
$ cd rsync/
$ wget http://archive.ubuntu.com/ubuntu/pool/main/r/rsync/rsync_3.1.0.orig.tar.gz
$ wget http://archive.ubuntu.com/ubuntu/pool/main/r/rsync/rsync_3.1.0-2ubuntu0.4.diff.gz
$ gzip -d rsync_3.1.0-2ubuntu0.4.diff.gz
$ tar zxvf rsync_3.1.0.orig.tar.gz 
$ cd rsync-3.1.0/
$ patch -p1 < ../rsync_3.1.0-2ubuntu0.4.diff

Теперь простой grep может быстро сообщить нам контекст вашего сообщения об ошибке:

$ grep -r 'expand file_list pointer array to' 
flist.c:        rprintf(FCLIENT, "[%s] expand file_list pointer array to %s bytes, did%s move\n",

Итак, вам повезло, так как ваше сообщение об ошибке используется в одном фрагменте одного файла. Nameli: flist.c.

Давайте посмотрим:

Относительно легко догадаться, что подпрограмма, содержащая сообщение об ошибке (строки 325, 326, 327, 328), называется flist_expand и звучит как что-то необходимое, чтобы гарантировать, что весь список файлов (для rsync) может храниться в структуре в памяти надлежащего размера (также известной: чем больше файлов вам нужно для rsync, тем больше памяти требуется для обработки rsync-вычислений и поскольку такой список неизвестен «заранее», он должен быть вычислен динамически, путем выделения соответствующих фрагментов памяти для «списка» [более или менее]).

Итак, я готов поспорить, что ваша проблема зависит от НЕ от размера данных, которые вы синхронизируете, но по количеству файлов. Я бы попробовал разделить ваш rsync на несколько sub-rsync, сосредоточив внимание на внутренних подпапках.

Собственно, было бы неплохо лучше изучить:

  1. строка 328: (new_ptr == flist->files) ? " not" : "");
  2. строка 334: out_of_memory("flist_expand");

но это выходит далеко за рамки моей первоначальной цели :-)

В любом случае, я готов поспорить, что, проверив свои журналы, вы обнаружите сообщение о нехватке памяти .... :-)

HTH!

У меня была такая же проблема, и мне удалось обойти ее, выполнив перенос удаленно. Например, вместо того, чтобы делать rsync -avvxAX source/ destination/, Я сделал rsync -avvxAX source/ root@localhost:destination/

rsync, вероятно, имеет определенные оптимизации для локальных передач. Пока мы не выясним точную причину проблемы, этот способ решит проблему для меня.

Моя система: Gentoo Linux, ядро ​​4.3.0, systemd, протокол rsync 3.1.2 версии 31

Использование rsync для передачи содержимого в папку NFS, вероятно, будет очень неэффективным. Подумайте, что происходит, когда rsync хочет получить контрольную сумму удаленного файла или изменить удаленный файл на месте. Намного лучше, если rsync взаимодействует с процессом rsync, запущенным на файловом сервере. Если это вообще возможно, я бы сначала изменил это, а затем посмотрел, существует ли ваша текущая проблема. Т.е. используйте rsync поверх ssh или запустите процесс демона rsync, полностью исключив NFS из поля зрения.

Чтобы узнать, что делает rsync, strace может быть полезно:

strace -p <PID>

Или пусть strace запускает rsync так:

strace rsync [rsync options] <src> <target>

Для подключения к запущенному процессу по PID могут потребоваться разрешения root, хотя их можно изменить (root).

Два замечания, которые могут помочь

  • всегда были довольны -a вариант (от мужчины "режим архива; равно -rlptgoD (без -H, -A, -X)")

  • rsync может ожидать, пока NFS предоставит доступ к файлу. Похоже, что NFS действительно может заблокировать rsync (возможно, при перезаписи определенного файла), и было бы интересно посмотреть, к какому файлу обращался rsync непосредственно перед переходом в "спящий режим". Есть команда, чтобы увидеть, какие файлы в настоящее время открыты rsync lsof -ad3-999 -c rsync (из Аскубунту)