[翻译]SQL Server 工作集消息
Q:我发现有指向工作集(SQL Server保留内存区域)被分页出来相关的消息:
重要部分的 SQL 服务器进程内存已被分页。这可能导致性能下降。持续时间: 0 秒。 工作集 (KB): 2484,已提交 (KB): 48036,内存使用比率: 50%。
有什么原因可能导致这个问题?
A:
工作集调整分为以下几种:
1. 信号调整
低物理内存事件提醒事件是由操作系统设置的(参考:QueryMemoryResourceNotification<http://msdn2.microsoft.com/en-us/library/aa366799.aspx>),当物理内存低下时会出现。SQL Server资源监视器,Lazy writer和其他进程占用BPool内存部分。它会将物理内存返回给系统,然后降低SQL Server的工作集。当该事件产生时,sys.dm_os_ring_buffer和RING_BUFFER_RESOURCE_MONITOR的记录会被写入日志。这是SQL Server要保留预留内存的正常行为。该行为不会被写入错误日志信息。
2. 自调整
操作系统在新申请一个页的时候遇到了页错误,判断为物理内存不足。例如,如果SQL Server为一个栈,连接服务器或其他应用程序申请页,发现内存不足,会直接调整SQL Server的工作集。
3. 硬调整
当系统内存严重不足的时候,会发生硬调整。该行为会直接把SQL Server所有的工作集和其他进程分页出来。
除了信号调整之外,自调整和硬调整都会写错误日志,导致性能问题。
基本查错步骤:
1. 确认没有其他进程快速吃完了内存。查看方法是监测内存:_Total工作集这个性能计数器。如果您启用了一个快速消耗内存的应用程序,工作集会被快速地调整,但_Total会保持不变。如果_Total快速下降,那么这就说明不是某个应用程序吃光了内存,而是发生了MiEmptyWorkingSet或MmAllocateContigiousMemory发生了,然后操作系统决定进行硬调整。
2. 确认SQL Server进程ID在发生问题的时间段一直存在。如果SQL Server服务有被重启过计数器可能会产生容易误导的数据。
3. 确认您的系统的驱动是最新的。驱动也可能会造成调整。
4. 确认操作系统终端服务的bug不是导致该问题的原因:http://support.microsoft.com/default.aspx?scid=kb;EN-US;905865
5. 抓取完整的性能计数器,和SQL Server的sys.dm_os_ring_buffers。
6. 应用操作系统补丁:http://support.microsoft.com/default.aspx?scid=kb;EN-US;920739
7. 应用操作系统补丁:http://support.microsoft.com/default.aspx?scid=kb;EN-US;931308
8. 应用SQL Server 2005 SP3。