sqlserver缓冲池,sql缓冲池中的可用内存不足
SQL Server占用内存过高,什么原因导致的,用什么方法可以解决
SQL Server运行越久,占用内存会越来越大。因为sql server本身内存回收机制做的不好,这是微软系列的服务器数据库问题的通病。
创新互联公司专注于企业成都全网营销推广、网站重做改版、大化网站定制设计、自适应品牌网站建设、H5技术、商城网站制作、集团公司官网建设、外贸网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为大化等各大城市提供网站开发制作服务。
解决SQL Server占用内存过高的方法:
1.定期重启SQL Server 2008 R2数据库服务即可。
2.进入Sql server 企业管理器,在数据库服务器名称上点击【右键】,选择【属性】,然后,找到【内存】选项,在右边的【使用AWE分配内存】(sqlServer64的应该不用勾)左边把对勾打上。在最大服务器内存(MB)上填入适当的大小(不能超过计算机的物理内存)点确定,重启一下Sql服务器。
拓展资料
SQL Server 是Microsoft 公司推出的关系型数据库管理系统。具有使用方便可伸缩性好与相关软件集成程度高等优点,可跨越从运行Microsoft Windows 98 的膝上型电脑到运行Microsoft Windows 2012 的大型多处理器的服务器等多种平台使用。
Microsoft SQL Server 是一个全面的数据库平台,使用集成的商业智能 (BI)工具提供了企业级的数据管理。Microsoft SQL Server 数据库引擎为关系型数据和结构化数据提供了更安全可靠的存储功能,使您可以构建和管理用于业务的高可用和高性能的数据应用程序。
百度百科Microsoft SQL Server
如何减少分页缓冲池内存在 SQL Server 的 64 位版本
您可以通过锁定为在物理内存中的缓冲区池分配的内存分页缓冲池内存的 SQL Server 进程出的防止 Windows 操作系统。您可以通过在内存中的锁定页用户将权限分配给用户帐户用作 SQL Server 服务的启动帐户锁定内存。
注意对于 SQL Server 的 64 位版本,只有 SQL Server 企业版可以使用内存中的锁定页用户权限。这是适用于 SQLServer 2005 [RTM SP1,SP2,SP3] 和 [RTM 和 SP1] 的 SQL Server 2008年。SQL Server 2008 SP1 累积更新 2 和 SQL服务器 2005 SP3 累积更新 4 引入了对 SQL Server 标准版以使用锁定在内存中的页的用户权限的支持。 在 64 位系统上支持锁定页面的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
970070 锁定页支持 SQL Server 2005 标准版 64 位系统上,并在 SQL Server 2008年标准版 64 位系统上
若要分配的内存中的锁定页的用户权限,请执行以下步骤:
单击开始,然后单击运行,类型 gpedit.msc然后单击确定。
注意组策略对话框。
展开ComputerConfiguration,然后再展开Windows 设置。
展开安全设置,然后展开本地策略。
单击用户权限分配中,,然后双击锁定页 inmemory。
在本地安全策略设置对话框中,单击添加用户或组。
在选择用户或组对话框中,将该帐户有权运行 Sqlservr.exe 文件中,添加,然后单击确定。
关闭组策略对话框。
重新启动 SQL Server 服务。
分配后内存中的锁定页用户权限,并且在重新启动 SQL Server 服务,Windows 操作系统不再出在 SQL Server 中的缓冲池内存的页处理。但是,Windows 操作系统可以仍然出在 SQL Server 进程内的 nonbuffer 池内存页。
您可以验证用户权限使用 SQL Server 的实例,应确保在启动 SQL Server 错误日志中写入以下的消息:
将锁定的页用于缓冲池
如何解决SQLServer占内存过多的问题
当系统本身有内存可以用的的时候,SQL Server 根据操作系统报告的物理内存加载动态增大和收缩其缓冲池(缓存)的大小。只要有足够的内存可用于防止内存页面交换(在 4 至 10 MB 之间),SQL Server 缓冲池就会继续增大。如果你想把sql的内存控制在某个数量,可以更改配置信息,
1.打开企业管理器,展开服务器组。
2.单击该服务器,点击鼠标右键,单击属性菜单。
3.在弹出的对话框中单击内存选项卡。
可以看到SQLServer将动态配置内存的最大值修改为物理内存的最大值了
解决 SQL Server 耗尽内存的情况
如果碰到SQL Server服务造成内存不断扩展最终系统死机等情况,请按照以下方法解决。
原理:SQL Server 2000引入的动态内存分配机制,一般不能很好的回收内存,如果计算机一直不关闭,就会发生内存耗尽的可能。可以选择每周关机一次来避免,或者是按照下述方法来抑制内存的增长。
1、在服务器上开始—Microsoft SQL Server—企业管理器 中启动SQL企业管理器
2、启动以后打开右边的控制台树:控制台根目录\Microsoft SQL server\Sql Server组\(Local) 。
3、在(Local)节点上单击鼠标右键,选择"属性"菜单,可以看到一个 SQl Server属性(配置) 窗体
4、选择"内存"舌标,打开内存配置页面。将内存的最大值限定在一定的范围内,一般按照以下比例:
a) 如果仅仅用于数据库服务器,为总内存的80-90%
b) 如果兼任域服务器,一般为60-70%
c) 如果还兼任WEB服务器,建议最大为60%
5、设定完毕点击确定,然后重新启动SQl Server服务使之生效即可。
解决服务器的w3wp.exe进程占用cpu和内存过多的问题
解决CPU占用过多:
1、在IIS中对每个网站进行单独的应用程序池配置。即互相之间不影响。
2、设置应用程序池的CPU监视,不超过30%(一个程序池20个站),每分钟刷新,超过限制时关闭。
根据w3wp取得是哪一个应用程序池:
1、在任务管理器中增加显示pid字段。就可以看到占用内存或者cpu最高的进程pid
2、在命令提示符下运行iisapp -a。注意,第一次运行,会提示没有js支持,点击确定。然后再次运行就可以了。这样就可以看到pid对应的应用程序池。(iisapp实际上是存放在C:\windows\system32目录下的一个VBS脚本,全名为iisapp.vbs,如果你和我一样,也禁止了Vbs默认关联程序,那么就需要手动到该目录,先择打开方式,然后选“Microsoft (r) Windows Based Script. Host”来执行,就可以得到PID与应用程序池的对应关系。)
3、到iis中察看该应用程序池对应的网站,就ok了,做出上面的内存或CPU方面的限制,或检查程序有无死循环之类的问题。
解决内存占用过多,可以做以下配置:
1、在IIS中对每个网站进行单独的应用程序池配置。即互相之间不影响。
2、设置应用程序池的回收时间,去掉默认为1720,设置固定时间回收(在下列时间回收工作进程:00:01 06:01 12:01)。再设置当内存占用超过多少(如192M 10个站一个程序池时),就自动回收内存。
3、在性能中设置启用CPU监视
最大使用率 30%
刷新率 1分钟
操作:关闭
1、 要限制一个站点的CPU使用,必须将该站点设置为独立应用程序池,共用应用程序池是无法限制单个站点的。IIS独立应用程序池,就需要独立的进程,非常消耗内存。独立池越多,就有越多的W3WP进程。对于每个站点均要独立应用程序池的服务器,在一般的普通P43.0 2G内存 的普通服务器上,建议不要超过50个站点,最好30以内,不然服务器压力非常大。在配置上,我一般把资源消耗较大的网站独立一个池,一般普通BBS或者生成HTML的系统大概5个站一个池。普通网站以及一些企业站点均共用一个池。
2、根据wlmmc的经验,在服务器硬件允许的情况下,一般不要限制站点内存使用,这样能够保证网站运行,不会出现用户掉线情况。需要限制某站的最大虚拟内存不要小于64M,不然可能出现一些未知的错误。
3、这些都不是根本解决办法,它的根本问题是网站程序有问题,要解决根本问题还要从程序查起。根据本文开头提到的方法查到具体的应用程序池,找到使用此应用程序池的网站,解决网站程序存在的问题,如死循环之类。
4、除了w3wp.exe, 在调用数据库进行大量查询操作的时候,也会大量占用CPU资源,这是难免的(数据库方面的语句及结构优化不在本文讨论范围之内)。个人认为,只要不是CPU长时间占用100%, 一般在75%左右都是正常的。
SQLServer巡检内容
缓冲区是创建数据页面的缓冲页面池,这一般是SQL server内存池中最大的部分。这个计数器应该尽可能高。
低值表示只有少数的请求是在缓冲区,其他请求是在磁盘获取服务
这种情况发生可能是SQL server还在准备状态下,或缓冲区的增长需求超过最大可用内存,因此如果此值比较低,应该考虑为系统增加内存。
每好一个检查点操作移到磁盘的页面数量,这些值应该相当低,高值意味着缓冲中更多的页面被标记为脏页面。
脏页面是在缓冲区中被修改的页面。一旦被修改,就标记为脏并在下一个检查点被写回磁盘。
如果这个计数器较高说明系统发生大量的写入操作,可能是I/O问题的征兆。
记录了缓冲区管理器的Lazy write进程每秒写入的缓冲区数量。这个进程会把时间较长的脏页面从缓冲区中删除,将内存释放
数值过高说明I/O有问题或是内存问题。
页面平均寿命,表示一个不被引用的页面在缓冲池中停留的时间。数值低意味着页面从缓冲区中被移走
降低了缓冲的效率并指出内存压力的可能。
值高说明内存短缺,需要将进度挂起等待内存空闲
表示SQLServer希望消耗的动态内存总数。
当前分配给SQLerver的总内存。 如果低于Target Server Memory
那么可能是SQLserver内存需求很低,服务器最大内存设置的太低
均使用性能监视器添加指标查看
方法参考:
%disk time 磁盘时间百分比 平均值85%
CurrentDiskQueueLength 当前磁盘队列长度 平均值2
disk Transfers/sec 每秒磁盘传输数量 平均值100
Disk Bytes/sec 每秒传输字节数 平均值每秒10MB(该值需通过磁盘性能测试评估,不同磁盘指标不同)
avg.disk sec/read(write) 每次磁盘读写所需平均时间 平均值10毫秒
%process Time 处理器时间百分比 平均值80%
%privileged time 特权时间百分比 平均值10%
windows server 包括用户模式和特权模式两种 %privileged time为20%-25%表明系统正在进行大量的IO操作,一个专用的SQLserver系统%privileged time不能超过10%
sqlserver:SQL Statistics Batch Requests/sec 每秒接收到的sql命令批数 根据机器配置 一般1000为繁忙,超过1000应注意
SQL Compilations/sec sql编译次数 100
SQL Reompilations/sec sql重编译次数
Network interface bytes Total/sec 每秒总传输字节数 平均值NIC容量的50%
NetworkSegment %net utilization 网络利用率 平均值80%
参考:
为什么SQL Server使用很少的内存
默认情况下,SQLServer会依据可获得的系统资源动态改变它的内存需求。如果SQLServer需要更多的内存,它会要求操作系统确定是否有空闲的物理内存可用,并使用可用的内存。若SQLServer不再需要当前分配给它的内存,它就将内存释放给操作系统。当SQLServer动态使用内存时,它要求系统定期地检测可用的物理内存数量。SQLServer根据服务器活动增大或收缩高速缓冲存储器,以使可用物理内存保持在4MB到10MB之间。这就避免了系统进行换页操作。[也就是说,这种情况下SQLSERVER本身不会使物理可用内存小于4M,如果比较长的时间内都小于4M的话,则要看一下是不是该服务器上其它应用程序有问题]第二种情况:限制使用内存使用setworkingsetsize为sqlserver保留等于服务器内存设置的物理内存空间。即使是sqlserver进程此时是空闲的,系统也不会将SQLServer页交换出去。使用minservermemory保证sqlserver使用的最小内存。SQLServer启动时不立即分配minservermemory中所指定的内存量。但是,当内存使用由于客户端负荷而达到该值后,SQLServer将无法从已分配的缓冲池中释放内存。使用maxservermemory则防止SQLServer使用多于指定数量的内存,这样剩余的可用内存可以快速运行其它应用程序。SQLServer启动时不立即分配maxservermemory中所指定的内存。内存使用随SQLServer的需要而增长,直到达到maxservermemory中所指定的值。SQLServer无法超过该内存使用值,除非增加maxservermemory值。第一种情况比较适用于服务器专做sqlserver服务器的情况,第二种情况适用于为在同一台计算机上运行的其它应用程序保留一定的内存以便于快速响应。(另:如果想动态分配sqlserver的内存,则不要设置setworkingsetsize选项,使用默认值即可。至于这些参数如何设置参见另外的文档)监视SQLServer所使用的内存和计数器有助于确定:是否由于缺少可用物理内存存储高速缓存中经常访问的数据而导致瓶颈存在。如果是这样,SQLServer必须从磁盘检索数据。是否可通过添加更多内存或使更多内存可用于数据高速缓存或SQLServer内部结构来提高查询性能。SQLServer需要从磁盘读取数据的频率。与其它操作相比,例如内存访问,物理I/O会耗费大量时间。尽可能减少物理I/O可以提高查询性能。对sqlserver服务器内存的监视:Memory:AvailableBytes计数器表示当前进程可使用的物理内存字节数。如果小于4M或更小,说明计算机上总的内存可能不足,或某个程序没有释放内存●Memory:PageFaults/sec每秒软性页面失效的数目(包括有些可以直接在内存中满足而有些需要从硬盘读取)较page/sec只表明数据不能在内存指定工作集中立即使用。如果该值偶尔走高,表明当时有线程竞争内存。如果持续很高,则内存可能是瓶颈。Memory:Pages/sec计数器表示由于缺页处理而从磁盘取回的页数,或由于缺页处理而写入磁盘以释放工作集空间的页数。●PageReads/sec每秒发出的物理数据库页读取数。这一统计信息显示的是在所有数据库间的物理页读取总数。由于物理I/O的开销大,可以通过使用更大的数据高速缓存、智能索引、更高效的查询或者改变数据库设计等方法,使开销减到最小。●PageWrites/sec所发出的物理数据库页写入的数目。若查看原帖
做开发的朋友们,SqlServer大家都用什么版本
各版本功能对比
从我最开始接触的SQL SERVER 2000 开始,已经经历了如此多的版本。下面简单阐述下各个版本新增的功能:
SQL SERVER 2000
日志传送
索引视图
SQL SERVER 2005
分区
数据库镜像
(只有 SQL Server 2005 Enterprise Edition SP1 和更高版本支持异步数据库镜像。)
联机索引
数据库快照
复制
故障转移群集
SQL SERVER 2008
数据压缩
资源调控器
备份压缩
SQL SERVER 2008 R2
R2标志表示这是SQL Server的一个中间版本,而不是一个主版本 .此版本目前我的客户中,使用还是非常多,性能稳定,虽然新增功能比较少:
新增数据中心版,最大支持256核.
Unicode压缩
(为Unicode存储提供一个简单的压缩方案,通过Unicode压缩,可以减少Unicode字符对空间的占用)
SQL SERVER 2012
AlwaysOn
Columnstore 索引
增强的审计功能
大数据支持
SQL SERVER 2014
这个版本的新特效特别多,和非常有用,可以多了解下.
内存优化表
备份加密
针对基数估计的新设计
AlwaysOn 增强功能
延迟持续性 (将部分或所有事务指定为延迟持久事务,从而能够缩短延迟)
分区切换和索引生成
(官网写得Partition Switching and Indexing,感觉是有问题的,其实就是分区表的单个分区可以重建)
列存储索引
缓冲池扩展 就是使用SSD 扩展缓冲池
增量统计信息
资源调控器增强功能
(--之前只能控制CPU和内存,2014 开始可以控制IO)
DBCC CHECK 支持maxdop 提示
SQL SERVER 2016
全程加密技术(Always Encrypted)
JSON支持
多TempDB数据库文件
(以前也是支持的,在2014 开始就在error log提示,2016中,在安装时就可以设置。)
Query Store
(前几天去参加微软的培训还讲到的,挺不错的功能。可以帮助解决参数嗅探的问题,数据库升级的时候也可以用到它)
支持R语言
Live Quer y St at ist ics
(可以更清晰的看到执行计划的开销(水流式))
SQL SERVER 2017
可恢复的在线索引重建
允许您在发生故障(例如故障切换到副本或磁盘空间不足)之后恢复在线索引重建操作。
IDENTITY_CACHE option
当此选项设置为OFF时,它可以避免在服务器意外重新启动或故障切换到辅助服务器的情况下,标识列值的间隙
CLR在.NET Framework中使用代码访问安全性(CAS),该框架不再支持安全边界。
使用PERMISSION_SET = SAFE创建的CLR程序集可能能够访问外部系统资源,调用非托管代码并获取sysadmin权限
图表数据库功能
用于多对多关系建模
Read-scale availability groups without cluster
可以在不依赖集群的情况下,搭建读的可用性组,分担读压力。不过此时不能实现高可用。
R/PYTHON 机器学习方面的功能
总结
总的来说,SQL SERVER 正在变得越来越好,希望越来越多的人更多的了解他.如果有什么其他疑问欢迎讨论。
网站栏目:sqlserver缓冲池,sql缓冲池中的可用内存不足
文章来源:http://myzitong.com/article/dscedic.html