我想知道为什么 SQL Server 不使用所有可用内存 - 当我很确定存在内存瓶颈时 100%。例如,我管理的一台服务器开始使用 91% 的内存,然后逐渐增加到 98 但不是 100。在 23:00 重新启动后增加趋势如下:
- 重启后58%,整晚达到79%。我想这应该是由于采取了隔夜备份。
- 次日 11:00 前 82%。
- 12:00 前 90%
- 全天稳定趋势,直到 23:00 内存利用率增加到 93%
- 第二天早上 08:00 95%
- 97% 在 17:00
- 98% 第二天 14:00 并留在那里。
什么可能导致这 2% 未被使用?Windows O / S是否有可能阻止它?如果是这样,我如何证明 Windows 确实将其保留给自己?
我指的是服务器的整体内存使用情况——即操作系统。最大内存配置已设置为远远超出服务器的当前内存。我手头有一个用于跟踪内存利用率的监控工具。
服务器的内存利用率不低于也不高于 98%。这是一个专用的、单实例、两个数据库 SQL Server,没有其他服务、应用程序等在其上运行。SQL Server 可能正在使用大部分分配的内存——即 98%——但我的问题是它为什么不使用剩下的 2%?我不确定我在质疑那 2% 时是否变得过于暴躁?
感谢在监视器内存使用情况中确定当前内存分配的查询,我确认 Memory_usedby_Sqlserver_GB 是 64 GB 总 RAM 中的 60。我无法在 DMV 的输出中找到列和总 RAM (可能是由于 SQL Server 2008 R2),但我可以确认它是一个 64 GB 的服务器,并且最大。服务器内存设置为 2147483647 MB。max server memory
sys.dm_os_process_memory
我不知道我的服务器将它们放入插槽后是否会使用任何额外的内存。我试图证明服务器是否需要更多内存,(如果需要)将使用它,从而有理由推动购买。如果购买了内存并且内存利用率没有增加并保持其当前状态 - 60 GB,我将处于尴尬的境地。在将服务器的内存从 64 GB 增加到 128 GB 后看到 60 GB 的 RAM 被使用将是浪费金钱。我想在事前确定服务器是否会从新的额外 RAM 中受益或无动于衷。
一切都需要内存,包括操作系统,就像 SQL Server 一样。操作系统可以从 SQL Server 中删除内存,除非您碰巧在 SQL Server 的内存权限中锁定了页面。但是,即使这样,操作系统也总是会赢得以保持自身运行,因此如果它需要内存,它将迫使 SQL Server 放弃它。
同样,仅仅因为 SQL Server 提取了 98% 的内存并不一定意味着它正在使用它。您必须深入研究 SQL Server 本身的内存使用情况才能知道它在做什么。它会保留它,直到操作系统强制或以一种很好的方式请求它。
我还要注意,您不应该将最大内存设置为“远远超出服务器当前内存”的容量。SQL Server 认为它可以获取比实际更多的内存可能会导致性能问题。最大内存只是缓冲池限制,这不包括抢内存的 SQL Server 进程的其他区域。所以最好保持最大内存较低,以便 SQL Server 的操作系统和其他进程有一些。
要深入了解性能,请使用 Perfmon、DVM、您的监控工具(如果它包括 SQL Server 监控)。
指定最大内存:我基于操作系统,但您还必须考虑服务器上运行的其他内容。您是否正在运行 SQL Server 的其他组件(SSIS、SSAS、SSRS)?您是否有任何用于监控或安全目的的代理?举个例子,对我来说,Window Server 2012 R2 的基本价值是让操作系统保留 6GB 的 RAM,而其他一切都交给 SQL Server。
请参阅产品文档中的监控内存使用情况。
根据Shanky和Shawn Melton的问题评论生成的社区 Wiki 答案
在服务器上的 64 GB 中,SQL Server 使用 60 GB,其余 (4 GB) 由操作系统使用。这很简单。由于您没有设置
max server memory
,它也可以使用 61 GB,也可以减少到 58 GB。这是自动管理的。我在这里没有看到任何问题。请参阅SQL Server 2008:SQL Server 应在 8GB RAM 服务器中使用多少 RAM 内存?当您添加更多 RAM 并设置
max server memory
时,SQL Server 将尝试使用它并且可能会这样做。SQL Server 是内存不足的,它将占用内存并缓存对象。如果您授予 SQL Server 访问内存,则将始终使用内存,但如果代码是问题所在(为什么要使用这么多?),这并不能解决整体性能问题。只是解决问题的创可贴方法。如果你有 70GB 的数据,SQL Server 会在某些时候尝试将所有 70GB 拉入内存,因为有东西试图访问它。