如何使用 DBCC MEMORYSTATUS 命令来监视 SQL Server 2005 中的内存使用情况
如何使用 DBCC MEMORYSTATUS 命令来监视 SQL Server 2005 中的内存使用情况
http://support.microsoft.com/kb/907877/zh-cn
DBCC MEMORYSTATUS 命令提供了 Microsoft SQL Server 的当前内存状态的快照。在 SQL Server 中的内存消耗问题进行故障排除,或要排除特定的内存不足错误,可以使用此命令的输出。(许多内存不足错误自动打印此输出中的错误日志。Microsoft 客户支持服务还可能要求您运行此命令在一个特定的支持事件过程如果您遇到的错误,可能是与低内存条件相关联。
注意:性能监视器 (PerfMon) 和任务管理器不考虑内存正确如果启用地址窗口化扩展 (AWE) 的支持。
本文介绍了一些可以从 DBCC MEMORYSTATUS 命令的输出中获取的数据。这篇文章的多个部分包含未在此处介绍的专用实现详细信息。Microsoft 客户支持服务不会回答任何问题或提供详细信息超出了本文中提供的信息的特定计数器的含义。
注意:性能监视器 (PerfMon) 和任务管理器不考虑内存正确如果启用地址窗口化扩展 (AWE) 的支持。
本文介绍了一些可以从 DBCC MEMORYSTATUS 命令的输出中获取的数据。这篇文章的多个部分包含未在此处介绍的专用实现详细信息。Microsoft 客户支持服务不会回答任何问题或提供详细信息超出了本文中提供的信息的特定计数器的含义。
更多信息
重要:DBCC MEMORYSTATUS 命令旨在成为 Microsoft 客户支持服务的诊断工具。输出的格式和所提供的详细程度受到的服务包和产品版本之间的更改。DBCC MEMORYSTATUS 命令提供的功能可能会被以后的产品版本中的不同机制。因此,在以后的产品版本中,该命令可能不再起作用。之前该命令被更改或删除不会进行任何其他警告。因此,使用此命令的应用程序可能会中断且不发出警告。
DBCC MEMORYSTATUS 命令的输出已更改的 SQL Server 的早期版本中。现在,则输出包含在早期的产品版本中不可用的几个部分。
这一节中的元素如下所示:
注意:
注意:
这一节中的元素如下所示:
注意:
注意:
对于 SMP 系统) 中,您将看到每个职员类型只有一个部分。
有关共享内存是在以下各节中的其他信息:
这一节中的元素如下所示:
下一节列出了有关缓冲区池以及其他信息的详细信息。
这一节中的元素如下所示:
这一节中的元素如下所示:
这一节中的元素如下所示:
如果大小和查询的成本满足"小"的查询内存阈值,查询将被放入小查询队列中。此行为可防止较小的查询延迟背后大队列中已有的查询。
这一节中的元素如下所示:
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 量。
- AWE 分配: 此值显示通过 AWE 机制在 32 位版本的 SQL Server 上分配的内存的总数量。
- 保留的内存: 此值显示为专用的管理员连接 (DAC) 保留的内存。
- 保留内存中使用: 此值显示了正在使用保留的内存。
内存使用情况的摘要
内存管理器部分中后跟为内存中的每个节点的内存使用情况的摘要。注意:
Memory node Id = 0 KB ------------------------------ -------------------- VM Reserved 1757304 VM Committed 1659612 AWE Allocated 0 MultiPage Allocator 10760 SinglePage Allocator 73832 (5 row(s) affected)
这一节中的元素如下所示:
- 虚拟机保留: 此值显示在此节点正在运行的线程保留 VAS。
- 虚拟机已提交: 此值显示在此节点上正在运行的线程一直致力 VAS。
- AWE 分配: 此值显示了通过 AWE 机制在 32 位版本的产品分配的内存。
在一个 NUMA 启用系统中此值可以是不正确或负数。但是,在内存管理器部分中总体 AWE 分配 值是正确的值。 若要跟踪由单个 NUMA 节点分配的内存,使用 SQL Server: 缓冲区节点 性能对象。(有关详细的信息请参阅 SQL Server 联机丛书。 - 多页分配器: 此值显示在此节点正在运行的线程的情况下通过多页分配器分配的内存。
- SinglePage 分配器: 此值显示在此节点正在运行的线程的情况下通过单页面分配器分配的内存。
聚合内存
下一节包含每个职员类型并为每个 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)
对于 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 保证: 此值显示了这种使用内存映射文件 API 的所有职员都提交的 VAS。
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 中的条目相匹配。
注意由于此信息的动态性的匹配项可能不是精确。您可以使用 PerfMon 来监视该 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 数据集 Allocators: 此值显示为通过 访问方法 设置的表格访问权限分配结构使用的内存。
- SubpDesc Allocators: 此值显示了用于管理用于并行查询、 备份操作,还原操作、 数据库操作、 文件操作、 镜像,和异步游标的子进程的内存。 这些子进程也称为是 并行的进程。
- 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)
注意:此数量不包括运行查询所需的内存。
查询启动时,没有限制上多少查询可以进行编译。内存消耗增加,并达到某个阈值,该查询必须通过一个网关,以继续。每个网关后逐渐递减的同时已编译查询的限制。每个网关的大小取决于平台和负载。选择网关的大小可以实现可缩放性和吞吐量最大化。
如果查询不能通过一个网关,查询将等待,直到内存可用。或者,查询将返回超时错误 (错误 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)