如何使用 DBCC MEMORYSTATUS 命令来监视 SQL Server 2005 中的内存使用情况

概要

本文讨论了 DBCC MEMORYSTATUS 命令的输出。 该命令通常用于诊断 Microsoft SQL Server 内存耗尽问题。

本文介绍输出的元素的内存管理器、 内存使用情况的摘要、 聚合内存信息、 缓冲区分配信息、 缓冲区池的信息,和过程高速缓存信息。有关全局内存对象、 有关查询内存对象、 优化,以及内存经纪人还介绍输出。

简介

DBCC MEMORYSTATUS 命令提供了 Microsoft SQL Server 的当前内存状态的快照。在 SQL Server 中的内存消耗问题进行故障排除或排除特定的内存不足错误,可以使用此命令的输出。(多出的内存错误自动打印错误日志中的此输出。Microsoft 客户支持服务还可能要求,运行此命令时在一个特定的支持事件过程中如果遇到错误,可能是与低内存条件相关联。

注意:性能监视器 (PerfMon) 和任务管理器不能说明内存正确如果启用地址窗口化扩展 (AWE) 支持。

本文介绍了一些可以从 DBCC MEMORYSTATUS 命令的输出中获取的数据。这篇文章的多个部分包括此处未介绍的专用实现详细信息。Microsoft 客户支持服务不会回答任何问题或提供有关含义的特定计数器超出本文中提供的信息的详细信息。

详细信息

重要:DBCC MEMORYSTATUS 命令旨在成为 Microsoft 客户支持服务的诊断工具。输出的格式和所提供的详细程度可能会有所 service pack 和产品版本之间的更改。DBCC MEMORYSTATUS 命令提供的功能可能会被以后的产品版本中的不同机制。因此,在以后的产品版本中,此命令可能不再起作用。之前该命令被更改或删除不会进行任何其他警告。因此,使用此命令的应用程序可能会中断且不发出警告。

DBCC MEMORYSTATUS 命令的输出已从 SQL Server 的早期版本。现在,则输出包含几个部分,在早期的产品版本中不可用。

内存管理器

输出的第一节是内存管理器。此部分显示了 SQL Server 的总内存消耗。 Memory Manager KB ------------------------------ --------------------
VM Reserved 1761400
VM Committed 1663556
AWE Allocated 0
Reserved Memory 1024
Reserved Memory In Use 0

(5 row(s) affected)
这一节中的元素如下所示︰

  • 虚拟机保留︰ 此值显示 SQL Server 保留的虚拟地址空间 (VAS) 的总数量。

  • 虚拟机已提交︰ 此值显示 SQL Server 已提交的 VAS 的总数量。提交的 VAS 已经与物理内存。

  • AWE 分配︰ 此值显示通过 AWE 机制在 32 位版本的 SQL Server 上分配的内存的总数量。或者,此值的显示在 64 位版本的产品使用锁定页面的内存的总数量。

  • 保留的内存︰ 此值显示为专用的管理员连接 (DAC) 保留的内存。


  • 使用保留内存︰ 此值显示正在使用保留的内存。

内存使用情况的摘要

内存管理器部分跟内存的每个节点的内存使用情况的摘要。在非统一内存访问 (NUMA) 启用系统中,都有相应的内存节点条目为每个硬件 NUMA 节点。在 SMP 系统中,将有一个单一的内存节点项。

注意:内存节点 ID 可能不对应硬件节点 id。 Memory node Id = 0 KB ------------------------------ --------------------
VM Reserved 1757304
VM Committed 1659612
AWE Allocated 0
MultiPage Allocator 10760
SinglePage Allocator 73832

(5 row(s) affected)
注意:这些值显示在此 NUMA 节点上正在运行的线程分配的内存。这些值不是 NUMA 节点的本地内存。

这一节中的元素如下所示︰

  • 虚拟机保留︰ 此值显示在此节点正在运行的线程保留 VAS。

  • 虚拟机已提交︰ 此值显示 VAS 提交的此节点运行的线程。

  • AWE 分配︰ 此值显示通过 AWE 机制在 32 位版本的产品分配的内存。或者,此值显示锁定的页上的 64 位版本的产品使用的内存的总数量。

    在 NUMA 启用系统中,此值可能不正确或负面。但是,内存管理器部分中的总体AWE 分配值是正确的值。若要跟踪单个 NUMA 节点分配的内存,使用SQL Server︰ 缓冲节点的性能对象。(有关详细信息,请参阅SQL Server 联机丛书。

  • 多页分配器︰ 此值显示在此节点正在运行的线程通过多页分配器分配的内存。此内存来自外部的缓冲池。

  • SinglePage 分配器︰ 此值显示在此节点正在运行的线程通过单页面分配器分配的内存。此内存是从缓冲池被盗。

注意:虚拟机保留值和内存中的所有节点上的VM 提交值的总和会略小于内存管理器部分中报告的相应值。

聚合的内存

下一节包含每个职员类型和每个 NUMA 节点聚合内存信息。对于 NUMA 启用系统,可能会看到类似于下面的输出。

注意:下表包含仅输出的一部分。
MEMORYCLERK_SQLGENERAL (node 0) KB ---------------------------------------------------------------- --------------------
VM Reserved 0
VM Committed 0
AWE Allocated 0
SM Reserved 0
SM Commited 0
SinglePage Allocator 592
MultiPage Allocator 2160

(7 row(s) affected)

MEMORYCLERK_SQLGENERAL (node 1) KB
---------------------------------------------------------------- --------------------
VM Reserved 0
VM Committed 0
AWE Allocated 0
SM Reserved 0
SM Commited 0
SinglePage Allocator 136
MultiPage Allocator 0

(7 row(s) affected)

MEMORYCLERK_SQLGENERAL (Total) KB
---------------------------------------------------------------- --------------------
VM Reserved 0
VM Committed 0
AWE Allocated 0
SM Reserved 0
SM Commited 0
SinglePage Allocator 728
MultiPage Allocator 2160

(7 row(s) affected)
注意:这些节点 Id 对应于正在运行 SQL Server 的计算机的 NUMA 节点配置。该节点 Id 包括在硬件 NUMA 节点或 SMP 系统上定义的可能的软件 NUMA 节点。若要查找每个节点的节点 Id 与 Cpu 之间的映射,查看事件 ID 号为 17152 的信息。当您启动 SQL Server 时,将在事件查看器应用程序日志中记录此事件。

对于 SMP 系统中,您将看到每个职员类型只有一个部分。本部分将类似于以下。 MEMORYCLERK_SQLGENERAL (Total) KB ---------------------------------------------------------------- --------------------
VM Reserved 0
VM Committed 0
AWE Allocated 0
SM Reserved 0
SM Commited 0
SinglePage Allocator 768
MultiPage Allocator 2160

(7 row(s) affected)
以下各节中的其他信息是关于共享内存︰

  • SM 保留︰ 此值显示保留这种使用内存映射文件 API 的所有职员的 VAS。此 API 被也称为共享的内存。

  • SM 承诺︰ 此值显示 VAS 提交的这种使用内存映射文件 API 的所有职员。



可以通过使用sys.dm_os_memory_clerks动态管理视图 (DMV) 获取内存中的所有节点的每个职员类型的摘要信息。若要执行此操作,请运行下面的查询︰

select type,
sum(virtual_memory_reserved_kb) as [VM Reserved],
sum(virtual_memory_committed_kb) as [VM Committed],
sum(awe_allocated_kb) as [AWE Allocated],
sum(shared_memory_reserved_kb) as [SM Reserved],
sum(shared_memory_committed_kb) as [SM Committed],
sum(multi_pages_kb) as [MultiPage Allocator],
sum(single_pages_kb) as [SinlgePage Allocator]
from
sys.dm_os_memory_clerks
group by type

缓冲区的分布

下一节显示在缓冲池中的 8 千字节 (KB) 缓冲区的分布。 Buffer Distribution Buffers ------------------------------ -----------
Stolen 553
Free 103
Cached 161
Database (clean) 1353
Database (dirty) 38
I/O 0
Latched 0

(7 row(s) affected)
这一节中的元素如下所示︰

  • Stolen: Stolen 内存描述服务器用于其他目的的 8 KB 缓冲区。这些缓冲区可作为通用的内存存储分配。服务器的不同组件使用这些缓冲区来存储在内部数据结构。惰性写入器进程不允许刷新 Stolen 缓冲区超出缓冲区池。

  • 自由︰ 此值显示提交当前未使用的缓冲区。这些缓冲区可以保存数据。或者,其他组件可能会请求这些缓冲区,然后将这些缓冲区标记为Stolen。

  • 高速缓存︰ 此值显示为各种高速缓存使用的缓冲区。

  • 数据库 (干净)︰ 此值显示数据库内容并且尚未修改的缓冲区。

  • 数据库 (脏)︰ 此值显示具有数据库的内容和已修改的缓冲区。这些缓冲区包含更改,必须刷新到磁盘。


  • I/O︰ 此值显示等待挂起的 I/O 操作的缓冲区。

  • Latched︰ 此值显示锁定缓冲区。线程将读取或修改网页的内容时,已被锁定缓冲区。从磁盘读取页时,也已锁定缓冲区或向磁盘写入。 锁闩用于维护物理页中的数据一致性,同时正对其进行读取或修改。锁用于维护逻辑和事务处理的一致性。

缓冲区池详细信息

可以通过使用sys.dm_os_buffer_descriptors DMV 获取缓冲区池缓冲区的数据库页的详细的信息。然后,您可以获取有关所使用的其他服务器用途使用sys.dm_os_memory_clerks DMV 的缓冲池页的详细的信息。

下一节列出关于缓冲区池以及其他信息的详细信息。 Buffer Counts Buffers ------------------------------ --------------------
Committed 1064
Target 17551
Hashed 345
Stolen Potential 121857
External Reservation 645
Min Free 64
Visible 17551
Available Paging File 451997

(8 row(s) affected)
这一节中的元素如下所示︰

  • 已提交︰ 此值显示提交的总缓冲区。提交的缓冲区具有与其关联的物理内存。已提交值是缓冲池中的当前大小。此值包括如果启用 AWE 支持分配的物理内存。

  • 目标︰ 此值显示目标大小的缓冲池。如果目标值大于已提交值,缓冲池在不断增加。如果目标值是小于已提交的值,收缩的缓冲池。

  • Hashed︰ 此值显示数据页和索引页存储在缓冲池中。

  • 被盗可能︰ 此值显示了可以从缓冲池被盗最多页数。

  • ExternalReservation︰ 此值显示已预留的查询将会执行排序操作或哈希操作的页面。这些页未失窃。

  • 最小可用︰ 此值显示的页面的缓冲池试图对可用的列表。

  • 可见性︰ 此值显示同时可见的缓冲区。这些缓冲区可以直接访问一次。此值是通常等于总缓冲区。但是,当启用 AWE 支持时,此值可能小于总缓冲区。

  • 可用的分页文件︰ 此值显示了可用于提交的内存。此值表示为 8 KB 缓冲区的数目。有关详细信息,请参阅 Windows API 文档中的""GlobalMemoryStatusEx 函数主题。

过程高速缓存

下一节介绍的过程高速缓存的构成。 Procedure Cache Value ------------------------------ -----------
TotalProcs 4
TotalPages 25
InUsePages 0

(3 row(s) affected)
这一节中的元素如下所示︰

  • TotalProcs︰ 此值显示目前在过程高速缓存中的缓存的对象总数。此值将与sys.dm_exec_cached_plans DMV 中的条目匹配。

    注意:由于此类信息的动态特性,匹配项可能不准确。您可以使用性能监视器来监视SQL Server︰ 计划高速缓存对象和sys.dm_exec_cached_plans DMV 的缓存对象,例如触发器、 过程和特殊对象的类型的详细信息。

  • TotalPages︰ 此值显示的累积页面,您必须将所有已缓存的对象存储在过程高速缓存。

  • InUsePages︰ 此值显示属于当前正在运行的过程的过程缓存中的页面。这些页不能放弃。

全局内存对象

下一节包含有关各种全局内存对象的信息。本节还包含多少内存的全局内存对象,请使用有关信息。 Global Memory Objects Buffers ------------------------------ --------------------
Resource 126
Locks 85
XDES 10
SETLS 2
SE Dataset Allocators 4
SubpDesc Allocators 2
SE SchemaManager 44
SQLCache 41
Replication 2
ServerGlobal 25
XP Global 2
SortTables 2

(12 row(s) affected)
这一节中的元素如下所示︰

  • 资源︰ 此值显示资源对象使用的内存。资源对象用于存储引擎和服务器范围内的各种结构。

  • 锁定︰ 此值显示的内存,则锁管理器使用。

  • XDES︰ 此值显示的内存,则事务管理器使用。

  • SETLS︰ 此值显示用于分配使用线程本地存储区的特定于存储引擎的每个线程结构的内存。

  • SE 数据集分配器︰ 此值显示了用于通过访问方法设置访问表的分配结构的内存。

  • SubpDesc 分配器︰ 此值显示了用于管理子过程并行查询、 备份操作,还原操作、 数据库操作、 文件操作、 镜像和异步游标的内存。这些子过程也称为是并行的进程。

  • SE SchemaManager︰ 此值显示架构管理器用于存储特定于存储引擎的元数据的内存。

  • SQLCache︰ 此值显示用来存储文本和特殊语句的预准备语句的内存。

  • 复制︰ 此值显示服务器使用内部复制子系统的内存。

  • ServerGlobal︰ 此值显示全局服务器内存对象,通常由多个子系统。

  • XP 全局︰ 此值显示扩展存储的过程使用的内存。

  • 排序表︰ 此值显示的内存中排序表使用。

查询内存对象

下一节描述查询内存授权信息。此部分包含的查询内存使用情况的快照。查询内存也称为是工作区内存。 Query Memory Objects Value ------------------------------ -----------
Grants 0
Waiting 0
Available (Buffers) 14820
Maximum (Buffers) 14820
Limit 10880
Next Request 0
Waiting For 0
Cost 0
Timeout 0
Wait Time 0
Last Target 11520

(11 row(s) affected)

Small Query Memory Objects Value
------------------------------ -----------
Grants 0
Waiting 0
Available (Buffers) 640
Maximum (Buffers) 640
Limit 640

(5 row(s) affected)
如果大小和成本的查询满足"小"的查询内存阈值,查询放在小查询队列。此行为可防止较小查询延迟背后大队列中已有的查询。

这一节中的元素如下所示︰

  • 授权︰ 此值显示了内存授予运行查询。

  • 等待︰ 此值显示正在等待获取内存授予的查询。

  • 可︰ 此值显示,可供查询供使用作为哈希区和作为排序工作区缓冲区。定期更新的可用值。

  • 最大︰ 此值表示可用作工作区的所有查询给定的总缓冲区。

  • 限制︰ 此值显示大查询队列查询执行目标。此值与(缓冲区) 的最大值,因为在队列中的更改之前,还未更新(缓冲区) 的最大值。

  • 下一个请求︰ 此值显示请求的内存大小,缓冲区,为下一步等待的查询中。

  • 等待︰ 此值显示必须可用于运行的查询的下一个请求的值所引用的内存量。等待的值是预留空间系数相乘的下一个请求的值。此值有效地保证了下一步等待查询运行时,将导致了特定数量的内存可用。

  • 成本︰ 此值显示的下一个等待的查询的成本。

  • 超时︰ 此值显示超时时间,以秒为单位,为下一步等待查询。


  • 等待时间︰ 此值显示经过的时间,以毫秒为单位下, 一步等待查询被放入队列中。

  • 最后一个目标︰ 此值显示查询执行的总内存限制。此值是大的查询队列和小查询队列的组合的限制。

优化

下一节是试图在同一时间优化查询的用户的摘要。 Optimization Queue Value ------------------------------ --------------------
Overall Memory 156672000
Last Notification 1
Timeout 6
Early Termination Factor 5

(4 row(s) affected)

Small Gateway Value
------------------------------ --------------------
Configured Units 8
Available Units 8
Acquires 0
Waiters 0
Threshold Factor 250000
Threshold 250000

(6 row(s) affected)

Medium Gateway Value
------------------------------ --------------------
Configured Units 2
Available Units 2
Acquires 0
Waiters 0
Threshold Factor 12

(5 row(s) affected)

Big Gateway Value
------------------------------ --------------------
Configured Units 1
Available Units 1
Acquires 0
Waiters 0
Threshold Factor 8

(5 row(s) affected)
查询提交给服务器进行编译。编译过程包括分析、 algebraization 和优化。查询分为基于每个查询将在编译过程中使用的内存量。

注意:此值不包括运行查询所需的内存。


查询启动时,有是没有限制的可编译查询数。内存占用增加并达到某个阈值,该查询必须通过网关版以继续。每个网关后逐渐衰减的同时已编译查询的限制。每个网关的大小取决于平台和负载。选择网关的大小可以实现可缩放性和吞吐量最大化。

如果查询不能通过一个网关,请查询将等待,直到有可用的内存。或者,查询将返回超时错误 (错误 8628)。此外,查询可能无法获得一个网关,如果用户取消了查询或检测到死锁。如果查询通过多个网关,查询编译过程完成之前不能释放较小的网关。


此行为可让只有几个内存密集型编译在同一时间发生。此外,这种行为最大化吞吐量较小的查询。

内存经纪人

接下来的三部分显示有关内存经纪人信息控件缓存内存、 被盗的内存和保留的内存。以下各节提供的信息仅用于内部诊断机制。因此,此信息不在此处详细说明。

   MEMORYBROKER_FOR_CACHE           Value   -------------------------------- --------------------
Allocations 1843
Rate 0
Target Allocations 1843
Future Allocations 0
Last Notification 1

(4 row(s) affected)

MEMORYBROKER_FOR_STEAL Value
-------------------------------- --------------------
Allocations 380
Rate 0
Target Allocations 1195
Future Allocations 0
Last Notification 1

(4 row(s) affected)

MEMORYBROKER_FOR_RESERVE Value
-------------------------------- --------------------
Allocations 0
Rate 0
Target Allocations 1195
Future Allocations 0
Last Notification 1

(4 row(s) affected)

需要更多帮助?

扩展你的技能
了解培训
抢先获得新功能
加入 Microsoft 内部人员

此信息是否有帮助?

谢谢您的反馈意见!

谢谢你的反馈! 可能需要转接到 Office 支持专员。

×