Como armazenar em cache ou acelerar os resumos de 'du'?

27

Temos um sistema de arquivos grande no qual um resumo completo de du (uso do disco) leva mais de dois minutos. Gostaria de encontrar uma maneira de acelerar um resumo de uso de disco para diretórios arbitrários nesse sistema de arquivos.

Para pequenas ramificações, notei que du parece estar em cache de alguma forma, já que as solicitações repetidas são muito mais rápidas, mas em grandes ramificações a aceleração se torna insignificante.

Existe uma maneira simples de acelerar du ou mais agressivamente os resultados de cache para filiais que não foram modificadas desde a pesquisa anterior?

Ou existe um comando alternativo que possa fornecer resumos de uso de disco mais rapidamente?

    
por Ian Mackinnon 02.03.2011 / 18:35

7 respostas

17

O que você está vendo quando você reexecuta um comando du é o efeito do buffer do disco. Depois de ler um bloco, seu buffer de disco é mantido no cache de buffer até que esse bloco seja necessário. Para du você precisa ler o diretório e o inode para cada arquivo no diretório. Os du resultados não são armazenados em cache neste caso, mas podem ser derivados com muito menos disco IO.

Embora seja possível forçar o sistema a armazenar essas informações em cache, o desempenho geral sofreria, já que o espaço de buffer necessário não estaria disponível para arquivos acessados ativamente.

O próprio diretório não tem idéia de quão grande é um arquivo, portanto, o inode de cada arquivo precisa ser acessado. Para manter o valor em cache atualizado sempre que um arquivo mudasse de tamanho, o valor armazenado em cache precisaria ser atualizado. Como um arquivo pode ser listado em 0 ou mais diretórios, isso exigiria que o inode de cada arquivo saiba em quais diretórios ele está listado. Isso complicaria muito a estrutura do inode e reduziria o desempenho do I / O. Também como du permite obter resultados assumindo diferentes tamanhos de bloco, os dados requeridos no cache precisariam incrementar ou decrementar o valor em cache para cada tamanho de bloco possível, reduzindo ainda mais o desempenho.

    
por 02.03.2011 / 19:08
7

Se você conseguir que as diferentes hierarquias de arquivos pertençam a diferentes grupos, será possível configurar as cotas de disco . Não dê um limite superior (ou faça o tamanho do disco) a menos que você queira um. Você ainda será capaz de dizer instantaneamente quanto de sua cota (efetivamente infinita) o grupo está usando.

Isso requer que seu sistema de arquivos suporte as cotas por grupo. Ext do Linux [234] e zfs do Solaris / * BSD / Linux. Seria bom para o seu caso de uso se as cotas de grupo levassem em consideração as ACLs, mas não acho que elas aconteçam.

    
por 02.03.2011 / 20:31
6

Eu prefiro usar o agedu

Agedu é um software que tenta encontrar arquivos antigos e usados de maneira irregular, presumindo-se que esses arquivos provavelmente não serão desejados. (por exemplo, downloads que foram vistos apenas uma vez).

    
por 05.05.2011 / 12:42
5

O uso comum de du pode ser imensamente acelerado usando ncdu .

ncdu - NCurses Disk Usage

executa du , armazena em cache os resultados e os mostra em uma boa linha de comando gui, um pouco comparável a du -hc -d 1 | sort -h . A indexação inicial demora tanto quanto du , mas procurar o "culpado" real que preenche o precioso espaço é acelerado, pois todos os subdiretórios têm o primeiro cache de informações disponíveis.

Se os subdiretórios necessários puderem ser atualizados pressionando [r] e os arquivos / pastas poderão ser excluídos pressionando [d], ambos atualizando as estatísticas de todos os diretórios pai. A exclusão pede confirmação.

Se necessário, um aumento de velocidade pode ser alcançado precacificando ncdu -1xo- / | gzip >export.gz em um cronjob e depois acessando-o com zcat export.gz | ncdu -f- , mas obviamente fornece informações mais desatualizadas.

    
por 10.11.2016 / 19:18
2

Eu tenho um cronjob configurado para executar o updatedb a cada 10 minutos. Mantém todos os buffers do sistema de arquivos agradáveis e atualizados. Pode também usar essa RAM barata para algo bom. Use slabtop veja 'antes' e 'depois'.

    
por 05.05.2011 / 15:46
2

Como mencionado por SHW, agedu de fato criou um índice. Eu pensei em compartilhar outra maneira de criar um índice, depois de ler sobre locatedb . Você pode criar sua própria versão de um locatedb de du output:

du | awk '{print $2,$1}' | /usr/lib/locate/frcode > du.locatedb

awk reorganiza o du output para ter nomes de arquivos primeiro, para que frcode funcione corretamente. Em seguida, use locate com esse banco de dados para relatar rapidamente o uso do disco:

locate --database=du.locatedb pingus

Você pode expandir isso para atender às suas necessidades. Eu acho que é um bom uso do locateb.

    
por 19.07.2013 / 12:51
2

Se você só precisa saber o tamanho do diretório, pode acelerar muito, simplesmente evitando gravar as informações na tela. Como o total geral é a última linha do comando du , você pode simplesmente direcioná-lo para tail .

du -hc | tail -n 1

Uma estrutura de diretórios de 2 GB leva mais de um segundo para a listagem completa, mas menos de um quinto disso com este formulário.

    
por 01.04.2016 / 16:39