监视内存使用量

适用范围:SQL Server

定期监视 SQL Server 实例以确认内存使用量在正常范围内。

配置 SQL Server 最大内存

默认情况下,SQL Server 实例可能会随时间推移消耗服务器中大多数可用的 Windows作系统内存。 获取内存后,除非检测到内存压力,否则将不会释放内存。 这是设计上的,并不指示 SQL Server 进程中的内存泄漏。 使用“最大服务器内存”选项以限制 SQL Server 在大多数情况下可获取的内存大小。 有关详细信息,请参阅内存管理体系结构指南

在Linux 上的 SQL Server中,使用工具和 mssql-conf设置内存限制

监视操作系统内存

若要监视内存不足的情况,请使用下列 Windows Server 计数器。 许多操作系统内存计数器都可通过动态管理视图 sys.dm_os_process_memorysys.dm_os_sys_memory 进行查询。

  • 内存:可用字节数 此计数器指示进程当前可用的内存字节数。 Available Bytes 计数器的低值可指示操作系统内存总体不足。 此值可通过 T-SQL 使用 sys.dm_os_sys_memory.available_physical_memory_kb 进行查询。

  • 内存:每秒页数 此计数器指示因硬页故障而从磁盘读取的页数,或因页故障为释放工作集空间而写入磁盘的页数。 Pages/sec 计数器的比率高表示分页过多。

  • Memory: Page Faults/sec 此计数器指示所有进程(包括系统进程)的页错误率。 即使计算机有充足的可用内存,分页到磁盘的速率较低但并非为零(因此也会发生页错误)也是典型现象。 Microsoft Windows 虚拟内存管理器 (VMM) 在剪裁 SQL Server 和其他进程的工作集大小时会收走这些进程的页。 此 VMM 活动往往会导致页故障。

  • Process: Page Faults/sec 此计数器指示给定用户进程的页错误率。 监视 Process: Page Faults/sec,以确定磁盘活动是否由 SQL Server 分页导致。 要确定导致过多分页的是 SQL Server 还是其他进程,请监视 SQL Server 进程实例的 Process: Page Faults/sec 计数器。

有关如何解决分页过多的详细信息,请参阅操作系统文档。

隔离由 SQL Server 使用的内存

若要监视 SQL Server 内存使用情况,请使用以下 使用 SQL Server 对象。 许多 SQL Server 对象计数器都可通过动态管理视图 sys.dm_os_performance_counterssys.dm_os_process_memory 进行查询。

默认情况下,SQL Server 根据可用的系统资源动态管理其内存要求。 如果 SQL Server 需要更多内存,则会查询操作系统以确定是否有可用的空闲物理内存,然后使用可用内存。 如果 OS 的可用内存不足,则 SQL Server 会将内存释放回作系统,直到缓解内存不足的情况,或 SQL Server 达到 最小服务器内存 限制为止。 不过,您可以通过使用 min server memorymax server memory 服务器配置选项,覆盖动态使用内存的设置。 有关详细信息,请参阅 服务器内存配置选项

要监视 SQL Server 使用的内存大小,请检查下列性能计数器:

  • SQL Server:内存管理器:服务器内存总量(KB) 此计数器指示 SQL Server 内存管理器当前已提交到 SQL Server 的作系统内存量。 此数字预计会根据实际活动的需要增长,并且在 SQL Server 启动后将会增长。 使用 sys.dm_os_sys_info 动态管理视图查询此计数器,并查看 committed_kb 列。

  • SQL Server:内存管理器:目标服务器内存(KB) 此计数器指示根据最近的工作负荷,SQL Server 可能消耗的理想内存量。 在一段时间的典型操作后比较“总服务器内存”,以确定 SQL Server 是否分配了所需的内存大小。 典型操作后,“总服务器内存”和“目标服务器内存”应类似。 如果 总服务器内存 明显低于 目标服务器内存,则 SQL Server 实例可能会遇到内存压力。 在 SQL Server 启动后的一段时间内,随着“总服务器内存”的增长,“总服务器内存”预计会低于“目标服务器内存”。 通过 sys.dm_os_sys_info 动态管理视图查询此计数器,并查看 committed_target_kb 列。 有关配置内存的详细信息和最佳做法,请参阅服务器内存配置选项

  • 进程:工作集 此计数器根据作系统指示当前进程正在使用的物理内存量。 观察此计数器的 sqlservr.exe 实例。 使用 sys.dm_os_process_memory 动态管理视图查询此计数器,观察 physical_memory_in_use_kb 列。

  • 进程:专用字节 此计数器表示某个进程向操作系统请求供其自身使用的内存量。 观察此计数器的 sqlservr.exe 实例。 由于此计数器包含 sqlservr.exe 请求的所有内存分配(包括那些不受“最大服务器内存”选项限制的内存分配),因此,此计数器可报告大于“最大服务器内存”选项的值。

  • SQL Server:缓冲区管理器:数据库页 此计数器指示包含数据库内容的缓冲池中的页数。 不包括 SQL Server 进程中的其他非缓冲区池内存。 使用 sys.dm_os_performance_counters 动态管理视图查询此计数器。

  • SQL Server:缓冲区管理器:缓冲区缓存命中率 此计数器特定于 SQL Server。 需要 90 或更高的比率。 大于 90 的值表示内存中的数据缓存满足所有数据请求中 90% 以上的请求,无需从磁盘读取。 有关 SQL Server 缓冲区管理器的详细信息,请参阅 SQL Server Buffer Manager 对象。 使用 sys.dm_os_performance_counters 动态管理视图查询此计数器。

  • SQL Server:缓冲区管理器:页生存期 此计数器度量最旧页面保留在缓冲池中的时间(以秒为单位)。 对于使用 NUMA 体系结构的系统,这是所有 NUMA 节点的平均值。 此值会不断增加,越高越好。 突然下降表明数据在缓冲池中频繁进出,说明工作负载未能充分利用内存中已有的数据。 每个 NUMA 节点都有自己的缓冲池节点。 在具有多个 NUMA 节点的服务器上,使用 SQL Server: Buffer Node: Page life expectancy 来查看每个缓冲池的页生存期。 使用 sys.dm_os_performance_counters 动态管理视图查询此计数器。

示例

确定当前内存分配

以下查询返回有关当前分配内存的信息。

SELECT
(total_physical_memory_kb/1024) AS Total_OS_Memory_MB,
(available_physical_memory_kb/1024)  AS Available_OS_Memory_MB
FROM sys.dm_os_sys_memory;

SELECT
(physical_memory_in_use_kb/1024) AS Memory_used_by_Sqlserver_MB,
(locked_page_allocations_kb/1024) AS Locked_pages_used_by_Sqlserver_MB,
(total_virtual_address_space_kb/1024) AS Total_VAS_in_MB,
process_physical_memory_low,
process_virtual_memory_low
FROM sys.dm_os_process_memory;

确定当前的 SQL Server 内存利用率

以下查询返回有关当前 SQL Server 内存利用率的信息。

SELECT
sqlserver_start_time,
(committed_kb/1024) AS Total_Server_Memory_MB,
(committed_target_kb/1024)  AS Target_Server_Memory_MB
FROM sys.dm_os_sys_info;

确定页面预期寿命

下面的查询使用 sys.dm_os_performance_counters 来观察 SQL Server 实例当前在总体缓冲区管理器级别以及各个 NUMA 节点级别的 页生存期 值。

SELECT
CASE instance_name WHEN '' THEN 'Overall' ELSE instance_name END AS NUMA_Node, cntr_value AS PLE_s
FROM sys.dm_os_performance_counters
WHERE counter_name = 'Page life expectancy';