rbh*_*hat 3 windows memory memory-usage sql-server windows-server-2019
我们有 Windows Server 2019 Standard (x64),内存为 64GB。
下面的屏幕截图显示了SQL Server Windows NT运行时的内存使用率为 96% ,并且使用了 344.5 MB。
这是停止SQL Server Windows NT服务后的任务管理器。内存使用率下降至 8%。
我再次启动SQL Server Windows NT服务。任务管理器非常低,为 9%,但 Sql 服务器现在使用的内存比内存使用率为 96% 时更多。

两个问题:
这里遗漏了一个重要的细节:任务管理器显示 SQL Server 仅使用 344.5 MB RAM,但它实际上保留了更多(几乎全部)供自己使用。任务管理器不会显示此内容。任务管理器中的数字实际上并没有达到系统内存的 97%,因为那里没有显示保留内存。
您假设几乎所有内存都被其他东西用完了,因此 SQL Server 无法使用超过 344.5 MB 的内存,这是完全错误的。它不是这样工作的。任务管理器可能会产生很大的误导,请查看实际的性能计数器。
SQL Server在设计上将数据缓存在内存中,随着时间的推移,它将耗尽系统中几乎所有的可用内存;但是这个内存并没有显示在任务管理器中(或者至少不是全部),因为 SQL Server 试图表现得很好并告诉操作系统“我想要这么多内存,但它只是用于缓存,没有它我也能生存,因此,如果需要,请随时回收它”。这意味着任务管理器显示 SQL Server 使用的内存比实际保留的内存少得多。
这绝不是一个问题;这是有意而为之的。您看到的“问题”并不存在,只是您在任务管理器中看到的内容具有误导性。
如果您停止 SQL Server,它当然会释放所有已分配的内存,包括任务管理器中显示的内存和未显示的内存(更多)。当您再次启动它时,它将使用很少的内存:随着 SQL Server 将数据加载到内存中并对其进行缓存,使用量将随着时间的推移再次增长。但大部分内存不会显示在任务管理器中,因为该特定工具无法看到它。
我还要补充一点,如果 SQL Server 确实需要内存,它会以不同的方式分配它,然后任务管理器会显示它;如果 SQL Server 确实需要那么多内存,那么您会看到 SQL Server 使用了 60 GB 内存,而不是仅将其用于缓存。
你在这台机器上运行 SQL Server,所以它正在做 SQL Server 所做的事情 - 它保留操作系统上(几乎)所有可用的内存,这样当它进行大查询或其他操作时,它就不必分配 RAM ,它已经有了。
你有几个选择。
我绝对不会选择选项 2,除非 SQL 永远不会使用它占用的 RAM。只有在测量操作系统级 SQL 性能计数器和 SQL 级动态管理视图时您才会知道这一点。
从大局来看,您实际上想解决什么问题?在这种情况下,“释放内存”是一项毫无意义的任务,除非您知道您正在将其释放以供其他用途使用。您是否遇到 SQL 性能问题?如果是,您如何确定您的瓶颈是 RAM,而不是糟糕的索引设计或未优化的查询?
我引导您使用适当的监控来诊断性能问题。为此,您需要了解大量有关 SQL 的知识和相当多的有关 Windows 的知识。如果您不是 DBA,请雇用一名 DBA 或签订合同,或者与您的软件供应商合作(如果这是针对已购买产品的 SQL)。如果这是你的公司在没有 DBA 的情况下自己编写的东西,那就去找一个吧。
默认情况下,随着时间的推移,SQL Server 实例可能会消耗服务器中大部分可用的 Windows 操作系统内存。一旦获取内存,除非检测到内存压力,否则不会释放。这是设计使然,并不表示 SQL Server 进程中存在内存泄漏。
/根据您的编辑进行编辑:
虽然我不是系统管理员,但在我看来,sql server 占用的内存很少,因为其他所有内容都被 Windows 消耗了。
你在这里几乎肯定是错的。正如我上面提到的,随着时间的推移,SQL Server 将分配几乎所有的系统 RAM。sqlserver.exe 进程使用的 RAM 量并不能告诉您 SQL 实际分配了多少 RAM。DMV 和性能计数器会告诉您这一点。
我使用 SSMS 来处理数据库,我直接注意到一切都很慢。即使是简单的事情,例如打开表格窗格来查看我的所有表格,也需要一段时间,有时甚至会超时。
不要在 SQL 服务器上运行它,而是从您的工作站运行它。
| 归档时间: |
|
| 查看次数: |
13516 次 |
| 最近记录: |