SQLServer Stolen内存优化案例

最近开始观察到 SQLServer.exe 进程占用内存过大,已达到了60GB,如图:
这里写图片描述

然而,SQLServer 限制的最大内存为 55GB:

EXEC sp_configure'max server memory (MB)'

这里写图片描述

可以看到,竟然高出近5GB。
我们知道,’max server memory (MB)’ 限制的是SQLServer buffer pool 的大小,buffer pool 主要缓存数据库中的数据页 ,而数据库中主要是数据的缓存,能控制这部分数据的缓存也相当于控制住了SQLServer 的缓存。

先说明当前数据库情况:
当前版本:
Microsoft SQL Server 2008 (SP4) - 10.0.6000.29 (X64) Sep 3 2014 04:11:34 Copyright (c) 1988-2008 Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 (Build 7601: Service Pack 1)

数据库总大小不到50GB,最大内存限制为55GB。

其实数据内存的使用绰绰有余了,什么原因呢?现在开始跟踪。

先打开性能监视器(cmd—>perfmon)监视系统及数据库内存情况:
SQLServer内存是否充足?是SQLServer占用过多内存还是Windows其他程序占用内存?
这里写图片描述

监视可确定:
当前内存完全够用!
Database pages = 4992221 * 8KB = 37.55GB
Free pages = 1165389 * 8KB = 8.89GB
Total Server Memory (KB) = 55GB
Stolen pages = 1052195 * 8KB = 8GB

除了部分缓存计划,Stolen pages 占用最多!~而 Stolen 中的 MemToLeave 是不受’max server memory (MB)’ 限制的。可以使用系统DMV sys.dm_os_memory_clerks 查看主要哪些类型对象占用的 Stolen 或者 MemToLeave 最多。

SELECT [type]
,SUM(virtual_memory_reserved_kb) AS [vm reserved]
,SUM(virtual_memory_committed_kb) AS [vm commited]
,SUM(awe_allocated_kb) AS [awe allocated]
,SUM(shared_memory_reserved_kb) AS [sm reserved]
,SUM(shared_memory_committed_kb) AS [sm committed]
,SUM(single_pages_kb) AS [Stolen in Buffer Pool]
,SUM(multi_pages_kb) AS [MemToLeave]
,SUM(single_pages_kb)+SUM(multi_pages_kb) AS [Stolen]
,SUM(virtual_memory_committed_kb)+SUM(multi_pages_kb) AS [Buffer Pool]
FROM sys.dm_os_memory_clerks
GROUP BY [type]
ORDER BY [MemToLeave] desc

这里写图片描述
可以看到,USERSTORE_TOKENPERM 和 CACHESTORE_SQLCP 占用最多。

使用 DBCC MEMORYSTATUS 查看时,也是这两个Stolen 占用最多。

CACHESTORE_SQLCP(node 0)KB
---------------------------------------- -----------
VMReserved                              0
VMCommitted                             0
LockedPagesAllocated                   0
SMReserved                              0
SMCommitted                             0
SinglePageAllocator                     6398656
MultiPageAllocator                      231576

USERSTORE_TOKENPERM(node 0)KB
---------------------------------------- -----------
VMReserved                              0
VMCommitted                             0
LockedPagesAllocated                   0
SMReserved                              0
SMCommitted                             0
SinglePageAllocator                     859584
MultiPageAllocator                      4236064

现在使用sys.dm_os_memory_cache_counters 查看具体是什么对象

SELECT top 10 * FROM sys.dm_os_memory_cache_counters(nolock)
ORDER BY multi_pages_kb DESC;

这里写图片描述
TokenAndPermUserStore 占用最多,TokenAndPermUserStore 是什么?
字面意思可以理解,Token and Permission ,即用户登录和权限的认证信息。
该值的大小和数量一直都在增加:

SELECT SUM(single_pages_kb+multi_pages_kb) AS "CurrentSizeOfTokenCache(kb)"
FROM sys.dm_os_memory_clerks
WHERE name='TokenAndPermUserStore'


SELECT COUNT(*) FROM sys.dm_os_memory_cache_entries(nolock)
WHERE [type]='USERSTORE_TOKENPERM' and name='TokenAndPermUserStore'

具体的缓存对象信息可以查看:

SELECT TOP 10 OBJECT_NAME(est.objectid, EST.dbid) AS ObjectName,
omce.name AS cacheName,
omce.in_use_count,
omce.is_dirty,
omce.disk_ios_count,
omce.context_switches_count,
omce.original_cost,
omce.current_cost
FROM sys.dm_exec_cached_plans ecp
CROSS APPLY sys.dm_exec_sql_text(ecp.plan_handle) est
INNER JOIN sys.dm_os_memory_cache_entries omce
ON ecp.memory_object_address = omce.memory_object_address
WHERE omce.name = 'Object Plans'
--WHERE omce.name = 'SQL Plans'

这个怎么释放?使用系统命令 DBCC FREESYSTEMCACHE

DBCC FREESYSTEMCACHE('TokenAndPermUserStore')
--DBCC FREESYSTEMCACHE('SQL Plans')
--DBCC FREESYSTEMCACHE('Object Plans')

执行完成后,内存瞬间降了下来:
这里写图片描述

虽然是将了下来,但是也会渐渐增加回去。系统提供了几个设置选项,由于介绍这些参数的相关文章太少不详细,本人没太了解,没有使用,如下几个参数:

exec sp_configure 'access check cache quota'
exec sp_configure 'access check cache bucket count'

DBCC TRACEON(4620,-1)

=========================================================
此外,还可以对缓存计划进行优化。现在看看缓存计划情况:

select cacheobjtype as [Cached Type]
,COUNT(*) as [Number of Plans]
,SUM(CONVERT(BIGINT,size_in_bytes))/1024/1024 as [Plan Cache Size(MB)]
from sys.dm_exec_cached_plans
group by cacheobjtype
order by [Plan Cache Size(MB)] desc

这里写图片描述
编译计划 (compiled plan)占用多达6GB,可以继续用 sys.dm_exec_cached_plans 查看是什么对象占用最多。

select objtype as [Cached Object Type]
,COUNT(*) as [Number of Plans]
,SUM(CONVERT(BIGINT,size_in_bytes))/1024/1024 as [Plan Cache Size(MB)]
,avg(usecounts) as [Avg Use Count]
from sys.dm_exec_cached_plans
group by objtype
order by [Plan Cache Size(MB)] desc

这里写图片描述
Adhoc 和 Prepared 占用6GB多的缓存,即时查询和预编译在系统中占用较多,说明有较多SQL语句不能重新使用,每次都需要编译,这部分可以进行参数化或存储过程替代。当然即时查询也可使用系统设置是否进行缓存优化,查看是否开启即时查询优化:

EXEC sp_configure'optimize for ad hoc workloads'

下面开启优化:

EXEC sp_configure 'show advanced options',1
RECONFIGURE
EXEC sp_configure 'optimize for ad hoc workloads',1
RECONFIGURE

这不会使即时查询的缓存计划立即降下来,过几天观察,发现少了1GB+。
好了,暂时是缓解了,因为数据库的连接信息太多和一些SQL语句的直接执行,使缓存也占用挺多。还得继续观察 TokenAndPermUserStore ,因为这部分每次用户连接都会增加。

本文出自“Hello.KK (SQL Server)”的博客,转载请务必保留此出处http://blog.csdn.net/kk185800961/article/details/46664421

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
微软SQL Server 2008 R2中的资源分配方式与SQL Server 2005中的方式相比是一种完全不同的过程。利用资源控制器,在SQL Server 2008 R2中解决方案供应商有切实可用的方法管理CPU和内存。   资源消耗是长期以来困扰使用SQL Server的解决方案供应商的基本问题之一。任何服务器,不管它是物理的还是虚拟的,供处置的CPU和内存池都是有限的。过去,这一简单的事实给SQL Server带来许多麻烦,因为它通常是资源非常敏感的应用。   如果服务器上只托管了唯一一个数据库的话,那么SQL Server资源消耗并不是个严重的问题。但是如果有多个数据库在用着,那就真的变成一个问题了,因为各种数据库都会竞争同样一组CPU和内存资源。   在SQL Server 2005中,对这个问题可以接受的解决方案通常是为每个数据库创建独立的SQL Server实例,利用处理器亲和度为每个数据库实例分配资源。这种技术的问题是一旦资源被分配给SQL Server实例,他们对其他SQL Server实例就不可用了。结果,如果一个数据库的负载特别重,它也不可能从其他SQL实例暂借服务器的CPU资源,虽然这个实例上的资源此时可能什么都没做。   一些解决方案供应商也曾尝试利用服务器虚拟化作为给个别SQL Server数据库分配资源的一种途径。在这种模型中,每台虚拟机只托管一个SQL Server数据库。这种方法也可行,但是虚拟机和他们的操作系统也消耗了一些本该用于SQL Server的服务器资源。此外,还依赖于你使用的虚拟化软件,以按需分配为基础的资源动态分配可能有些困难或者不可能实现。   微软最终针对SQL Server 2008 R2中的资源分配问题创建了一套可行的解决方案,引入了叫做资源控制器的新组件。这个资源控制器是可以通过微软SQL Server Management Studio访问的,它可以定义资源池,每个资源池都包含负载工作组,如下图所示:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值