Ins*_*Bun 15 performance filesystems formatting exfat
参考此页面:https : //support.microsoft.com/en-us/kb/140365
在卷超过 16TB 之前,NTFS 不会超过 4KB 集群大小,而 FAT32 在现代版本的 Windows 上的 16GB–32GB 卷范围内最大为 16KB。
然而,exFAT 在 7MB-256MB 的卷范围内仅默认为 4KB。之后,它在 256MB-32GB 范围内跃升至 32KB,超过该范围则跃升至 128KB。
这是为什么?相对较大的集群大小似乎很浪费,尤其是在为较小的外部设备(如闪存驱动器)设计的格式中。如果您正在格式化闪存,则更是如此,因为据我所知,较大集群大小的主要好处是由于碎片较少和读取的整体集群较少,因此 IO 速度更快。如果我错了,请纠正我,但闪存非常,不太容易因碎片引起的减速。那么为什么要使集群规模如此之大呢?
Muh*_*gen 14
因为 exFAT 主要用于大容量 SD 卡之类的东西,在 SD 卡上,您必须先擦除一个扇区,然后才能对其进行写入。如果您要在具有大擦除扇区大小的卡上使用小集群,则会导致对同一扇区的许多擦除和写入命令将多个连续集群的数据写入磁盘,不仅会降低性能,而且会过早地磨损闪存细胞。擦除扇区大小通常不会记录在卡数据表中,但可以在卡的 CSD 寄存器中找到。该寄存器的内容因卡的内部设计而异。由于SD卡通常用于存储大文件的相机之类的东西,因此大簇大小浪费的空间并不重要,
这个网页有大约十几个卡片的这个寄存器的内容:
http://goughlui.com/2014/01/03/project-read-collect-decode-sd-card-csd-register-data/
如果您将其内容输入到以下计算器中,您可以看到一些 32/64GB 卡的擦除扇区大小为 128 个块,其中一个块为 512 字节。对于 2GB 卡,擦除扇区大小为 32 个块,其中一个块为 1024 字节。
http://goughlui.com/static/csdecode2.htm
无论 Windows 是否足够智能,可以查询 CSD 寄存器并建议集群大小,或者它是否只是根据分区或磁盘大小进行猜测是未知的。如果您要使用微控制器模拟 SD 卡,您可以找到答案。
小智 5
这个问题的早期答案是错误的,不应该被投票或接受。exFAT 不是闪存文件系统。它从未直接在“原始”闪存上使用。即使簇大小与闪存擦除块大小匹配,这也会非常低效。
\n实际发生的情况是 exFAT 运行在块设备模拟层之上,该模拟层通常在闪存设备本身的固件中实现。假设 exFAT 簇大小为 128K,(假)块设备的扇区大小为 4K,并且您将 5K 文件写入 exFAT 卷。exFAT 驱动程序为文件分配128K,但(忽略元数据)它只写入8K:实际包含文件数据的两个扇区。如果簇大小为 4K,则写入的数据量相同。不同之处在于,如果您写入一堆 5K 文件,它们将被 30 个从未读取或写入的未使用的伪扇区分隔开。但这并不重要,因为数据在原始闪存上的实际位置与虚拟块设备的扇区号无关。exFAT 簇大小可能对写入原始闪存的数据量或块擦除操作的数量影响不大。当您包括 exFAT 元数据开销时,较大的簇应该更高效 \xe2\x80\x93 但这与原始闪存的擦除块的大小无关,原始闪存完全被模拟层隐藏。
\n当然,如果您尝试存储大量小文件,大型集群意味着您会用完假块设备上的空间,并且无法强制模拟层让您使用其余的真实空间(缺少使用您跳过的那些扇区号),因此大型集群似乎仍然是一个坏主意。我不知道 Microsoft 的谁决定默认的 exFAT 簇大小应该如此之大,也不知道为什么,但我会推测。
\nexFAT 的每簇开销比 NTFS 大得多:事实上,大 65 倍,因为 NTFS 每个簇只有 1 位用于空闲空间位图,而 exFAT 在位图中有 1 位,加上两个 FAT 中各有 4 个字节。另一方面,NTFS 有一些重要的其他固定开销(特别是日志的几兆字节),这与簇的数量没有直接关系。
\n我的猜测是他们希望 exFAT 看起来比 NTFS 的开销更少。在小卷上,NTFS 总是消耗至少几兆字节,因此 4K 簇的 0.2% 开销似乎还不错。但新格式化的 1TB 卷将包含大约 2GB 的 exFAT 元数据和 4K 簇,而 NTFS 只需要大约 40MB。这看起来很糟糕(我想确实会很糟糕),所以他们必须使用更大的簇大小。
\n