我有一台 Windows Server 2008 R2(64 位),在 4GB 物理服务器中运行 64 位 Firebird 2.1.4.18393_0 安装。
过了一会儿,任务管理器显示所有内存都已使用,但所有进程的内存总和还不到内存的一半。不幸的是,它开始交换。
使用 RAMMAP,我可以看到我的整个数据库文件都映射到内存中。这只发生在 Windows Server 2008 R2 和 Windows 7 64 位中。我可以使用 Firebird 32 位或 64 位安装,没关系。
我该如何防止这种情况发生?为什么这种情况只发生在 w2k8r2 和 w7 中?
提前致谢
** 更新
显然,这是由于文件系统缓存使用了所有内存而导致的。微软文档解释说,这在 Windows XP、2K3、Vista 和 2K8 中是一个问题,但在 7 和 2K8R2 中已得到解决。还补充说,这个问题在 64 位主机中更常见。(http://support.microsoft.com/kb/976618)
有一些工具(DynCache、setcache 和来自 Windows API 的 Get/SetSystemFileCacheSize 系统调用)允许我修复 fscache 内存使用的上限,但文档表明我不应该在 w2k8r2 中这样做,因为它将严重影响整个系统性能。无论如何,我尝试过,性能保持不变,页面文件的使用保持不变,尽管现在有超过 1GB 的可用内存。
答案1
好吧,问题毕竟解决了。这只是一些 Windows 调整和一些 Firebird 调整。
在 Windows 方面,setcache 确实在控制文件系统缓存的大小方面发挥了作用,即使微软说我不需要这个。我刚刚添加了一个在每次启动时运行的计划任务。
但即使降低了内存使用量,我的 firebird 数据库仍然使用了双四核处理器的 12.5%:一个核心的 100%,而且性能很差(从只有 10 个元组的表中选择所有元组需要 30 秒)。
在使用 sinática (www.sinatica.com) 进行一些监控之后,我意识到我的数据库正在进行清理。因此我禁用了自动清理并添加了另一个计划任务以每 2 天进行一次清理。
答案2
以下是该问题的最新消息(希望有帮助):
http://dyemanov.blogspot.com.br/2012/03/firebird-vs-windows-file-system-caching.html
因此,唯一有效的解决方案似乎是禁用用于创建/打开文件的 Windows API 调用中的随机访问请求(即删除 FILE_FLAG_RANDOM_ACCESS 标志)。此外,在这种情况下,文件系统缓存大小限制不再是实际的,因为 Windows 不会将缓存扩展到合理范围之外。
...
该解决方案已提交到 Firebird 2.1.5、Firebird 2.5.2 和 Firebird 3.0 分支。
答案3
可以使用 Microsoft DynCache 工具缓解此问题。如果您无法将 FireBird 服务器更改为没有缓存错误的版本(例如,使用需要停产版本的软件等),则此解决方法适用。
由于 DynCache 很难获取和正确设置,请参阅此处的使用说明: http://sqlblogcasts.com/blogs/grumpyolddba/archive/2009/03/18/x64-memory-problems.aspx
答案4
看起来这会带你走向正确的方向 -http://www.firebirdfaq.org/faq333/。