Comment puis-je sortir la «parcimonie» d'un fichier?


15

Comment puis-je afficher la quantité de taille nominale de fichier réellement remplie de données? Comme vmtouchmontre la quantité de fichier actuellement en mémoire ...

Je m'attends à ce que le flux de travail soit comme ceci:

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

Solution: utilisez du -bsh-les du -shet comparez-les.


1
liés: filefragpour tout système de fichiers et xfs_bmap -vplpour XFS sont des outils clés pour montrer où se trouvent les données (et où se trouvent les extensions non écrites pré-allouées) lors de la lecture avec des fichiers clairsemés et des perforations.
Peter Cordes

filefrag data-> multiples FIBMAP: Invalid argument-> data: 1 extent found...
Vi.

sur quel système de fichiers? filefrag -efonctionne parfaitement sur XFS et ext4 au moins. Je n'ai pas testé sur d'autres. Il utilise FIEMAP (carte d'extension), avec un repli sur FIBMAP. Si ioctlcela ne fonctionne pas, cela ne sera pas utile.
Peter Cordes

Sur tmpfs. Mon filefragn'a pas d' -eoption.
Vi.

Quel âge avez-vous e2fsprogs? Je suis sûr que ce n'est pas une fonctionnalité récente. Il existe également une -voption qui imprime les mêmes informations détaillées (plus quelques lignes d'en-tête supplémentaires). Peut-être que vous en filefragaurez. Contrairement à xfs_bmap, cependant, il n'indique pas explicitement les trous avec des lignes distinctes, il a juste des discontinuités dans la position du fichier. Quoi qu'il en soit, je ne suis pas surpris que tmpfscela ne prenne pas en charge FIEMAP, car il n'y a pas de périphérique de bloc en tant que magasin de sauvegarde, il n'y a donc pas de valeur raisonnable pour l'emplacement des extensions.
Peter Cordes

Réponses:


19

finda un %Sspécificateur de format qui est même nommé "parcimonie"

         %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

Intéressant. La plupart des fichiers normaux sur un système auront une clarté supérieure à 1.0, les répertoires, les liens logiciels et les sockets auront toujours exactement 1.0.
grochmal

Certains systèmes n'ont-ils pas enregistré le lien symbolique (court) directement dans l'inode, sans utiliser de blocs de données? Je me demande ce que cela devrait être. En outre, cette définition n'est-elle pas à l'envers, un fichier normal (c'est-à-dire non clairsemé) devrait sûrement avoir une densité nulle? :)
ilkkachu

@grochmal, sur ext4 (Linux):, ln -s foo link"parcimonie" de link: 0. Les sockets et les FIFO ont une longueur nulle, donc findaffiche la parcimonie 1.
ilkkachu

1

Si votre findn'a pas cette option, une méthode qui fonctionne sous UNIX depuis les années 70 est:

ls -ls file

Qui affichera le nombre réel de blocs utilisés et l'octet le plus élevé jamais écrit. À partir de cela, vous pouvez facilement calculer le nombre de blocs qui n'ont pas été alloués.


0

Bien que finds %Simprimera une brève sortie, pour plus de détails, vous voudrez peut-être regarder sparsetestce que j'ai écrit - open source, et sur github ici . N'hésitez pas à le modifier si vous souhaitez imprimer (par exemple) chaque trou.

Blog article montrant des problèmes avec les allocations clairsemées ici à l' aide sparsetestde déboguer la question.


Peut-il imprimer une "carte" des étendues dans un fichier, comme vmtouch -vimprime la carte des zones mises en cache dans le fichier?
Vi.

@Vi. Je l'ai écrit il y a longtemps et j'ai oublié certains détails - ce qu'il fait en fait, c'est de créer un fichier épars, d'y écrire des données, puis d'imprimer des statistiques. Vous voulez juste le bit de création de statistiques. Pour imprimer les trous dont vous aurez besoin lseekavec SEEK_HOLEet SEEK_DATA. Facile à faire.
abligh
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.