我有一台运行 Windows Server 2008 R2 x64 的服务器,具有 4GB 的 RAM,它承载大约 2-3 百万个文件,其中大部分是图像文件。
在一周的时间里,我注意到服务器上的应用程序由于内存不足导致过度分页到磁盘而缓慢爬行,这对当前在其上运行的所有服务产生连锁反应,导致主要性能问题。
在任务管理器中进行调查时,我注意到几乎所有 4GB 都在使用中,但是当您查看“进程”选项卡时,所有内存使用量的总和并没有加起来,最多只有 1.5GB 应该在使用中。
使用谷歌找到解决方案,似乎大部分 RAM 都用于“元文件”,它是文件系统上文件的 NTFS 信息的缓存,这样系统就不必再次向 MFT 查询信息。这个缓存永远不会被清除或在任务管理器中被标记为“缓存”或在 Sysinternal 的 RamMap 中被标记为“备用”。
有人建议安装 KB979149 修补程序,但在尝试安装时,提示“此更新不适用于您的计算机”。
到目前为止,我发现的唯一临时修复是:
目前,我必须每隔几天执行一次 2. 修复,以防止它达到瓶颈水平。
之前:(使用了 800 MB RAM - 其他应用程序无法使用此 RAM)
之后:(800 MB RAM 标记为缓存 - 可用于其他应用程序)
所以我对你们所有人的问题是:是否存在任何方法来限制此元文件的 RAM 使用量?
我正在查看此设置:
当应用程序访问存储在随机文件夹中的文件时,读取每个文件需要 60-100 毫秒。使用测试工具似乎在打开文件时发生延迟。然后读取数据只需要一小部分时间。
总之,这意味着读取 50 个文件很容易花费 3-4 秒,这比预期的要多得多。写入是批量完成的,因此性能在这里不是问题。
我已经按照 SO 和 SF 的建议得出了这些数字。
contig
对文件夹和文件进行碎片整理(/sf/answers/20390471/)阅读次数怎么办?
更新
如评论中所述,系统运行 Symantec Endpoint Protection。但是,禁用它不会更改读取时间。
PerfMon 每次读取测量 10-20 毫秒。这意味着任何文件读取都需要大约 6 个 I/O 读取操作,对吗?这会是 MFT 查找和 ACL 检查吗?
MFT 的大小约为 8.5 GB,大于主内存。
我们有一个应用程序计划存储大约 1.1TB 的 XML 文件,平均大小为 8.5kb。
这些代表了 18 个月的滚动数据,每天创建大约 200,000 个新文件。
每个文件只会写入一次,然后有 3% 的机会在接下来的 18 个月内被读取少量 (<10) 次。
哪些 NTFS 选项对我们开放,有助于提高性能?
目前我们名单上的有:
关于碎片:我们计划使用 2k 集群大小来提高磁盘空间使用效率。每个文件将只写入一次(即没有文件编辑)。文件将在 18 个月后每天删除。
因此,我们认为碎片化不会是一个重大问题。