Versão curta : rm -rf mydir
com 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 rm
comando é 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 mydir
leva 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/sdX
e hdparm -t /dev/sdX
.
[2] Tempo necessário para executar find mydir -print|wc -l
imediatamente 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
.
btrfs
? Isso é possível, é claro, mas você acha que pode ser relevante? No momento, não me lembro por que decidi tentarbtrfs
.btrfs
porque queria a compressão transparente. Agora:rsnapshot
usa 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 à funcionalidadebtrfs
de copiar na gravação, mas não posso fazer muito sobre isso.Respostas:
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.
fonte
btrfs
. Muito empolgado enquanto seu desenvolvimento parece levar uma eternidade.Estou um pouco atrasado para esta festa, mas aqui está um truque para excluir rapidamente árvores btrfs extremamente grandes:
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.
fonte
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.
fonte