A maneira mais eficiente de desbastar um backup que usa hardlinks

4

Eu tenho um disco de backup que contém centenas de backups da mesma máquina de datas diferentes. O backup foi feito com rsync e hardlinks, ou seja, se um arquivo não alterar o script de backup, ele criará um link físico para o arquivo em um backup mais antigo. Portanto, se um arquivo nunca muda, você tem essencialmente uma cópia no disco de backup, mas digita 100 hardlinks para ele em cada diretório que representa o backup de cada data (digamos back-1 , back-2 , ... back-n ). Se eu quiser reduzi-lo, excluo um subconjunto deles, mas não todos. Suponha que eu queira excluir back_5 , back_6 , ... back_10 (apenas como um exemplo, no meu szenario real existem muitos mais). Então eu tento paralizá-lo via:

echo back_5 back_6 back_10 | xargs -n 1 -P 0 rm -rf

Isso leva várias horas. Então, há alguma maneira mais rápida de fazer isso?

    
por student 20.05.2016 / 08:59

4 respostas

1

O df está reportando um pequeno número porque você está excluindo diretórios, que são relativamente pequenos. Além disso, dependendo do sistema de arquivos, as mudanças nos diretórios e as alterações no número de links para um arquivo são registradas em diário e / ou sincronizadas no disco imediatamente, pois são críticas para a recuperação de falhas e, portanto, mais lentas.

Isso é realmente uma prova da eficiência do seu link!

    
por 25.05.2016 / 11:51
0

Não consigo ver como seu uso de xargs dessa maneira é nada, mas lento. Minha manpage diz -P é o número de processos e -n é o número de argumentos. Não há nenhum valor especial para -P0 , então é provável que seja ignorado (ou, se honrado, você obterá zero processos, o que explicaria 24 horas de nada!). E -n1 garante que você obtenha um exec (2) para cada nome de arquivo, que é o mais lento possível.

Eu duvido que paralelizar este trabalho vai te comprar muito. Eu acho que apenas

$ echo filenames ... | xargs rm -rf 

seria suficiente. Você poderia experimentar valores como -P4 , se desejar. Ao não limitar o número de argumentos da linha de comando, você minimiza as invocações de /bin/rm e permite que ele continue em série em seu cache de disco.

    
por 25.05.2016 / 04:08
0

Na minha experiência, a melhor maneira de acelerar backups baseados em hardlink rsync + foi diminuir o número de arquivos que você tem.

Um grande número de pequenos arquivos retarda muito o rsync .

Se você puder organizar seus dados de tal forma que seus diretórios, em sua maioria, de arquivos pequenos, na maioria apenas de leitura, recebam tar red up, você deverá ver uma aceleração significativa em seu script de backup. (Com ferramentas como archivemount , você pode acessar esses arquivos sem extraí-los).

Paralelizar o script de backup provavelmente não ajudará nem poderá atrasá-lo (o acesso previsível ao disco é mais ideal).

    
por 25.05.2016 / 12:02
0

Esta é também uma resposta baseada na experiência, em vez de uma baseada em dados concretos.

Acho que ao excluir muitos arquivos em árvores semelhantes com muitos links cruzados, parece mais rápido excluir subárvores isoladas em paralelo. Deixe-me tentar explicar com um diagrama:

topdir1
    |-a1
    |-b1
    |-c1

topdir2
    |-a2
    |-b2
    |-c2

topdir3
    |-a3
    |-b3
    |-c3

Em vez de excluirmos em paralelo topdir1 , topdir2 , topdir3 , minha impressão é que é mais rápido excluir a1 , b1 , c1 em paralelo e passar para a2 , b2 , c2 e assim por diante. (Minha teoria para isso é que o múltiplo desligamento paralelo dos "mesmos" arquivos causa contenção para a contagem de referência do link inode, mas eu enfatizo que não verifiquei isso com dados concretos.)

for topdir in *
do
    echo "Removing $topdir..."
    for sub in "$topdir"/*; do rm -rf "$sub" & done
    wait
    rm -rf "$topdir"
done
    
por 25.05.2016 / 12:49