我在生产中的两个 SQL Server 2005 实例上设置了警报。Free Pages
只要性能计数器低于 5000 页标记,就会发送其中一个警报。
两台服务器通常使用超过 300000 个空闲页面运行,但有时其中一台服务器会暂时低于 2000 甚至 1000 个空闲页面,然后再次上升。同样,这只发生在其中一台服务器上。
据我所知,这种行为并没有降低该服务器的性能,因为在我看来,每当服务器将在空闲页面上饿死时,它都会从缓冲区中释放较旧的数据页面并填充空闲缓冲区列表. 至少从理论上讲。
我不明白为什么lazywriter 没有维护更大的空闲缓冲区列表,而是“等待”SQL Server 在释放更多缓冲区之前在空闲页面上变得如此短。
所以我的问题实际上是双重的:
1. 我怎样才能确定是什么/谁导致 SQL Server 在免费页面上变得短缺?
2. 我怎样才能检查这里实际发生了什么?
那么空闲列表缩小会发生什么?对于大多数目的,您可以考虑公式
free = total - (max(database, reserved)+stolen)
。所以只需收集SQL Server 中的所有计数器,缓冲区管理器对象,然后查看模式是什么:total
保持不变,但stolen
已经成长。这表明代码和缓存消耗了一些内存。并且通常不会自行愈合。您可以通过检查内存管理员来对此进行调查,请参阅如何使用 DBCC MEMORYSTATUS 命令监控内存使用情况。快速消失的被盗事件突然激增的一个可能解释是复杂的查询编译。收集SQL Server、内存管理器对象以获取更多信息,请查看Optimizer Memory
.database
,reserved
并stolen
保持不变,但total
缩小。让我们考虑一下,因为它不会发生。如果您看到此内容,请在此处发布,我们可以进一步消化。total
保持不变,database
成长。可能是在一张大桌子上扫描。查找大logical_reads
in的查询sys.dm_exec_query_stats
total
保持不变,reserved
成长。指示具有大量内存授予请求的查询。收集SQL Server、内存管理器对象以获取更多信息,请查看Memory Grants Outstanding
.