Rsync trava: expanda a matriz de ponteiro file_list para N bytes, moveu-se

3

O rsync está entrando no modo "suspensão ininterrupta" após transferir alguns arquivos de uma pasta local para uma pasta NFS. A pasta que estou tentando fazer backup contém mais de 180 GB de dados.

Isto é o que o rsync gera antes de ser interrompido:

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

Estou executando o Ubuntu Server 14.04 LTS com o protocolo rsync versão 3.1.0 versão 31 e estou executando o rsync com estas opções:

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

Obrigado por qualquer dica

    
por jithujose 16.12.2015 / 14:07

4 respostas

0

Duas observações que podem ajudar

  • sempre ficaram satisfeitos com a opção -a (do modo de arquivo "man" ; igual a -rlptgoD (não -H, -A, -X) ")

  • O rsync pode estar aguardando o NFS dar acesso a um arquivo. Parece que o NFS é capaz de obter rsync bloqueado (provavelmente ao sobrescrever um determinado arquivo), e seria interessante ver qual arquivo estava sendo acessado pelo rsync antes de entrar em seu "sleep". Existe um comando para ver quais arquivos estão atualmente abertos por rsync lsof -ad3-999 -c rsync (de askubuntu )

por 22.12.2015 / 18:25
0

Usar o rsync para transferir conteúdo para uma pasta NFS provavelmente será muito ineficiente. Pense no que está envolvido quando o rsync deseja obter uma soma de verificação do arquivo remoto ou modificar um arquivo remoto no lugar. É muito melhor que o rsync converse com um processo de rsync em execução no servidor de arquivos. Se possível, eu mudaria isso primeiro e depois verificaria se o seu problema atual ainda existe. Ou seja use o rsync sobre o ssh ou execute um processo do daemon do rsync e deixe o NFS completamente fora da imagem.

Para descobrir o que o rsync está fazendo, strace pode ser útil:

strace -p <PID>

Ou faça o strace iniciar o rsync assim:

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

Para anexar a um processo em execução pelo PID pode exigir permissões de root, embora isso possa ser alterado (por root).

    
por 26.12.2015 / 16:39
0

Eu tive o mesmo problema e consegui contornar o problema fazendo a transferência remotamente. Por exemplo, em vez de fazer rsync -avvxAX source/ destination/ , eu fiz rsync -avvxAX source/ root@localhost:destination/

O rsync provavelmente possui otimizações específicas para transferências locais. Até que possamos descobrir a causa exata do problema, essa solução resolve o problema para mim.

Meu sistema: Gentoo Linux, kernel 4.3.0, systemd, versão do protocolo rsync 3.1.2 31

    
por 12.01.2016 / 05:59
0

Considerando que o rsync que você está usando é um software de código aberto, é muito fácil ter acesso a relacionado código-fonte .

Depois de baixar o principal .tar.gz e aplicar o patch do Ubuntu (rsync_3.1.0-2ubuntu0.4.diff.gz), você acaba com exatamente o código subjacente ao rsync que você está usando. Algo parecido com isto:

$ 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

Agora, um simples grep pode nos informar rapidamente o contexto de sua mensagem de erro:

$ 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",

Você tem sorte, pois sua mensagem de erro é usada em um único fragmento de um único arquivo. Nameli: flist.c .

Vamos dar uma olhada:

Érelativamentefáciladivinharquearotinacontendoamensagemdeerro(linhas325,326,327,328)édenominadaflist_expandesoacomoalgonecessárioparagarantirquetodaalistadearquivos(pararsync)possasermantidaumaestruturanamemóriaadequadamentedimensionada(tambémconhecidacomo:quantomaisarquivosvocêprecisarsync,maismemóriaénecessáriaparalidarcomcálculosrsync,ecomotallistanãoéconhecida"antecipadamente", ela precisa ser computada dinamicamente, alocando pedaços adequados de memória para uma "lista" [mais ou menos]).

Então, eu apostaria que o seu problema depende NÃO do tamanho dos dados que você está rsync-ing, mas do número de arquivos . Eu tentaria dividir seu rsync em vários sub-rsync, concentrando-se em subpastas internas.

Na verdade, seria bom investigar melhor:

  1. linha 328: (new_ptr == flist->files) ? " not" : "");
  2. linha 334: out_of_memory("flist_expand");

mas isso vai muito além do meu objetivo inicial :-)

Enfim, eu apostaria que checando seus logs você encontraria alguma mensagem "out of memory" ....: -)

HTH!

    
por 14.09.2018 / 01:07