Como manter a remoção da subárvore ('rm -rf') de privar outros processos da E / S de disco?

8

Temos um diretório de cache Nginx muito grande (multi-GB) para um site ocupado, que ocasionalmente precisamos limpar de uma só vez. Eu resolvi isso no passado movendo a pasta de cache para um novo caminho, criando uma nova pasta de cache no caminho antigo e, em seguida, rm -rf ing a pasta de cache antiga.

Ultimamente, porém, quando preciso limpar o cache em uma manhã movimentada, a E / S de rm -rf está privando meus processos de acesso ao disco do servidor, pois tanto o Nginx quanto o servidor para o qual ele lê são intensivos em leitura. Posso observar a subida da média de carga enquanto as CPUs ficam ociosas e rm -rf recebe 98-99% de E / S de disco em iotop .

Eu tentei ionice -c 3 ao invocar rm , mas parece não ter efeito apreciável no comportamento observado.

Existe alguma maneira de domar rm -rf para compartilhar mais o disco? Preciso usar uma técnica diferente que tire suas dicas de ionice ?

Atualização:

O sistema de arquivos em questão é um armazenamento de instância do AWS EC2 (o disco primário é EBS). A entrada /etc/fstab tem esta aparência:

/dev/xvdb       /mnt    auto    defaults,nobootwait,comment=cloudconfig 0       2
    
por David Eyk 15.10.2013 / 18:32

3 respostas

3

Todos os dados coletados nesta página. Abaixo estão algumas opções para excluir um grande diretório de arquivos. Confira o write-up para os detalhes de como isso foi produzido.

Command                                 Elapsed System Time %CPU cs1* (Vol/Invol)
rsync -a –delete empty/ a                10.60      1.31    95%  106/22
find b/ -type f -delete                  28.51      14.46   52%  14849/11
find c/ -type f | xargs -L 100 rm        41.69      20.60   54%  37048/15074
find d/ -type f | xargs -L 100 -P 100 rm 34.32      27.82   89%  929897/21720
rm -rf f                                 31.29      14.80   47%  15134/11

* cs1 são interrupções de contexto voluntárias e involuntárias

    
por 22.10.2013 / 22:00
9

A remoção de arquivos realiza apenas operações de metadados no sistema de arquivos, que não são influenciadas pela ionização.

A maneira mais simples seria, se você não precisasse do espaço em disco agora, para executar o rm fora do horário de pico.

A maneira mais complexa que o MIGHT funciona é espalhar as exclusões ao longo do tempo. Você pode tentar algo como o seguinte (observe que ele assume que seus caminhos e nomes de arquivo NÃO contêm espaços!):

while find dir -type f | head -n 100 | xargs rm; do sleep 2; done
while find dir -type d -depth | head -n 100 | xargs rmdir; do sleep 2; done

Observe também que você não pode usar rm -f no primeiro comando porque o loop não pararia (depende do código de saída de erro rm quando não há argumento).

Você pode ajustá-lo modificando o número de exclusões por ciclo (100 no exemplo) e a duração do sono. Pode não funcionar realmente, já que o sistema de arquivos ainda pode agrupar as atualizações de metadados de maneira que você tenha problemas com sua carga de IO. Você apenas tem que tentar.

    
por 15.10.2013 / 19:17
-1

Você pode emparelhar com o comando "nice". ionice -c 3 nice -19 rm -rf /some/folder

Isso altera a prioridade do processo na máquina.

    
por 15.10.2013 / 19:44