A exclusão de arquivos antigos é lenta e "mata" o desempenho do IO

3

Estou usando o find para remover arquivos antigos, muitos deles .. isso leva minutos / horas para ser executado e outros processos do servidor encontram problemas de desempenho do IO.

find -mtime +100 -delete -print

Eu tentei ionizar mas não pareceu ajudar.

ionice -c 3 

O que se pode fazer para acelerar a operação de localização e evitar o impacto de outros processos? O FS é ext4 .. é ext4 apenas ruim neste tipo de carga de trabalho? Kernel é 3,16 Armazenamento é 2x 1TB 7200rpm HDDs no RAID 1. Há 93GB em 610228 arquivos agora, então 152KB / file em média.

Talvez eu não deva armazenar tantos arquivos em um único diretório?

    
por XTF 23.11.2016 / 16:38

1 resposta

2

Quando você executar o comando find como você postou, ele fará um rm para cada arquivo que encontrar. Esta não é uma boa maneira de fazer isso, em termos de desempenho.

Para melhorar essa tarefa, você pode usar a opção -exec em find para processar a saída para um comando rm :

find -mtime +100 -exec rm {} +

É muito importante o uso da terminação + em vez do \; alternativo. Com + , o find só fará um comando rm para o número máximo de arquivos que ele pode processar em uma execução simples. Com a terminação \; , find fará um comando rm para cada arquivo, assim você terá o mesmo problema.

Para um melhor desempenho, você pode associá-lo ao comando ionice , como você mencionou. Se você não perceber que isso melhora o desempenho do sistema, o mais possível é que ele consome outros recursos além da E / S, como a CPU. Para isso, você pode usar o comando renice para diminuir a prioridade no uso da CPU do processo.

Eu usaria o seguinte:

ionice -c 3 find -mtime +100 -exec rm {} +

Agora, em outro shell, você precisa encontrar o PID do comando find: ps -ef | grep find

E finalmente execute o comando renice: renice +19 -p <PID_find_command>

Espero que ajude.

    
por 23.11.2016 / 22:25