本文介绍Windows NTFS文件系统中存在大量小文件导致空间统计异常的问题原因及解决方案。
大量小于1 KB文件占用空间问题
问题描述
如下图所示,Windows系统中从文件统计看占用磁盘空间1.56 MB,共计409,600个小文件,每个文件包含几个字符,容量大约为几个字节,但磁盘显示使用空间已经占用594 MB,两处空间大小统计相差较大。
问题原因
该情况为NTFS文件系统中NFT占用导致,与NTFS文件系统中的文件存储方式有关。NTFS文件系统格式化后简单的结构如下图所示。
其中BOOT中存放文件系统基础信息,如簇大小等。NTFS的文件信息都存放在Master File Table(MFT)中,每个MFT的记录是1 KB大小且固定不变。每个记录对应一个文件,或者对应其他文件系统对象。记录格式为:记录头+属性1+属性2+...+属性n,属性里包括文件名、长度、修改时间等等。如果文件信息足够小,那么1 KB的记录是用不满的,剩下的部分就可以放文件内容。其中,当文件足够小的时候,DATA里放的就是文件内容,当文件足够大的时候DATA放的是指针,指向另外一个区域保存更大的数据。针对此问题,409,600个文件要消耗409,600个MFT记录,共计消耗容量400 MB。此外,NTFS文件系统日志和位图等也需要消耗空间,共计消耗594 MB容量。此情况也可以通过执行chkdsk d:
命令获取相关系统占用信息,此问题执行chkdsk d:
命令后详细信息如下图所示。
或者使用WinHex程序获取更详细的系统占用,下载WinHex后运行,后续使用Tools-Open Disk
命令打开需要分析的磁盘,获取详细信息。如图所示,MFT占用了400 MB空间,LogFile占用了64 MB空间,BitMap占用了3.1 MB空间。
解决方案
针对MFT中已经分配的空间,默认删除文件会被标记为空,但不会自动回收,提升再次创建文件时的效率。如果确实需要释放,一般需要第三方磁盘清理或整理工具进行,分区容量不大时,也可以创建大文件占用空间,此时系统会自动释放已经删除的MFT空间。针对此类情况,也建议针对小文件进行定期压缩备份,降低MFT占用的空间,或从业务逻辑上减少大量小文件使用。
大量小文件但大于1 KB文件占用空间问题
问题描述
如下图所示,共计409,600个小文件,文件本身大小为1 KB,实际文件容量为400 MB,但占用空间为1.56 GB。
问题原因
针对NTFS文件系统中默认文件的分配单元以簇的方式进行分配管理,默认最小的簇大小为4 KB,当文件小于4 KB或剩余分配不足4 KB时,实际分配仍旧为一个簇,即4 KB大小,则会导致占用磁盘空间较大。
解决方案
如果业务中确实有大量小于4 KB文件或大量小文件存储,也可以定期压缩备份减少磁盘占用,或者当小文件有固定大小时,可以在磁盘格式化时手工指定更小的簇大小,用以避免空间浪费的情况。指定簇大小可以在格式化过程中选择合适的分配单元大小,其中默认配置大小为 4,096字节,如下图所示。
格式化磁盘为危险操作,请提前对磁盘进行快照备份,避免数据丢失。快照备份方法请参考创建快照。
相关文档
如何定位并更正NTFS文件系统中的磁盘问题请参见参考文档。