Eu tenho muitas respostas / comentários úteis aqui, que eu gostaria de concluir, assim como mostrar minha solução também.
-
Sim, a melhor maneira de impedir que isso aconteça é manter o diretório em cache em um sistema de arquivos separado. Nuking / formatação rápida de um sistema de arquivos sempre leva alguns segundos (talvez minutos) no máximo, sem relação com quantos arquivos / pastas estavam presentes nele.
-
As soluções
ionice
/nice
não fizeram nada, porque o processo de exclusão causou quase nenhuma E / S. O que causou o I / O foi que eu acredito que as filas / buffers no nível do kernel / do sistema de arquivos estavam cheios quando os arquivos eram excluídos muito rapidamente pelo processo de exclusão. -
A maneira como resolvi isso é semelhante à solução de Tero Kilkanen, mas não exigi a chamada de um script de shell. Eu usei a opção
--bwlimit
incorporada do rsync para limitar a velocidade de exclusão.
O comando completo foi:
mkdir empty_dir
rsync -v -a --delete --bwlimit=1 empty_dir/ cache.bak/
Agora o bwlimit especifica a largura de banda em kilobyes, que neste caso se aplica ao nome do arquivo ou caminho dos arquivos. Ao defini-lo para 1 KBps, ele estava excluindo cerca de 100.000 arquivos por hora ou 27 arquivos por segundo. Os arquivos tinham caminhos relativos como cache.bak/e/c1/db98339573acc5c76bdac4a601f9ec1e
, que tem 47 caracteres, de modo que daria 1000/47 ~ = 21 arquivos por segundo, de forma semelhante ao meu palpite de 100.000 arquivos por hora.
Agora, por que --bwlimit=1
? Eu tentei vários valores:
- 10000, 1000, 100 - > sistema abrandar como antes
- 10 - > sistema funcionando muito bem por um tempo, mas produz lentidão parcial uma vez por minuto ou mais. Tempos de resposta HTTP ainda < 1 seg.
- 1 - > nenhuma lentidão no sistema. Eu não tenho pressa e 2 milhões de arquivos podem ser deletados em < 1 dia assim, então eu escolho.
Eu gosto da simplicidade do método embutido do rsync, mas esta solução depende do tamanho do caminho relativo. Não é um grande problema, pois a maioria das pessoas encontraria o valor correto por tentativa e erro.