Depois de mais algumas investigações, parece que esse problema é menos relacionado ao kernel e mais sobre como o rsync
e o CIFS interagem.
Até onde eu sei, o que está acontecendo é que quando rsync
fecha o arquivo de destino, o CIFS (e provavelmente qualquer sistema de arquivos da rede) garante que o arquivo seja completamente liberado e gravado no disco remoto antes do close
syscall retorna. Isso é para assegurar que qualquer aplicativo, uma vez concluída a operação de fechamento, tenha sido completamente salvo e não haja risco de mais erros que possam causar perda de dados.
Se isso não foi feito, seria possível que um aplicativo feche um arquivo, saia pensando que a operação de salvamento foi bem-sucedida e, posteriormente, (talvez devido a um problema de rede), os dados não puderam ser gravados, mas aí é tarde demais para o aplicativo fazer alguma coisa, como perguntar ao usuário se ele deseja salvar o arquivo em outro lugar.
Esse requisito significa que sempre que rsync
terminar de copiar um arquivo, todo o buffer de disco deverá ser esvaziado pela rede antes que rsync
tenha permissão para continuar lendo o próximo arquivo.
Uma solução alternativa é montar o compartilhamento CIFS com a opção cache=none
, que desativa esse recurso e faz com que todas as E / S sejam direcionadas ao servidor. Isso elimina o problema e permite que leituras e gravações sejam executadas em paralelo, no entanto, uma desvantagem dessa solução é que o desempenho é um pouco menor. No meu caso, a velocidade de transferência da rede cai de 110MB / seg para 80MB / seg.
Isso pode significar que, se você estiver copiando arquivos grandes, o desempenho pode ser melhor com o comportamento alternado de leitura / gravação. Com muitos arquivos menores, desabilitar o cache resultará em menos limpezas de cache sempre que um arquivo for fechado, portanto, o desempenho pode aumentar.
Parece que rsync
precisa de uma opção para fechar suas alças de arquivo em outro thread, para que ele possa começar a ler o próximo arquivo enquanto o último ainda está sendo liberado.
EDITAR: Confirmei que cache=none
definitivamente ajuda na transferência de muitos arquivos pequenos (de 10MB / s para 80MB / s), mas ao transferir arquivos grandes (1GB +) cache=none
reduz a transferência de 110MB / seg para os mesmos 80MB / seg. Isso sugere que a transferência lenta de muitos arquivos pequenos é menor em relação à procura de disco de origem e mais sobre ter tantos esvaziamentos de cache de todos os arquivos pequenos.