在备份包含源代码的文件夹集合时(后来我意识到我可以排除包含库文件的某些文件夹,例如node_modules
),我注意到文件传输速度变得非常慢(只有几 kb/s,而备份驱动器通常允许的传输速度为 60 mb/s)。
我想了解瓶颈在哪里。是必须执行的某些计算与纯 I/O 交错,从而减慢了整个过程,还是目标驱动器上的文件系统索引具有某些必须在文件之间获取和释放的中央锁?
我在目标备份驱动器上使用 NTFS,它是一个 HDD。
答案1
问题在于,文件系统目录(表示文件在硬盘上的位置)需要被多次访问。
对于每个文件,复制需要执行以下操作:
- 从源目录中打开源文件
- 在目标目录中创建目标文件
- 复制文件
- 关闭源文件并将其目录条目标记为已读
- 关闭目标文件并将其目录条目标记为已创建。
这会导致源磁盘和目标磁盘的磁头在每次复制文件时多次从目录中的文件元数据切换到文件本身。
在 SSD 上,这不会有太大影响,但在 HDD 上,这会使大量小文件的复制速度变得非常缓慢。基本上,HDD 大部分时间都在移动磁头,这比读取或写入要慢得多。
Windows 也无法有效地使用 RAM 作为缓存,因为关闭文件会导致其内容刷新到磁盘。