Como armazenar em cache ou acelerar os resumos `du`?

33

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

Para ramificações pequenas, notei que os duresultados parecem estar armazenados em cache de alguma forma, pois as solicitações repetidas são muito mais rápidas, mas em ramificações grandes a velocidade se torna insignificante.

Existe uma maneira simples de acelerar duou armazenar em cache resultados mais agressivos para ramificações que não foram modificadas desde a pesquisa anterior?

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

Ian Mackinnon
fonte
8
Dois minutos não me parecem tão longos. Mas a verdadeira questão é: "Você realmente deseja armazenar em cache alguma coisa?" Você não deve fornecer contagens exatas, tão atuais quanto possível, reais de blocos de disco?
precisa
Concordo que a substituição duseria ruim, mas um script de wrapper mais rápido com uma interface idêntica seria muito útil para nós. Além disso, eu esperaria que os resultados do armazenamento em cache dependentes do horário da última modificação (e assumindo que não haja operações em todo o disco, por exemplo, desfragmentação) forneceriam resultados de tamanho exato: estou perdendo alguma coisa?
Ian Mackinnon
2
Se você estiver preocupado com o uso excessivo de disco, considere implementar uma cota.
pyasi
2
Bruce - você poderia fazer a mesma pergunta find. Mas depois tem locate.
Yuval
Se você estiver no Android , consulte StatFsuma estimativa super rápida dos tamanhos de diretório. Era quase 1000x mais rápido para diretórios grandes e complexos, em comparação com du.
Joshua Pinter

Respostas:

21

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

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

O diretório em si não tem idéia do tamanho de um arquivo, portanto, o inode de cada arquivo precisa ser acessado. Para manter o valor em cache atualizado sempre que um arquivo muda de tamanho, o valor em cache precisa ser atualizado. Como um arquivo pode ser listado em 0 ou mais diretórios, isso exigiria que o inode de cada arquivo soubesse em quais diretórios ele está listado. Isso complicaria bastante a estrutura do inode e reduziria o desempenho de E / S. Além disso, como du permite que você obtenha resultados assumindo diferentes tamanhos de bloco, os dados necessários no cache precisariam aumentar ou diminuir o valor em cache para cada tamanho de bloco possível, diminuindo ainda mais o desempenho.

BillThor
fonte
7

Se você pode organizar para que as diferentes hierarquias de arquivos pertençam a grupos diferentes, é possível configurar cotas de disco . Não atribua um limite superior (nem o tamanho do disco), a menos que você queira um. Você ainda poderá informar instantaneamente quanto de sua cota (efetivamente infinita) que o grupo está usando.

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

Gilles 'SO- parar de ser mau'
fonte
7

O uso comum de dupode ser imensamente acelerado usando ncdu.

ncdu - NCurses Disk Usage

executa o du, armazena em cache os resultados e os mostra em uma boa interface de linha de comando, um pouco comparável a du -hc -d 1 | sort -h. A indexação inicial leva o mesmo tempo du, mas a procura pelo "culpado" real que preenche um espaço precioso é acelerada, pois todos os subdiretórios têm as informações em cache disponíveis inicialmente.

Se necessário, os subdiretórios podem ser atualizados pressionando [r] e os arquivos / pastas podem ser excluídos pressionando [d], os quais atualizam estatísticas para todos os diretórios pai. A exclusão solicita confirmação.

Se necessário, é possível obter mais velocidade antecipando ncdu -1xo- / | gzip >export.gzum cronjob e acessando-o posteriormente zcat export.gz | ncdu -f-, mas obviamente fornece mais informações desatualizadas.

DennisH
fonte
7

Eu prefiro usar o agedu

O Agedu é um software que tenta encontrar arquivos antigos e usados ​​irregularmente, com a suposição de que esses arquivos provavelmente não são desejados. (por exemplo, downloads que foram vistos apenas uma vez.)

Ele faz basicamente o mesmo tipo de verificação de disco que du, mas também registra os últimos tempos de acesso de tudo o que verifica. Em seguida, cria um índice que permite gerar relatórios com eficiência, fornecendo um resumo dos resultados para cada subdiretório e, em seguida, produz esses relatórios sob demanda.

SHW
fonte
4
Não responde à pergunta, mas continua com +1. Boa dica.
0xC0000022L
Eu editei a pergunta para deixar mais claro que isso realmente responde à pergunta (o índice de idade é o uso do disco e o tempo de acesso).
Anthony G - justiça para Monica
5

Como mencionado pelo SHW, de agedufato criou um índice. Pensei em compartilhar outra maneira de criar um índice, depois de ler sobre locatedb. Você pode criar sua própria versão de a locatedbpartir da dusaída:

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

awkreorganiza a saída du para ter nomes de arquivos primeiro, para que frcodefuncione corretamente. Em seguida, use locatecom 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 de locatedb.

Yuval
fonte
3
duc

(consulte https://duc.zevv.nl ) pode ser o que você está procurando.

O Duc armazena o uso do disco em um banco de dados otimizado, resultando em uma interface de usuário rápida. Não há tempos de espera após a conclusão do índice.

A atualização do índice é muito rápida para mim (menos de 10 segundos para cerca de 950k arquivos em diretórios 121k, 2,8 TB). Tem uma GUI e uma interface de usuário ncurses também.

Uso por exemplo:

duc index /usr
duc ui /usr

A partir do site:

O Duc foi desenvolvido para ser dimensionado para enormes sistemas de arquivos: indexará e exibirá centenas de milhões de arquivos em petabytes de armazenamento sem problemas.

Pedro
fonte
2

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

Marcin
fonte
Não entendo como sua resposta está relacionada à pergunta. updatedbnão diz nada sobre o uso do disco. Se você estiver fazendo isso apenas para atravessar o disco, prejudicará o desempenho geral.
Gilles 'SO- stop be evil'
3
A contagem de tamanhos de arquivo para dué lenta porque você precisa acessar os metadados de um número potencialmente grande de arquivos espalhados pelo disco. Se você executar a atualização agressivamente, os metadados de todos os arquivos serão forçados a serem armazenados na RAM. Na próxima vez que você executar qualquer outra operação pesada em metadados, em vez de fazer milhares de buscas nos discos, use o cache. Normalmente, você tem uma pequena chance de armazenar em cache essa parte específica dos metadados da árvore. Com o meu 'preparo do cache de metadados', é altamente provável que os dados desejados sejam armazenados em cache recentemente. Nenhuma busca física == RÁPIDO.
Marcin
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 ducomando, você pode simplesmente canalizá-lo tail.

du -hc | tail -n 1

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

Frank
fonte
2
Eu acho que du -hsé mais conveniente para esse fim.
Lepe 28/05
also--max-depth 1
stevesliva 12/06