微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在一系列相同大小的文件创build/删除之后,NTFS磁盘上的空间不足

我在一个大型项目上遇到了一个非常奇怪的问题。 我在一个分区上写了一堆相同大小的文件(尝试了通过diskmgmt.msc创build的RAM磁盘和虚拟磁盘)。 当没有足够的可用空间来适应另一个文件(由GetdiskFreeSpaceExW报告)时,我删除一个(只有一个)以前创build的文件并写入新的文件。 然后,我删除一个文件,并写一个新的,无限广告(所以,你可能会认为分区为同等大小的文件环形缓冲区)。 经过一系列的写入 – 删除(从几百到几千)之后,我写入一个文件(在此之前, GetdiskFreeSpaceExW报告了足够的空间)时遇到了一个no free space错误。 我问了一些我的同事试图在硬件上重现问题,但问题并没有重现。

为了澄清一些事情,下面是确切的algorithm:

select文件大小(比如S字节)

使用GetdiskFreeSpaceExW检查可用空间

如果free_space> S:写入大小为S的新文件并转到2

否则:删除一个文件并转到2

请注意,我将数据写入大小为4096字节的块中的文件是很重要的(根据块的大小,问题可能会重现,也可能不会重新出现)。 文件大小是5MB。 NTFS分区大小是21 MiB。 簇大小是512 B(再次,更改这些参数会影响结果)。 使用这些参数,在创build第684个文件的过程中发生故障。 这不取决于我使用RAM磁盘还是虚拟磁盘(因此,这不是特定实现的问题)。

我分析了失败后产生的磁盘映像转储,并发现这些文件严重碎片化。 Chkdsk在实验之前和之后都没有报告问题。 在系统日志中没有发现错误

在Linux中模拟硬盘驱动器

如何在Windows资源pipe理器中添加像CD Emulation这样的虚拟驱动程序

用于远程Web服务的Windows虚拟磁盘

我的上网本(Dell Inspiron 1110)的可能相关参数:

奔腾SU4100,相对较慢的双核x64 CULV cpu(1.3 GHz)

Windows 7旗舰版x64版本

2 GB RAM

有没有人有什么想法和如何debugging? 我在哪里可以find更多信息? 我已经没有想法了,我需要尽快解决这个问题。

UPD:当我写文件数据(即write()失败), 而不是当我创build文件时发生问题。 所以,它看起来不像我缺乏MFT条目。

UPD2:回答一些被问到的问题

该分区是一个新格式化的分区,因此,在文件上没有特定的属性,没有目录结构,什么都没有

权限是认的

没有.lnk的,没有硬链接 – 仅用于我写的文件

所有的文件被写入根目录,没有更多的目录被创build

文件名只是文件的序号(即1,2,3,…)

没有备用的数据stream,使用`fopen()`创build文件,用`fwrite()`写入并用`fclose()

确实,$ Txf被创build

没有坏簇,这是一个虚拟(或RAM)磁盘

很好的NTFS问题,而不是所有的信息在这里。 什么是导演结构? 有没有这个LINK文件? 你在硬盘上使用压缩吗? 卷影复制?

您不会用完MFT空间,因为有一个不变的文件/目录。 这意味着MFT是静态的。 另外,MFT储备空间将在低磁盘空间情况下使用。 我用完了NTFS卷上的每个群集。

关于发生了什么有几个解释:

1)$日志文件可能已经增长。 这是一个回滚日志。

2)如果在驱动器上有非统一的权限,文件安全信息的@SII文件可能会增长

3)如果该卷上的某些文件有指向它们的.lnk /快捷方式文件,系统会将每个目标的GUID放入索引中。 (如果你在浏览器中点击一个文件,你会得到.lnk文件 – 在最近的文档中!)

4)目录结构不是静态的(或者文件名的长度不统一),目录的$ index缓冲区可能会增大。

5)如果在该驱动器上有一个系统卷directroy,则可能有卷影副本和其他操作系统特定的数据。

6)备用数据流不显示文件的大小。 有没有?

7)TxF – 在Vista和更高版本中,可能有一个占用可变空间的事务层。

8)坏集群? 集群可能会变坏(但chkdsk可能会注意到这一点..)

9)文件变得碎片化,碎片列表和其他元数据一起太大,不适合MFT记录(不太可能,因为你的文件很小,而且你没有很长的文件

10)硬链接的使用也将更多的数据放在驱动器上。

我列出所有这些作为其他人的参考!

最后一点 – 有时你可以创建和写入一个文件,即使有0字节空闲,因为NTFS常驻文件只占用一个MFT记录(他们重新删除一个免费的)

FS有自己的开销,你没有考虑。 这种开销并不是一成不变的,所以通过删除/写入文件可能会导致分片。 换句话说,“5 MB的可用空间”并不意味着你可以写入5MB的磁盘。

假设你的实现是正确的,你的同事不能重现这个问题,那么你的MFT可能已经没有空间了。

认情况下,Windows XP保留每个NTFS卷(一个称为MFT区的区域)的12.5%,以供MFT专用。 因此,如果您计划在卷上存储大量小文件(例如8K以下),那么您的MFT可能会在卷空闲空间耗尽之前耗尽空间,结果将是MFT碎片。

来自Technet

首先,即使从卷中删除文件和目录,MFT也不会收缩; 相反,MFT标志着FRS反映了删除。 其次,NTFS在涉及这些文件的MFT FRS中存储了非常小的文件。 尽管此设置为这些文件提供了性能优势,但当卷包含许多此类文件时,它可能会导致MFT过度增长。

虽然禁用TXF可能会解决这个问题(TXF只是使用卷空间的文件系统的一个组件),但这并不奇怪,有两件事情需要考虑。 第一,也是更重要的一点是,你可能要小心禁用它。 (其他组件可能依赖于它; Windows Update就是这样一个组件,但它应该只关心系统卷)。

另一件要考虑的事情是,这通常是一个实际上是脆弱的模式。 文件系统有一些关于它可以消耗的假设。 例如,索引将会增长(按照预定义的增量进行更改),并且它们可能不会以您可以预见的方式缩小。 另外,安全描述符索引可能会继续增长。

上面关于影子副本的另一个注意事项是时刻牢记在心。

FWIW $ Log文件不会自动增长。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐