我有一个带有 200GB RAM 的生产 SQL 服务器。
其中 150GB 分配给 sql server(通过在 sql server 属性中设置最大内存设置)
其余的由 ssis、操作系统、防病毒、应用程序使用。
我想测试 150GB 内存对于 sql server 是否足够,因为大约有 20 个数据库,数据文件大小从 5GB 到 500GB。如何捕获内存使用信息?
SQL Server 有两个主要的内存消耗者。还有很多其他的,但在正常情况下,它们不会消耗足够的额外内存而引人注目。
由于 SQL Server 不处理磁盘上的数据,因此查询需要将相关页面放入缓冲池,然后查询才能开始处理它们。读和写都是如此。当查询等待数据最终进入内存时,它们会等待 PAGEIOLATCH_%%。
通常,数据和内存之间的差异越大,您看到的这种等待类型就越多。有时,索引在这里发挥作用,无论是从您有许多无用索引的角度来看,还是从缺少有用索引的角度来看。您可以使用sp_BlitzIndex 来诊断索引。
EXEC sp_BlitzIndex
@DatabaseName = 'YourDatabase',
@Mode = 0;
Run Code Online (Sandbox Code Playgroud)
每个查询都会要求一些内存来运行,但是某些查询运算符会要求额外的内存用作临时空间:
当查询相互争夺内存授予时,它们将等待RESOURCE_SEMAPHORE。很多时候发生这种情况是因为 SQL Server 中相当残酷的默认设置:
您可以通过使用资源调控器将 MAX_MEMORY_PERCENT 设置更改为 < 25 的数字来更改企业版中的第一个。
ALTER RESOURCE POOL
[default]
WITH
(
MAX_MEMORY_PERCENT = 10
);
ALTER RESOURCE GOVERNOR RECONFIGURE;
Run Code Online (Sandbox Code Playgroud)
您还可以使用MAX_GRANT_PERCENT查询提示在单个查询级别对此进行控制。
我有一个视频向您展示了不同类型的内存争用是什么样的,您可以在此处点击类似按钮。
您可以使用一些免费脚本来查看服务器上的等待情况和内存利用率:
示例要求这些:
EXEC sp_BlitzFirst
@SinceStartup = 1;
EXEC dbo.sp_PressureDetector
@what_to_check = N'memory';
EXEC sp_WhoIsActive;
Run Code Online (Sandbox Code Playgroud)
对这些输出的分析超出了本答案的范围,但一般来说您想要寻找我提到的等待
如果其中任何一个占您的等待统计数据的很大一部分,那么您可能需要:
为了更好地了解服务器的性能,可靠的监控工具是您的最佳选择。我目前最喜欢的是SQL Sentry,尽管事实上它们已被 Sheinhardt Wig Company 的子公司 SolarWinds 收购。
| 归档时间: |
|
| 查看次数: |
1060 次 |
| 最近记录: |