Como faço para gerar "escassez" de um arquivo?

15

Como produzo quanto do tamanho nominal do arquivo é realmente preenchido com dados? Como vmtouchmostra quanto do arquivo está atualmente na memória ...

Espero que o fluxo de trabalho seja assim:

$ fallocate -l 1000000 data 
$ measure_sparseness data
100%
$ fallocate -p -o 250000 -l 500000  data
$ measure_sparseness
50%

Solução: use du -bshe du -she compará-los.

Vi.
fonte
1
related: filefragpara qualquer sistema de arquivos e xfs_bmap -vplpara o XFS, são as principais ferramentas para mostrar onde estão os dados (e onde estão as extensões não escritas pré-alocadas) ao brincar com arquivos esparsos e fazer furos.
Peter Cordes
filefrag data-> múltiplo FIBMAP: Invalid argument-> data: 1 extent found...
Vi.
em que sistema de arquivos? filefrag -efunciona perfeitamente em XFS e ext4 pelo menos. Eu não testei em outros. Ele usa FIEMAP (mapa de extensão), com um fallback para o FIBMAP. Se esses ioctls não funcionarem, não será útil.
Peter Cordes
Em tmpfs. Meu filefragnão tem -eopção.
Vi.
Quantos anos você tem e2fsprogs? Tenho certeza de que não é um recurso recente. Há também uma -vopção que imprime as mesmas informações detalhadas (mais algumas linhas de cabeçalho extras). Talvez você filefragtenha isso. Ao contrário xfs_bmap, porém, ele não indica explicitamente os furos com linhas separadas, apenas possui descontinuidades na posição do arquivo. De qualquer forma, não estou surpreso que tmpfsnão seja compatível com o FIEMAP, porque não existe um dispositivo de bloco como uma loja de suporte, portanto, não há valor sensato para a localização das extensões.
Peter Cordes

Respostas:

19

findtem um %Sespecificador de formato que é chamado "escassez"

         %S     File's  sparseness.   This  is  calculated as (BLOCKSIZE*st_blocks / st_size).  The exact value you will get for an ordinary file of a certain
                 length is system-dependent.  However, normally sparse files will have values less than 1.0, and files which use indirect  blocks  may  have  a
                 value which is greater than 1.0.   The value used for BLOCKSIZE is system-dependent, but is usually 512 bytes.   If the file size is zero, the
                 value printed is undefined.  On systems which lack support for st_blocks, a file's sparseness is assumed to be 1.0.
$ fallocate -l 1000000 data
$ find data -printf '%S\n'
1.00352
$ fallocate -p -o 250000 -l 500000  data
$ find data -printf '%S\n'
0.507904
Vi.
fonte
Interessante. A maioria dos arquivos regulares em um sistema terá escassez acima de 1,0, diretórios, softlinks e soquetes sempre terão exatamente 1,0.
grochmal
Alguns sistemas não salvaram o link simbólico (curto) diretamente no inode, sem usar blocos de dados? Imagino qual deve ser a escassez. Além disso, não é essa definição o caminho errado, certamente um arquivo normal (ou seja, não esparso) deve ter escassez zero? :)
ilkkachu
@grochmal, em ext4 (Linux): ln -s foo link"escassez" de link: 0. Sockets e FIFOs tem comprimento zero, assim que findmostra escassez 1.
ilkkachu
1

Se o seu findnão tiver essa opção, um método que funcione no UNIX desde os anos 70 é:

ls -ls file

O que imprimirá o número real de blocos usados ​​e o byte mais alto já gravado. A partir disso, você pode calcular facilmente quantos blocos realmente não foram alocados.

MAPA
fonte
0

Enquanto find's %Simprimirá uma saída breve, para mais detalhes você pode querer olhar para o sparsetestque eu escrevi - código aberto, e no github aqui . Sinta-se à vontade para modificá-lo se desejar imprimir (por exemplo) todos os furos.

Artigo do blog mostrando problemas com alocações esparsas aqui usando sparsetestpara depurar o problema.

abligh
fonte
Ele pode imprimir um "mapa" de extensões em um arquivo, como vmtouch -vimprime o mapa de áreas em cache no arquivo?
Vi.
@Vi. Escrevi há muito tempo e esqueci alguns detalhes - o que realmente está fazendo é criar um arquivo esparso, gravar dados nele e depois imprimir estatísticas. Você só quer que a estatística crie um bit. Para imprimir furos, você precisará lseekcom SEEK_HOLEe SEEK_DATA. Fácil de fazer.
abligh