SQL SERVER 内存学习系列(二)-DMV查看内存信息

澳门新葡亰网站注册 2

SQLOS 最早是出现在 SQL Server 2005 中,它是一个底层的 SQL Server
的“专用操作系统”,用于管理调度、 I/O
争用、内存管理和其他资源协调等工作。这个组件是承接SQL Server 和 Windows
的中间层,具有相当重要的作用。不过可惜微软对其依旧保密,我们只能从有限的资料中获取一些信息,这部分的信息可以从以
sys.dm_os_ 开头的 DMV 中查看。

    内存管理在SQL
Server中有一个三级结构。底部是内存节点,这是最低级的分配器,用于SQL
Server的内存。第二个层次是由内存Clerk组成,这是用来访问内存节点和缓存存储,缓存存储则用于缓存。最上层包含内存对象,它提供了一个比内存Clerk更小程度的粒度,内存对象允许直接。只有Clerk可以访问存储节点,来分配内存,所以每一个需要分配大量内存的组件都需要在SQL
Server服务启动时创建它自己的内存Clerk。

1) Sys.dm_os_schedulers :每个调度对应一行,一个逻辑 CPU
对应一个用户调度,并且展示每个调度的负载和健康情况。

以前版本的SQL Server需要SQL
Server内存分配之外的VAS空间,以满足多页分配(MPA)和CLR内存要求。MPA用于每当一个组件需要一个单一分配大于8KB的时候,单页分配器处理任何不大于8KB的时候。在SQL
Server 2012中,只有一个页面分配器用于所有的请求,他们都直接来自于SQL
Server的内存分配。在SQL Server 2012中,CLR分配也是直接来自于SQL
Server的内存分配,这使得它更容易规模化SQL Server的内存需求

2) Sys.dm_os_waiting_tasks:返回每个正在等待资源的任务。

    2008R2

3) Sys.dm_os_memory_clerks :在 SQL Server 中, memory clerks
用于分配内存。 SQLServer 有自己的 memory clerk,这个 DMV 显示所有内存
clerk 的情况和每个 clerk 占用多少内存,这部分内容将在下节介绍。

    澳门新葡亰网站注册 1

    2012

    澳门新葡亰网站注册 2

 

    从上面的图可以看出,SQL Server 2012 多了一个memory
Manager,它来统一响应SQL Server
内部各种组件内存申请的请求。因为这个原因,在SQL Server 2012里面,max
server memory 不再像以前的版本那样,只控制buffer
pool的大小,也包括那些大于8kb 的内存请求。也就是, max server memory
能够更准确地控制SQL Server
的内存使用了(并非完全控制)。

    

澳门新葡亰网站注册,    SQL SERVER使用Memory
Clerk的方式统一管理内存的分配和回收,所以这使得我们使用SQL
SERVER内存变得容易,因为需要我们设置的东西很少。除了限制一下max server
memory 我貌似也想不到什么需要干涉SQL 使用内存的了(当然类似resource
governor这种东西除外哈)。

    SQL
SERVER可以知道每个Clerk使用了多少内存从而也知道自己总共使用了多少内存,这些信息都在DMV视图中可以查询的到,虽然大部分管理中都是使用性能监控器但是DMV的信息也是一种比较好的监控手段。另外很多人喜欢用DBCC
语句查看SQL各种信息,我也不例外,但是现在的DMV在产品技术不断发展也越来越全面细致了。

—————转载请注明出处——————————–

    1.memory clerk :跟踪内存sys.dm_os_memory_clerks
这个视图在05,08,12中都有变化

    

-----查看内存节点直接映射到NUMA节点
select * from sys.dm_os_memory_nodes


----
----查看memory clerk信息
----2012 中 pages_kb = 2008 中 single_pages_kb + multi_pages_kb
----2005 请自行查找
SELECT [type],
memory_node_id,
pages_kb,
virtual_memory_reserved_kb,  
virtual_memory_committed_kb,
shared_memory_reserved_kb,
shared_memory_committed_kb,
awe_allocated_kb  
FROM sys.dm_os_memory_clerks  
ORDER BY [type] DESC;  

-----不区分memory_node_id 查看总体clerk分配情况
SELECT [type],
sum(pages_kb) as [pages_kb],
sum(virtual_memory_reserved_kb) as [vm reserved],  
sum(virtual_memory_committed_kb) as [vm committed],
sum(shared_memory_reserved_kb) as [sm reserved],
sum(shared_memory_committed_kb) as [sm committed],
sum(awe_allocated_kb) as [awe allocated]  
FROM sys.dm_os_memory_clerks  
group by [type]
ORDER BY [type] DESC;  

      白皮书的字段说明:

      

列名                                       

数据类型                                       

说明                                       

memory_clerk_address                                                              

varbinary(8)                                       

指定内存分配器的唯一内存地址。                     这是主键列。 不可为 Null。

类型                                                              

nvarchar(60)                                       

指定内存分配器的类型。                     每个分配器都具有特定类型,例如,CLR Clerks MEMORYCLERK_SQLCLR。 不可为 Null。

name                                                              

nvarchar(256)                                       

指定在内部为此内存分配器分配的名称。                     一个组件可拥有多个特定类型的内存分配器。 组件可选择使用特定名称来标识相同类型的内存分配器。 不可为 Null。

memory_node_id                                                              

smallint                                       

指定内存节点的 ID。                     不可为 Null。

single_pages_kb                                                              

bigint                                       

 

 

适用于:SQL Server 2008 到 SQL Server 2008 R2。                                                       

pages_kb                                                              

bigint                                       

指定为此内存分配器分配的页内存量 (KB)。                     不可为 Null。

 

适用于:SQL Server 2012 到 SQL Server 2014。                                                       

multi_pages_kb                                                              

bigint                                       

分配的多页内存量 (KB)。                     这是使用内存节点的多页分配器分配的内存量。 此内存在缓冲池外面分配,利用了内存节点虚拟分配器的优势。 不可为 Null。

 

适用于:SQL Server 2008 到 SQL Server 2008 R2。                                                       

virtual_memory_reserved_kb                                                              

bigint                                       

指定内存分配器保留的虚拟内存量。                     不可为 Null。

virtual_memory_committed_kb                                                              

bigint                                       

指定内存分配器提交的虚拟内存量。                     提交的内存量应始终小于保留的内存量。 不可为 Null。

awe_allocated_kb                                                              

bigint                                       

指定在物理内存中锁定且未由操作系统调出的内存量 (KB) 。                     不可为 Null。

shared_memory_reserved_kb                                                              

bigint                                       

指定内存分配器保留的共享内存量。                     保留以供共享内存和文件映射使用的内存量。 不可为 Null。

shared_memory_committed_kb                                                              

bigint                                       

指定内存分配器提交的共享内存量。                     不可为 Null。

page_size_in_bytes                                                              

bigint                                       

指定此内存分配器的页分配粒度。                     不可为 Null。

page_allocator_address                                                              

varbinary(8)                                       

指定页分配器的地址。                     此地址对于内存分配器唯一,且可在 sys.dm_os_memory_objects 中使用,以查找绑定到此分配器的内存对象。 不可为 Null。

host_address                                                              

varbinary(8)                                       

指定用于此内存分配器的主机的内存地址。                     有关详细信息,请参阅 sys.dm_os_hosts (Transact-SQL)。 Microsoft SQL Server Native Client 等组件通过宿主接口访问 SQL Server 内存资源。

0x00000000 = 属于 SQL Server 的内存分配器。                                       

不可为 Null。

     2.缓存

    SQL
Server使用三种类型的缓存机制:对象存储,缓存存储和用户存储。对象存储用于缓存同种类型的无状态的数据,但缓存存储和用户存储是最常见的。两者很相似,因为都是缓存。它们的主要区别是,用户存储必须是由使用开发框架的自身存储语义来创建,而缓存存储则实现对前面提到的用于提供更小内存分配粒度的存储对象的支持。从本质上讲,用户存储主要用于微软内部不同的开发团队实现SQL
Server功能的特定缓存,所以你可以以相同的方式看待缓存存储和用户存储。要查看SQL
Server上实施的不同的缓存,可以使用DMV
sys.dm_os_memory_cache_counters。例如,运行下面的查询会显示所有可用的缓存,它们以空间消费的总量排序: