MSSQLSERVER_17890

适用范围:SQL Server

详细信息

Attribute
产品名称 SQL Server
事件 ID 17890
事件来源 MSSQLSERVER
组件 SQLEngine
符号名称 SRV_WS_TRIMMED
消息正文 SQL Server 进程内存的一个重要部分已分页。这可能会导致性能下降。 持续时间: %d 秒。 工作集 (KB): %I64d,已提交 (KB): %I64d,内存使用率: %d%%。

说明

SQL Server 错误日志或 Windows 应用程序事件日志中可能会遇到以下错误消息。

SQL Server 进程内存的一个重要部分已分页。这可能会导致性能下降。 持续时间:0 秒。 工作集(KB):3383250已提交(KB):9112480内存利用率:37%。

你还可能会注意到,SQL Server 上的查询执行和所有其他操作的性能突然降低。

原因

SQL Server 监视有关 SQL Server 进程的各种内存相关信息。 在这种情况下,它检测到进程的工作集小于已提交的进程内存的 50%。 因此会打印此警告。 此警告的正常原因如下:

  • 操作系统会将大部分 SQL Server 提交内存分页到分页文件。
  • 这可能是由于其他应用程序或操作系统突然增加了对内存的需求。
  • 当某些设备驱动程序请求按需求进行连续内存分配时,也会发生这种情况。

用户操作

可以通过锁定为物理内存中缓冲池分配的内存来防止 Windows 操作系统分页 SQL Server 进程的缓冲池内存。 通过将内存中的锁页分配给用作 SQL Server 服务的启动帐户的用户帐户,可以锁定内存。 但在实现此解决方案之前,请先查看 SQL Server 内存分页的原因和重要注意事项,然后再为 SQL Server 实例分配“锁定内存页”用户权限

注意

使用内存中的锁页可确保 SQL Server 管理的内存不会分页。但是,线程堆栈、EXE 和任何 DLL 映像、堆内存、CLR 内存仍可由 OS 分页。

从 SQL Server 2008 SP1 累积更新 2 开始,SQL Server Standard 和 Enterprise 版本都可以使用内存用户权限中的锁定页。 有关对锁定页面的支持的详细信息,请查看 KB970070 - 对 SQL Server Standard Edition(64 位)系统上锁定页面的支持

若要分配“锁定内存页”用户权限,请执行以下步骤:

  1. 依次单击“开始”、“运行”,键入 gpedit.msc,然后单击“确定”
  2. 请注意,将显示“组策略”对话框。
  3. 依次展开“计算机配置”和“Windows 设置”
  4. 展开 “安全设置”,再展开 “本地策略”
  5. 单击“用户权限分配”,然后双击“锁定内存页”
  6. 在“本地安全策略设置”对话框中,单击“添加用户”或“组”
  7. 在“选择用户”或“组”对话框中,添加有权运行 Sqlservr.exe 文件的帐户,然后单击“确定”
  8. 将关闭“组策略”对话框。
  9. 重新启动 SQL Server 服务。

在内存用户中分配锁定页并重新启动 SQL Server 服务后,Windows 操作系统不再在 SQL Server 进程中分页缓冲池内存。 但是,Windows 操作系统仍可在 SQL Server 进程中分页显示非缓冲区池内存。

可以通过确保在启动时在 SQL Server 错误日志中写入以下消息,验证 SQL Server 实例是否使用了用户权限:“对缓冲池使用锁定的页面”

此消息仅适用于 SQL Server。 有关 ERRORLOG 中此消息的详细信息,请访问以下内容: 是否必须在本地系统中为“内存”权限分配锁页

当 Windows 操作系统页对非缓冲池内存进行分页时,你可能仍会遇到性能问题。 但是,“说明”部分中提到的错误消息不会记录在 SQL Server 错误日志中。

导致 SQL Server 内存分页的原因

有三种类别的问题会导致此问题:

  • 应用程序相关问题:所有应用程序一起耗尽了可用的物理内存,OS 必须释放一些内存,才能为资源的新应用程序请求释放一些内存。 通常情况下,这里的方法是找出哪些应用程序正在耗尽内存,并采取必要步骤平衡它们之间的内存,而不导致 RAM 耗尽。
  • 设备驱动程序问题:如果驱动程序调用内存分配函数错误,则设备驱动程序可能会导致所有进程的工作集分页。
  • 操作系统问题

可以在下面找到有关每个类别的信息

  • 应用程序相关问题:应用程序在一起可能会占用系统上的所有 RAM。 如果有新的内存请求,则 OS 会尝试满足这些请求,如果没有可用内存,它将修整正在运行的应用程序的工作集以满足内存请求。 在这种情况下,你可能会注意到大多数(如果不是所有)应用程序的工作集都显著下降。 为此,请为系统上的所有应用程序收集以下性能监视器计数器:

    • 性能对象:进程
    • 计数器:工作集

    此外,监视以下计数器以关联系统上可用的物理内存量。

    • 性能对象:内存
    • 计数器:可用内存(MB)

    你可能观察到的典型行为是:可用内存减少到接近 0 MB,同时系统上大多数(所有)进程的工作集计数器骤降。 如果观察到此类行为,则可能需要采取措施来减少系统上的内存使用量,例如减少 SQL Server 的最大服务器内存。

    应用程序也可能占用过多系统缓存,从而导致系统缓存大量增长。 为了响应系统缓存的增长,系统会分页显示 SQL Server 进程或其他应用程序的工作集。 如果遇到此问题,你可以在应用程序中使用一些内存管理函数。 这些函数控制文件 I/O 操作可在应用程序中使用的系统缓存空间。 例如,你可以使用 SetSystemFileCacheSize 函数和 GetSystemFileCacheSize 函数来控制文件 I/O 操作可以使用的系统缓存空间。

    可以使用内存性能对象来查看此对象中各种计数器的值,以确定系统缓存工作集是否占用太多内存。 例如,可以查看缓存字节和系统缓存驻留字节数计数器。 有关此主题的详细信息,请参阅:

    可以下载并部署“Microsoft Windows 动态缓存服务”来控制系统缓存使用的内存。

  • 设备驱动程序问题:如果设备驱动程序使用 MmAllocateContiguousMemory 函数,并且如果将 HighestAcceptableAddress 参数的值设置为小于 4 GB(GB),则 Windows 操作系统可能会分页显示系统上的进程(包括 SQL Server 进程)的工作集。 若要解决此问题,请与设备驱动程序的供应商联系以获取驱动程序更新。

    当设备驱动程序尝试分配内存,Windows 操作系统可能会将其他应用程序的工作集分页。 利用此 Windows 修补程序,你可以使用事件跟踪查找导致问题的设备驱动程序。 若要查找有关导致工作集修整行为的特定驱动程序的详细信息,请参阅识别分配连续内存的驱动程序

  • 操作系统问题:若要解决导致 Windows 操作系统分页显示 SQL Server 进程工作集的已知问题,请应用以下Microsoft知识库文章中所述的修补程序。

    注意

    修补程序是累积的。 修补程序的更高版本包含该修补程序的早期版本。

分配“锁定内存页”用户权限之前需要注意的重要事项

在分配“锁定内存页”用户权限之前,还应考虑其他问题。 如果在配置不正确的系统上分配此用户权限,则系统可能会变得不稳定或者降低整个系统的性能。 此外,事件日志中可能会记录事件 ID 333。

如果与Microsoft客户支持服务(CSS)联系,则 CSS 工程师可能会要求你撤销用作 SQL Server 服务的启动帐户的用户帐户的此用户权限。 此步骤可能需要收集 CSS 工程师可用于为 SQL Server 和系统上运行的其他应用程序所需的各种选项配置的重要性能数据。 CSS 工程师收集性能数据后,可以将内存中的锁页分配给 SQL Server 服务的启动帐户。

在分配“锁定内存页”用户权限之前,请确保捕获性能监视器日志来确定系统上安装的各种应用程序和服务的内存需求。 这些应用程序还包括 SQL Server。 要确定内存需求,请收集以下基线信息:

  • 请确保正确设置最大服务器内存选项和最小服务器内存选项。 这些选项仅反映 SQL Server 进程的缓冲池的内存要求。 这些选项不包括为 SQL Server 进程中的其他组件分配的内存。 这些组件包括以下各项:

    • SQL Server 工作线程
    • SQL Server 进程在 SQL Server 进程的地址空间内加载的各种 DLL 和组件
    • 备份和还原操作
  • DLL 和组件包括各种 OLE DB 提供程序、扩展存储过程、Microsoft COM 对象,这些对象用于sp_OACreate存储过程、链接服务器和 SQL Server CLR。 为这些组件分配的内存位于 SQL Server 进程的地址空间的非缓冲区池区域下。 理想情况下,若要确定整个 SQL Server 进程可以使用的最大内存量,必须减去为不使用缓冲池的组件分配的内存,而不是希望 SQL Server 进程使用的总内存。 然后,可以使用余数值设置最大服务器内存选项。 在设置最大服务器内存选项和最小服务器内存选项之前,应仔细查看 SQL Server 联机丛书中的“手动设置内存选项”主题。

  • 确定其他应用程序和 Windows 操作系统组件的内存需求。 应用程序可能包括其他 SQL Server 组件,例如,SQL Server 代理、SQL Server 复制代理、SQL Server Reporting Services、SQL Server Analysis Services、SQL Server Integration Services 和 SQL Server 全文搜索。 执行备份操作和文件复制操作的应用程序可能会使用大量内存。 考虑大容量复制和生成文件 IO 的快照代理等操作。 确定最大服务器内存选项的值和最小服务器内存选项的值时,必须考虑所有这些应用程序的内存需求。 可以在每个进程的进程对象下使用专用字节计数器和工作集计数器来确定特定进程的内存需求。

  • 默认情况下,已将“锁定内存页”用户权限分配给内置的本地系统帐户。 有关详细信息,请访问以下Microsoft网站: 是否必须为本地系统分配“内存”权限中的锁定页?

  • 如果全局对域中的所有 SQL Server 进程使用 Windows 用户帐户,请确定使用组策略配置分配的用户权限。 32 位 SQL Server 进程可以使用此帐户作为启动帐户。 但是,此帐户需要“锁定内存页”用户权限才能启用 Address Windowing Extensions (AWE) 功能。 有关详细信息,请参阅 SQL Server 联机丛书中的“向 SQL Server 提供最大内存量”主题。

  • 在为多个 SQL Server 实例配置最大服务器内存选项和最小服务器内存选项之前,请考虑每个 SQL Server 实例的非缓冲区池的内存要求。 然后,为每个 SQL Server 实例配置这些选项。

理想情况下,你可以在负峰值负载期间收集此基准信息。 因此,你可以确定各个应用程序和组件的内存要求,以支持峰值负载。 内存要求因系统而异,这取决于系统上运行的活动和应用程序。 你可以查询动态管理视图 sys.dm_os_process_memory 中提供的信息,以了解系统是否遇到内存不足的情况。 有关详细信息,请参阅 sys.dm_os_process_memory (Transact-SQL)

Windows Server 2008 和 R2 版本中的新增改进

Windows Server 2008 和 Windows Server 2008 R2 改进了连续内存分配机制。 这种改进使得 Windows Server 2008 和 Windows Server 2008 R2 在一定程度上减少了在收到新内存请求时对应用程序工作集分页的影响。

下面是来自 Microsoft 白皮书“Windows 中的内存管理改进”的改进说明:

在 Windows Server 2008 中,大大增强了物理连续内存的分配。 分配连续内存的请求更有可能成功,因为内存管理器现在会动态替换页面,通常不需要修整工作集或执行 I/O 操作。 此外,许多其他类型的页面(如内核堆栈和文件系统元数据页等)现在都是替换的候选页面。 因此,在任何给定时间,都可以使用更多的连续内存。 此外,获得此类分配的成本显著降低。

有关详细信息,请查看 SQL Server 工作集修整问题

本文中提到的第三方产品由 Microsoft 以外的其他公司提供。 Microsoft 不对这些产品的性能或可靠性提供任何明示或暗示性担保。