我在运行 SQL Server 2008 R2 和 IIS7 的虚拟机中安装了 Windows 7 64 位。服务器本身有 12 GB 内存,配备双核英特尔至强 @ 2.50 GHz。
问题(我还不太确定这是否是个问题)是任务管理器不断显示正在使用 8.50 GB,但实际上没有任何进程消耗这么多内存。
我看了看这问题是关于 sql 锁定页面分配内存。但我发现这些值是正常的 - 大约 85 mb。以下是命令的屏幕截图
select * from sys.dms_os_process_memorys
但是根据上图,我还看到total_virtual_space_kb
大约 8.50 GB。最后,我运行了 RamMap,它显示大约有 8.50 GB 正在使用中“驱动程序已锁定”. 其他地方有人提出这个“驱动程序锁定”内存正在被 VMWare 使用。
我有几个问题:
1) 这些内存真的被消耗了吗?还是会在需要时释放给另一个进程?我注意到服务器明显很慢,所以我想知道这是否与此有关。此外,我OutOfMemoryExceptions
的 asp.net 进程经常会抛出这个问题。
2) 谁在分配/使用这些内存?SQL 还是 VMWare?
3)有什么办法可以解决这个问题吗?
任何帮助都将受到赞赏。
答案1
我怀疑这是虚拟机管理程序 (ESX/i)“气球”驱动程序发挥作用的结果。气球驱动程序通过 VMware 工具工作,从客户操作系统请求一定数量的内存,但实际上不在客户操作系统中使用它。这允许虚拟机管理程序在其他地方使用内存。
由于多种原因,膨胀通常是一件好事,但对于 MSSQL 来说,它往往会有点麻烦,因为 SQL 引擎本身非常擅长内存管理。
这里有一些关于此问题的更多信息,可能比我能解释得更好:
答案2
请检查所有虚拟机的内存预留设置。应将其设置为无限制或设置为服务器上设置的最大内存。
转到 vm 设置,选项卡资源。选择内存并检查限制。
答案3
作为最佳实践,SQL Server 必须首先限制内存使用量。查看 SQL Server 真正需要多少内存的最佳方法是使用 perfmon:
在降低最大服务器内存值之前,请使用性能监视器检查负载下的 SQLServer:Buffer Manager 性能对象,并记下被盗页面和保留页面计数器的当前值。这些计数器将内存报告为 8K 页面的数量。最大服务器内存应设置为高于这两个值的总和,以避免内存不足错误。最低合理最大服务器内存设置的近似值(以 MB 为单位)为 ([被盗页面] + [保留页面])/ 100
来源:TechNet(http://technet.microsoft.com/en-gb/library/ms178067(SQL.90).aspx)