Les fichiers SPARSE

Bonjour,

J'ai récemment dû tester la fonctionnalité "sparse file" de NTFS en dehors de SQL Server.

J'en profite donc pour noter ici un script tout simple qui permet de démontrer le bon fonctionnement et l'intérêt des sparse files.

 Dans une fenêtre CMD avec les droits admin, dans le répertoire c:\work :

REM 1 Creation fichier testfsutil file createnew C:\work\testsparsefile.txt 10000000REM Expected : "File C:\work\testsparsefile.txt is created"

REM 2 Activation flag sparseFSUTIL sparse setflag C:\work\testsparsefile.txtREM Expected : <no msg>

REM 3 check flag sparseFSUTIL sparse queryflag C:\work\testsparsefile.txtREM Expected : "This file is set as sparse"

REM 4 zero out the file. fsutil file setzerodata offset=00 length=9500000 C:\work\testsparsefile.txtREM Expected : "Zero data is changed"

 

Intéressons-nous aux propriétés du fichier entre l'étape 2 et 4 :

Pas de surprise, le fichier fait 9.53 MB théoriques, et 9.53 MB sur disque.

Mais après la dernière étape :

Et voilà : 9.53 MB théoriques mais seulement 576 kb sur disque ! C'est tout l'intérêt du sparse file.

Pourquoi ne voit-on l'effet qu'à l'étape 4 alors que le fichier est flaggé comme sparse en étape 3 ?

Eh bien le fichier a été créé à 9.53 MB comme fichier normal (non sparse). Lorsque je passe le fichier en mode sparse, Windows ne sait pas forcément qu'il est plein de vide, et rien ne change.

La dernière étape force la mise à zéro de 95% du fichier. Comme le fichier est sparse au moment de cette opération, NTFS "suit" la mise à zéro de larges plages du fichier et applique l'optimisation du sparse file qui consiste à ne pas allouer l'espace pour stocker ces zéros. D'ailleur l'optimisation ne porte que sur le range mis à zéro (les 95%). Les 576kb correspondent aux 5% restant qui sont pourtant eux aussi bien a zéro car FSUTIL crée un fichier plein de zéros. Si j'applique la mise à zéro de l'intégralité du range après activation du sparse flag, j'arrive à 4 KB d'utilisation effective du disque (je soupçonne la taille d'un cluster disque  :) ).

Quelques pointeurs utiles :

NTFS : https://technet.microsoft.com/en-us/library/cc781134(v=WS.10).aspx

FSUTIL : https://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/fsutil.mspx?mfr=true

Exemples d'interaction SQL Server / NTFS avec les fichiers sparse : https://blogs.msdn.com/b/jorgepc/archive/2010/11/25/what-are-sparse-files-and-why-should-i-care-as-sql-server-dba.aspx

HTH

Guillaume Fourrat