AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / server / Perguntas / 801074
Accepted
nagylzs
nagylzs
Asked: 2016-09-05 22:02:15 +0800 CST2016-09-05 22:02:15 +0800 CST 2016-09-05 22:02:15 +0800 CST

Exclua mais de 10 milhões de arquivos do ZFS, efetivamente

  • 772

Eu escrevi um programa com bugs que criou acidentalmente cerca de 30 milhões de arquivos em /tmp. (O bug foi introduzido há algumas semanas e estava criando alguns subdiretórios por segundo.) Eu poderia renomear /tmp para /tmp2 e agora preciso excluir os arquivos. O sistema é FreeBSD 10, o sistema de arquivos raiz é zfs.

Enquanto isso, uma das unidades no espelho deu errado e eu a substituí. A unidade possui dois discos SSD de 120 GB.

Aqui está a questão: substituir o disco rígido e restaurar todo o array levou menos de uma hora. Excluir arquivos /tmp2 é outra história. Escrevi outro programa para remover os arquivos e ele pode excluir apenas 30 a 70 subdiretórios por segundo. Levará de 2 a 4 dias para excluir todos os arquivos.

Como é possível que a restauração de toda a matriz leve uma hora, mas a exclusão do disco leve 4 dias? Por que tenho um desempenho tão ruim? 70 deleções/segundo parece um desempenho muito, muito ruim.

Eu poderia excluir o inode para /tmp2 manualmente, mas isso não liberaria espaço, certo?

Isso pode ser um problema com o zfs, ou com os discos rígidos ou o quê?

performance freebsd zfs
  • 8 8 respostas
  • 16224 Views

8 respostas

  • Voted
  1. Best Answer
    ewwhite
    2016-09-05T23:05:28+08:002016-09-05T23:05:28+08:00

    As exclusões no ZFS são caras. Ainda mais se você tiver a desduplicação habilitada no sistema de arquivos (já que desreferenciar arquivos desduplicados é caro). Os instantâneos também podem complicar as coisas.

    Talvez seja melhor excluir o /tmpdiretório em vez dos dados contidos nele.

    Se /tmpfor um sistema de arquivos ZFS, exclua-o e crie novamente.

    • 35
  2. Phill W.
    2016-09-06T03:33:44+08:002016-09-06T03:33:44+08:00

    Como é possível que a restauração de toda a matriz leve uma hora, mas a exclusão do disco leve 4 dias?

    Considere um edifício de escritórios.

    A remoção de todos os computadores, móveis e acessórios de todos os escritórios em todos os andares leva muito tempo, mas deixa os escritórios imediatamente utilizáveis ​​por outro cliente.

    Demolir todo o prédio com RDX é muito mais rápido, mas é bem provável que o próximo cliente reclame sobre como o local é frio.

    • 29
  3. Ian Howson
    2016-09-06T22:28:57+08:002016-09-06T22:28:57+08:00

    Há uma série de coisas acontecendo aqui.

    Primeiro, todas as tecnologias de disco modernas são otimizadas para transferências em massa. Se você precisar mover 100 MB de dados, eles farão isso muito mais rápido se estiverem em um bloco contíguo em vez de espalhados por todo o lugar. Os SSDs ajudam muito aqui, mas até eles preferem dados em blocos contíguos.

    Em segundo lugar, o resilvering é bastante ideal no que diz respeito às operações de disco. Você lê um grande pedaço contíguo de dados de um disco, faz algumas operações rápidas de CPU nele e depois o reescreve em outro grande pedaço contíguo para outro disco. Se a energia falhar no meio do caminho, não é grande coisa - você simplesmente ignorará todos os dados com somas de verificação incorretas e continuará normalmente.

    Em terceiro lugar, excluir um arquivo é muito lento . O ZFS é particularmente ruim, mas praticamente todos os sistemas de arquivos são lentos para excluir. Eles devem modificar um grande número de blocos de dados diferentes no disco e cronometrar corretamente (ou seja, aguardar) para que o sistema de arquivos não seja danificado se houver falha de energia.

    Como é possível que a restauração de toda a matriz leve uma hora, mas a exclusão do disco leve 4 dias?

    O resilvering é algo em que os discos são realmente rápidos e a exclusão é algo em que os discos são lentos. Por megabyte de disco, você só precisa fazer um pouco de resilvering. Você pode ter mil arquivos nesse espaço que precisam ser excluídos.

    70 deleções/segundo parece um desempenho muito, muito ruim

    Depende. Eu não ficaria surpreso com isso. Você não mencionou que tipo de SSD está usando. Os SSDs Intel e Samsung modernos são muito bons nesse tipo de operação (leitura-modificação-gravação) e terão um desempenho melhor. SSDs mais baratos/antigos (por exemplo, Corsair) serão lentos. O número de operações de E/S por segundo (IOPS) é o fator determinante aqui.

    O ZFS é particularmente lento para excluir coisas. Normalmente, ele executará exclusões em segundo plano para que você não veja o atraso. Se você estiver fazendo um grande número deles, ele não poderá escondê-lo e deve atrasá-lo.


    Apêndice: por que as exclusões são lentas?

    • Excluir um arquivo requer várias etapas. Os metadados do arquivo devem ser marcados como 'excluídos' e, eventualmente, devem ser recuperados para que o espaço possa ser reutilizado. O ZFS é um 'sistema de arquivos estruturado em log' que funciona melhor se você apenas criar coisas, nunca excluí-las. A estrutura de log significa que, se você excluir algo, haverá uma lacuna no log e, portanto, outros dados deverão ser reorganizados (desfragmentados) para preencher a lacuna. Isso é invisível para o usuário, mas geralmente lento.
    • As alterações devem ser feitas de forma que, se a energia falhar no meio do caminho, o sistema de arquivos permaneça consistente. Muitas vezes, isso significa esperar até que o disco confirme que os dados realmente estão na mídia; para um SSD, isso pode levar muito tempo (centenas de milissegundos). O efeito líquido disso é que há muito mais contabilidade (ou seja, operações de E/S de disco).
    • Todas as mudanças são pequenas. Em vez de ler, escrever e apagar blocos inteiros de flash (ou cilindros para um disco magnético), você precisa modificar um pouco de um. Para fazer isso, o hardware deve ler um bloco ou cilindro inteiro, modificá-lo na memória e depois gravá-lo na mídia novamente. Isso leva muito tempo.
    • 7
  4. Ole Tange
    2016-09-08T04:10:49+08:002016-09-08T04:10:49+08:00

    Ian Howson dá uma boa resposta sobre por que é lento.

    Se você excluir arquivos em paralelo, poderá ver um aumento na velocidade, pois a exclusão pode usar os mesmos blocos e, portanto, pode economizar reescrevendo o mesmo bloco várias vezes.

    Então tente:

    find /tmp -print0 | parallel -j100 -0 -n100 rm
    

    e veja se isso funciona melhor do que suas 70 exclusões por segundo.

    • 7
  5. AnoE
    2016-09-06T07:13:59+08:002016-09-06T07:13:59+08:00

    Como é possível que a restauração de toda a matriz leve uma hora, mas a exclusão do disco leve 4 dias?

    Isso é possível porque as duas operações funcionam em camadas diferentes da pilha do sistema de arquivos. O resilvering pode ser executado em baixo nível e, na verdade, não precisa examinar arquivos individuais, copiando grandes blocos de dados por vez.

    Por que tenho um desempenho tão ruim? 70 deleções/segundo parece um desempenho muito, muito ruim.

    Tem que fazer muita contabilidade...

    Eu poderia excluir o inode para /tmp2 manualmente, mas isso não liberaria espaço, certo?

    Não sei para o ZFS, mas se ele pudesse se recuperar automaticamente disso, provavelmente, no final, faria as mesmas operações que você já está fazendo, em segundo plano.

    Isso pode ser um problema com o zfs, ou com os discos rígidos ou o quê?

    diz zfs scrubalguma coisa?

    • 2
  6. bwDraco
    2016-09-07T09:44:40+08:002016-09-07T09:44:40+08:00

    Excluir muitos arquivos nunca é realmente uma operação rápida.

    Para excluir um arquivo em qualquer sistema de arquivos, você precisa ler o índice do arquivo, remover (ou marcar como excluído) a entrada do arquivo no índice, remover quaisquer outros metadados associados ao arquivo e marcar o espaço alocado para o arquivo como não utilizado. Isso deve ser feito individualmente para cada arquivo a ser excluído, o que significa que a exclusão de muitos arquivos requer muitos pequenos I/Os. Fazer isso de maneira a garantir a integridade dos dados em caso de falha de energia aumenta ainda mais a sobrecarga.

    Mesmo sem as peculiaridades introduzidas pelo ZFS, a exclusão de 30 milhões de arquivos geralmente significa mais de cem milhões de operações de E/S separadas. Isso levará muito tempo, mesmo com um SSD rápido. Como outros já mencionaram, o design do ZFS agrava ainda mais esse problema.

    • 2
  7. peter
    2016-09-06T02:29:50+08:002016-09-06T02:29:50+08:00

    Muito simples se você inverter seu pensamento.

    1. Obtenha uma segunda unidade (parece que você já tem isso)

    2. Copie tudo da unidade A para a unidade B com rsync, excluindo o diretório /tmp. Rsync será mais lento que uma cópia em bloco.

    3. Reinicie, usando a unidade B como o novo volume de inicialização

    4. Reformate a unidade A.

    Isso também desfragmentará sua unidade e fornecerá um novo diretório (tudo bem, desfragmentar não é tão importante com um SSD, mas linearizar seus arquivos nunca prejudica nada)

    • 0
  8. Paul Smith
    2016-09-07T04:12:34+08:002016-09-07T04:12:34+08:00

    Você tem 30 milhões de entradas em uma lista não classificada. Você examina a lista em busca da entrada que deseja remover e a remove. Agora você tem apenas 29.999.999 entradas em sua lista não classificada. Se eles estão todos em /tmp, por que não reiniciar?


    Editado para refletir as informações nos comentários: Declaração do problema: Remover a maioria, mas não todos , dos mais de 30 milhões de arquivos criados incorretamente em /tmp está demorando muito.
    Problema 1) Melhor maneira de remover um grande número de arquivos indesejados de /tmp.
    Problema 2) Entendendo por que é tão lento excluir arquivos.

    Solução 1) - /tmp é redefinido para vazio na inicialização pela maioria das distribuições * nix. O FreeBSD, no entanto, não é um deles.
    Etapa 1 - copie arquivos interessantes em outro lugar.
    Passo 2 - Como root

     $ grep -i tmp /etc/rc.conf  
     clear_tmp_enable="YES" # Clear /tmp at startup.  
    

    Passo 3 - reinicie.
    Etapa 4 - altere clear_tmp_enable de volta para "Não".
    Os arquivos indesejados desapareceram, pois o ZFS no FreeBSD tem o recurso de que "Destruir um conjunto de dados é muito mais rápido do que excluir todos os arquivos que residem no conjunto de dados, pois não envolve a verificação de todos os arquivos e a atualização de todos os metadados correspondentes. " portanto, tudo o que ele precisa fazer no momento da inicialização é redefinir os metadados para o conjunto de dados /tmp. Isso é muito rápido.

    Solução 2) Por que é tão lento? O ZFS é um sistema de arquivos maravilhoso que inclui recursos como acesso constante ao diretório. Isso funciona bem se você souber o que está fazendo, mas as evidências sugerem que o OP não é um especialista em ZFS. O OP não indicou como eles estavam tentando remover os arquivos, mas suponho que eles usaram uma variação de "find regex -exec rm {} \;". Isso funciona bem com números pequenos, mas não escala porque há três operações seriais acontecendo 1) obtém a lista de arquivos disponíveis (retorna 30 milhões de arquivos em ordem de hash), 2) usa regex para escolher o próximo arquivo a ser excluído, 3 ) diga ao sistema operacional para localizar e remover esse arquivo de uma lista de 30 milhões. Mesmo que o ZFS retorne uma lista da memória e se'encontrar' o armazena em cache, o regex ainda precisa identificar o próximo arquivo a ser processado da lista e, em seguida, instruir o sistema operacional a atualizar seus metadados para refletir essa alteração e, em seguida, atualizar a lista para que não seja processada novamente.

    • -2

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve