A remoção de arquivos leva muito tempo

11

Versão curta : rm -rf mydircom mydir(recursivamente) contendo 2,5 milhões de arquivos, leva cerca de 12 horas em uma máquina principalmente ocioso.

Mais informações : A maioria dos arquivos que estão sendo excluídos são links físicos para arquivos em outros diretórios (o diretório que está sendo excluído é realmente o backup mais antigo feito por rsnapshot; o rmcomando é realmente fornecido por rsnapshot). Portanto, a maioria das entradas de diretório está sendo excluída - o conteúdo do arquivo em si não é muito; está na ordem de algumas dezenas de GB.

Estou longe de ter certeza de que btrfsé o culpado. Lembro-me de que o backup também era muito lento antes de começar a usar btrfs, mas não tenho certeza de que a lentidão estava na exclusão.

A máquina é um Intel Core i5 2,67 GHz com 4 GB de RAM. Ele possui dois discos SATA: um possui o sistema operacional e outras coisas, e o disco de backup tem 1 TB WDC WD1002FAEX-00Z3A0. A placa-mãe é uma Asus P7P55D.

Edit : A máquina é um chiado do Debian com Linux 3.16.3-2~bpo70+1. É assim que o sistema de arquivos é montado:

root@thames:~# mount|grep rsnapshot
/dev/sdb1 on /var/backups/rsnapshot type btrfs (rw,relatime,compress=zlib,space_cache)

Editar : o uso rsync -a --delete /some/empty/dir mydirleva cerca de 6 horas. Uma melhoria significativa acabou rm -rf, mas ainda acho demais. (A explicação de por que rsyncé mais rápida querm : "[M] ost filesystems armazena suas estruturas de diretórios em um formato btree, a ordem [na] em que você exclui arquivos é ... importante. É necessário evitar reequilibrar a btree ao executar a desassociação .... rsync -a --delete... faz exclusões em ordem ")

Editar : anexei outro disco que tinha 2,2 milhões de arquivos (recursivamente) em um diretório, mas no XFS. Aqui estão alguns resultados comparativos:

                  On the XFS disk      On the BTRFS disk
Cached reads[1]       10 GB/s               10 GB/s
Buffered reads[1]     80 MB/s              115 MB/s
Walk tree[2]         11 minutes            43 minutes
rm -rf mydir[3]       7 minutes            12 hours

[1] Com hdparm -T /dev/sdXe hdparm -t /dev/sdX.
[2] Tempo necessário para executar find mydir -print|wc -limediatamente após a inicialização.
[3] No disco XFS, isso foi logo após andar na árvore find. No disco BTRFS, é a medida antiga (e eu não acho que foi com a árvore em cache).

Parece ser um problema com btrfs.

Antonis Christofides
fonte
1
2,5 milhões de arquivos em um único diretório? Não estou ciente de um sistema de arquivos que lida com isso muito bem.
Michael Hampton
@ MichaelHampton: Não é plano, contém diretórios aninhados. Eu adicionei a palavra "recursivamente" na breve descrição; Espero que isso esclareça.
Antonis Christofides
1
Por que você está usando o truque de copiar em gravação em um sistema de arquivos de copiar em gravar?
symcbean
@symcbean: Você quer dizer que o truque do hard link é redundante btrfs? Isso é possível, é claro, mas você acha que pode ser relevante? No momento, não me lembro por que decidi tentar btrfs.
Antonis Christofides
2
Ah, eu lembro agora. Decidi mudar para btrfsporque queria a compressão transparente. Agora: rsnapshotusa links físicos. Ele não tem nenhuma opção para não usar links físicos. Portanto, os links físicos se sobrepõem à funcionalidade btrfsde copiar na gravação, mas não posso fazer muito sobre isso.
Antonis Christofides

Respostas:

3

Bem, este ainda é um problema do Btrfs, é sabido que a exclusão de muitos arquivos pequenos leva muito tempo em comparação com outros sistemas de arquivos.

Se você não gostar, pode esperar até que o upstream o conserte ou seguir para outro sistema de arquivos que faça isso melhor.

Seu principal erro, porém, é usar um kernel antigo (3.16, sim, ele já era antigo quando você postou) com o btrfs. O Btrfs é um sistema de arquivos que ainda está em desenvolvimento pesado, portanto você deve sempre ficar com a melhor e mais recente versão do kernel para entrar em contato com as melhorias. Se sua distribuição não suportar backports, você poderá fazer isso sozinho ou se ferrar.

O Btrfs obteve muitas melhorias de desempenho na versão 3.19 do kernel - esta é a versão mínima que você deve usar na produção; a versão 3.16 do kernel é uma porcaria sem backports.

Também tenha em mente que, de acordo com Chris Mason, ele considera o Btrfs estável até agora, mas ainda não está pronto para a produção.

Marc Stürmer
fonte
1
Como você define "bem conhecido"? Eu tinha pesquisado a web extensivamente e em vão, e ninguém dos participantes dessa discussão sabia disso. Mas, enfim, agora estou ficando longe btrfs. Muito empolgado enquanto seu desenvolvimento parece levar uma eternidade.
Antonis Christofides
1
Bem, existem, por exemplo, as pessoas do CoreOS. Eles usaram aproximadamente Btrfs por um ano como o sistema de arquivos padrão até o início de 2015, onde retornaram para Ext4 + Overlayfs. Lembre-se, porém, que isso era anterior à versão 3.19 do kernel, o que trouxe muitas melhorias para o Btrfs. Também dê uma olhada nesta apresentação de outubro de 2015, que examina ext4, xfs, zfs e btrfs nas condições de carga de trabalho do banco de dados, a saber Postgres: de.slideshare.net/fuzzycz/… Outro parâmetro de referência, embora não tão bom: goo.gl/rR3kZ2
Marc Stürmer
E, como eu disse, a versão do kernel da sua caixa (3.16) é conhecida por ser afetada por problemas de desempenho, pelo menos use a 3.19 para coisas sérias do Btrfs, de acordo com Chris Mason. Se você deseja usar o Btrfs seriamente, sempre use o kernel mais recente e melhor - algo que não funciona muito bem com o Debian ... e procure o termo "desempenho de metadados do btrfs".
Marc Stürmer
2

Estou um pouco atrasado para esta festa, mas aqui está um truque para excluir rapidamente árvores btrfs extremamente grandes:

  1. Crie um subvolume fictício no mesmo sistema de arquivos btrfs.
  2. Mova o diretório de nível superior que você deseja remover para o referido subvolume - essa operação deve ser muito rápida se você estiver fazendo isso no mesmo sistema de arquivos btrfs, mesmo entre subvolumes.
  3. Destrua o subvolume.

O kernel começará a recuperar espaço em segundo plano, portanto você não terá o espaço disponível imediatamente, mas o processo deve ser muito mais rápido do que fazer qualquer tipo de exclusão de área do usuário.

Nicolas Noble
fonte
0

Você pode renomear o diretório e excluir o diretório renomeado em um processo em segundo plano. Isso não vai acelerar a operação de exclusão. No entanto, isso permitiria que o programa continuasse com um diretório vazio enquanto a operação de exclusão está acontecendo ao lado.

Não tenho certeza se isso vai funcionar no seu caso de uso. Depende se o programa não puder continuar até que o disco esteja ocioso (ou seja, ele fará algumas operações pesadas no disco). Depende se o programa vai encher o disco com muitos dados.

Nathan
fonte