我正在看这个设置:
- Windows 服务器 2012
- 1 TB NTFS 驱动器,4 KB 簇,~90% 已用完
- 10,000 个文件夹中存储约 10M 个文件 = 每个文件夹约 1,000 个文件
- 文件大多较小 < 50 KB
- 磁盘阵列上的虚拟驱动器
当应用程序访问存储在随机文件夹中的文件时,读取每个文件需要 60-100 毫秒。使用测试工具似乎延迟发生在打开文件时。读取数据仅需花费一小部分时间。
总之,这意味着读取 50 个文件很容易就需要 3-4 秒,这比预期的要多得多。写入是批量完成的,因此性能不是问题。
我已经遵循了 SO 和 SF 的建议来得出这些数字。
- 使用文件夹来减少每个文件夹中的文件数量(在文件系统中存储一百万张图像)
- 运行
contig
以对文件夹和文件进行碎片整理(https://stackoverflow.com/a/291292/1059776) - 8.3 名称和上次访问时间已禁用(配置 NTFS 文件系统以提高性能)
读取时间该如何处理?
- 认为每个文件 60-100 毫秒是可以的(但事实并非如此,是吗?)
- 您对如何改进设置有什么想法吗?
- 是否有低级监控工具可以准确告诉您时间花在了什么地方?
更新
正如评论中提到的,系统运行 Symantec Endpoint Protection。但是,禁用它不会改变读取时间。
PerfMon 测量每次读取耗时 10-20 毫秒。这意味着任何文件读取都需要大约 6 次 I/O 读取操作,对吗?这会是 MFT 查找和 ACL 检查吗?
MFT 的大小约为 8.5 GB,大于主内存。
答案1
服务器内存不足。每次文件访问都需要多次磁盘读取,而不是将 NTFS 图元文件数据缓存在内存中。像往常一样,问题一目了然。让我分享一下我的看法:
服务器在任务管理器和 RamMap 中均显示有 2 GB 内存可用。因此,Windows 认为可用内存不足以保存图元文件数据的重要部分。或者某些内部限制不允许将最后一点内存用于图元文件数据。
升级后,RAM 任务管理器不会显示更多内存被使用。但是,RamMap 报告有多个 GB 的图元文件数据被保存为备用数据。显然,备用数据会产生重大影响。
用于分析的工具:
fsutil fsinfo ntfsinfo driveletter:
显示 NTFS MFT 大小(或NTFS信息)- 拉姆地图显示内存分配
- 进程监控表明每次读取文件之前都会对驱动器:\$Mft 和驱动器:\$Directory 执行大约 4 次读取操作。虽然我找不到 $Directory 的确切定义,但似乎与 MFT 有关也一样。