rsync trava a menos que eu desfragmente o sistema de arquivos ext4

6

Eu tenho um servidor XBian (versão Raspberry Pi do Debian) rodando rsync via inetd (não o daemon nativo). Eu estou servindo um par de diretórios em um sistema de arquivos ext4 (em um disco USB) como módulos individuais (os módulos em questão têm na ordem de 100-500 GB de dados e arquivos de 1000-10000) . Tenho notado que, ultimamente, como eu altero outras partes do sistema de arquivos (ou seja, uploads, cópias, etc., não necessariamente nesses diretórios mencionados), as chamadas rsync para esses módulos expirarão.

Para um comando rsync de rotina como rsync -vrt rsync://host:port/module ./ , onde eu não esperaria precisar de nenhuma transferência de arquivo (ou seja, os locais do servidor e do cliente teriam os mesmos dados), no arquivo de log do servidor rsync, vejo logs como estes:

2014/12/15 22:59:59 [###] connect from UNKNOWN (1.1.1.1)
2014/12/15 22:59:59 [###] rsync on share/ from UNKNOWN (1.1.1.1)
2014/12/15 22:59:59 [###] building file list
2014/12/15 23:16:23 [###] rsync: read error: Connection timed out (110)
2014/12/15 23:16:23 [###] rsync error: error in socket IO (code 10) at io.c(785) [sender=3.1.1]

Nos logs do cliente, vejo logs como esses (sim, a mesma transferência - o servidor relatou o tempo limite após 15 minutos, enquanto o cliente relatou erro após 30 minutos):

2014/12/15 23:00:01 [###] receiving file list
2014/12/15 23:29:26 [###] rsync: read error: Connection reset by peer (104)
2014/12/15 23:29:26 [###] rsync error: error in rsync protocol data stream (code 12) at /usr/src/ports/rsync/rsync-3.0.9-1/src/rsync-3.0.9/io.c(764) [Receiver=3.0.9]

Qualquer número de problemas pode causar uma situação como essa, mas depois de fazer a desfragmentação de alguns arquivos para outros problemas, notei que minhas transferências de rsync começariam a ser concluídas com êxito novamente. Então, depois que eu fiz upload de mais alguns arquivos (novamente, para um diretório fora do módulo rsync), eu veria os retornos do tempo limite. Agora, sempre que vejo meus logs com erros de tempo limite, eu desfragmente (com e4defrag ) meu sistema e, em seguida, posso executar com êxito a transferência de rsync novamente.

Algumas notas adicionais:

  • Minha partição ext4 usa menos de 50% do espaço disponível no momento
  • Minhas chamadas rsync para outros módulos menores não atingem o tempo limite
  • Mesmo chamadas sem transferência de dados (por exemplo, rsync -rt rsync://host:post/module ) excedem o tempo nesse estado
  • Após mais testes, parece que após a desfragmentação, posso executar a chamada rsync com êxito uma vez antes de precisar desfragmentar novamente (uma chamada rsync causa uma fragmentação de arquivos ?)

Por que minha configuração de rsync exige uma desfragmentação toda vez e o que eu posso fazer para garantir que meu rsync não interrompa mais esse pequeno inconveniente?

    
por palswim 19.12.2014 / 23:10

2 respostas

1

Tente um tar para / dev / null do diretório em vez de uma desfragmentação ... que definitivamente não modificará o disco, mas armazenará todos os inodes em cache. Com grandes diretórios contendo muitos arquivos, o ext4 os indexa em uma árvore de hash, então readdir () os retorna em uma ordem essencialmente aleatória. Tentar stat () na mesma ordem causa muitas buscas, tornando-a muito lenta.

    
por 08.01.2015 / 22:41
0

Eu tenho coletado informações sobre os sistemas de registro no diário em ext3 e ext4, e um capítulo na Wikipédia sobre ext4 Alocação atrasada e possível perda de dados , me fez pensar em rsync como uma causa potencial de fragmentação. Pesquisando no Google, o fraze me mandou aqui, e eu realmente vejo descrito o resultado do processo que eu ia perguntar! A sugestão para tar to /dev/null parece ser uma boa solução. Leia o link e encontre mais informações sobre alocação atrasada.

    
por 15.05.2015 / 04:28