SQL Server内存遭遇操作系统进程压榨案例

  来源于点击打开链接

  场景:

  最近一台DB服务器偶尔出现CPU报警,我的邮件报警阈(请读yù)值设置的是15%,开始时没当回事,以为是有什么统计类的查询,后来越来越频繁。

  探索:

  我决定来查一下,究竟是什么在作怪,我排查的顺序如下:

  1、首先打开Cacti监控,发现最近CPU均值在某天之后骤然上升,并且可以看到SystemProcessor Queue Length 和 sqlservr%ProcessorTime 也在显著的变化。

SQL Server内存遭遇操作系统进程压榨案例

  2、从最容易入手的低效SQL开始,考虑是不是最近业务做了什么修改?连接到该SQL实例,打开活动监视器,展开“最近耗费大量资源的查询”,并CPU时间倒序,在这里并未发现有即时的耗费资源的查询。据个人经验,这里的值如果是4位数,分钟内执行次数3位数,一般的服务器CPU大概就10%以上,如果cpu时间那里是5位数,且分钟内执行次数也很高,几百次以上,那CPU一般就会不淡定了。图片仅为演示

  3、没有耗资源的SQL,这是DBA最不愿意看到的结果,因为也许,SQL Server受到了来自内部或者外部的压力,使得自己花费了过多的时间去处理与操作系统的沟通去了。SQL Server常见的非查询低效类的性能问题,绝大多数都来自于内存或者硬盘,而这两者有的时候需要同时研究对比基线,才能确定谁是因,谁是果。在这里,我们首先查看SQL Server内存使用情况,当打开性能计数器时,我和我的小伙伴们都惊呆了……安装了64G内存的数据库,SQL Server的TargetMemory仅有500多兆!这其中StolenPage还占用了200多兆,数据库DataPage仅有200多兆的内存可供使用,Oh,Shit!虽然我很不想用“去哪了”这三个字,但是“我的内存去哪了“?同时我们也注意到PageLifeExpectancy值只有26(一个内存充足的服务器,这个值至少应该是上W的),而很早之前我们津津乐道的"Cache Hit Ration"却仍然保持一个比较高的水准98! 这个案例告诉我们,缓存命中率这个性能计数器很多时候说明不了什么问题。

SQL Server内存遭遇操作系统进程压榨案例

  4、OK,既然这样,是谁占用了本该属于我亲爱的SQL Server的内存呢?我们继续,打开Wiindows任务管理,选定进程选项卡,点击显示所有用户进程,发现svchost.exe占用了绝大多数的60G内存!

SQL Server内存遭遇操作系统进程压榨案例

  5、那svchost.exe又是个什么东西呢?我们下面就用到ProcessMonitor这个工具了,打开后自动加载所有Wiindows进程,按内存排序后,鼠标移至svchost.exe进程上,显示为Remote Registry服务。

SQL Server内存遭遇操作系统进程压榨案例

  6、查到这里,事情已经有了一定的眉目,这个多半是windows内存泄露Bug,遂google关键词: windows server 2008 r2 remote registry memory leak

  果然:Assume that you query performance counters on a remote computer by using an application on a computer that is running Windows 7 or Windows Server 2008 R2. In this situation, the memory usage of the Remote    Registry service on the local computer increases until the available memory is exhausted.

  解决方法:

  1、重启服务器,安装hotfix

  2、因为重启服务器会影响到业务,所以我在想重启RemoteRegistry服务,应该也能暂时解决问题,这个bug应该是在某种固定情景下发生的。

  随后,在合适的时间,我重启了这个服务,SQL Server的TargetMemory重新恢复到60多G,CPU也正常了,目前为止该问题未再发生。

  后续跟进:

  DBA的工作,说难也难,说容易也容易,发现问题,解决问题还不够,我们还要意识到自己的欠缺,在本案例中,我之前并没有建立起SQL Server内存的监控,所以没有在第一时间就发现病情的严重性,好在该服务器并未承担重要业务,否则后果不堪设想,说不定早就崩溃过了,后怕之处在于,如果崩溃了,自然要重启服务器,到那个时候,我们连第一现场都没有,当leader问起来,我又该使劲挠头了。

  该事件之后,我建立起了SQL Server内存的监控,1天后,我从新的监控数据中,又发现了一台服务器出现相同的问题!我很庆幸,不是庆幸服务器没宕机,而是庆幸我做对了。

  附一张内存监控图,可以看到服务重启之后,SQL Server的Total Pages一直在上升,并逐渐稳定,Page life expectancy也在变得越来越大,CPU也能指示病症已消除,我很欣慰。

SQL Server内存遭遇操作系统进程压榨案例
SQL Server内存遭遇操作系统进程压榨案例

  总结:

  服务器在出现性能问题前,大部分是提前有一些征兆的,尤其是内存泄露,因为内存是一点点被压榨掉的,最后到达一个极限时,SQL Server就会突然Crash掉,然后只留给你一个dump,微软就笑了。有经验的大夫应该从日常的腰酸背痛中看出一些端倪,然后进一步分析,提前预知重大疾病的发生,这就是DBA的价值。这个案例,告诉我,重视服务器异常的细节变化,才能做到防患于未然。

分类:mssql数据库 时间:2013-02-19 人气:3
本文关键词:
分享到:

相关文章

  • Sql Server 存储过程实例讲解 2012-01-02

      一、遇到的问题   我们在之前学习的课程写了不少的批处理语句,这些批处理语句存在两个问题:   1.没法像函数那样传参数运行(自定义化)   2.没法像函数那样可以反复地调用(功能化模块化)   说到这里,我们可以猜到,数据库中应该可以建立函数形式的数据库对象来解决这样的问题。但是介绍这种数据库对象之前,我们再来看几个需要解决的问题:   我们已经学会把一条select语句封装在视图中,但是它只能用来查询,如果我们希望进行其它操作,比如增删改记录、建删库表等,是不能用视图来完成的。   另一

  • 修改SQL Server Management Studio默认设置提高开发效率 2012-01-03

    修改SQL Server Management Studio默认设置提高开发效率 2012导脚本默认没有判断对象是否存在的,导致执行删除创建的脚本会先报一次错。可以在工具=>选项==>sqlserver对象资源管理器中的编写脚本的.检查是否存在对象。 可以设置默认数据库。可以对数据库用户设置最近主要开发的数据库为默认,这样直接点工具栏的新建查询就不会每次需要选数据库了。 个人习惯,不喜欢启动ssms时候自动弹出一个新的查询而且还需要你去填写用户和密码。我是每次都要取消,当然你也可以去

  • SQL Server 2014新特性Data Explorer ForExcel的特点 2012-01-06

    Data Explorer是即将发布的SQL Server 2014里的一个新特性,借助这个特性讲使企业中的自助式的商业智能变得更加的灵活,从而也降低了商业智能的门槛。 Data Explorer Preview for Excel提供了一种新的方式来为自助式的商业智能发现数据,整合数据以及提炼数据。如果你对它还比较陌生,那么如下五点将使你了解它如何提升你在Excel中处理数据的方法。 借助Data Explorer,你可以: 1. 发现数据 Data Explorer带来了在Excel中数据检

  • SQL Server 2012中自带的SSDS多维数据集的浏览功能 2012-01-07

    在SQL Server 2012自带的SQL Server Data Tools(SSDT),上个版本中SQL Server 2008中对应为BIDS, 已经废除了多维数据集的数据浏览功能,同时在SSMS中也同步废除,只能浏览单维数据。 解决方法:在维度浏览界面,点击“Analyze in Excel”,在相应的Excel界面完成浏览。 www.2cto.com 关于“Management Studio 和多维数据集设计器中的多维数据集浏览器已被删除”的详细, 请看MSDN:http://msd

  • SQL Server 2005重新安装不上的问题及其解决 2012-01-08

    SQL Server2005重新安装不上的问题及其解决 今天我们上C#课,前几天使用的Access数据库,现在要使用SQL Server2005了,老师让自己先安装。由于我来之前这个机子已经被人安装过了,但是没安装内容,我就全部卸载了,然后自己重装。但是重装的过程遇到了一些问题,导致SQL Server2005安装不上,出现了如下问题: 没有下一步。当然,上面出现的统计结果可能不同,我看到有14个的,还有15个的,一般都是1个Error,出现红叉就说明通不过,黄色叹号的没什么大碍就不用管了。 点

  • SQL Server扩展存储过程实现远程备份与恢复 2012-01-09

      实例说明:   环境:win2k+sqlserver 2K+查询分析器   SQL SERVER服务实例名称:mainserver   需要备份的数据库名称: msdb   本地机器名称(Client端):david   本地用户:zf 密码:123   本地域名:domain   本地提供备份需求的文件夹:e: est    第一步: 建立共享文件夹   在程序代码中调用(或者CMD窗口) net share test=e: est   或者用NetShareAdd这个API   简要说明

  • 怎样才能保护好 SQL Server 数据库 2012-01-10

    数据库的安全性一直是非常重要的,相信对大家会有帮助的。 1. 首先,你需要安装最新的服务包 为了提高服务器安全性,最有效的一个方法就是升级到SQL Server 2000 Service Pack 3a (SP3a)。另外,您还应该安装所有已发布的安全更新。 2. 使用Microsoft基线安全性分析器(MBSA)来评估服务器的安全性   MBSA 是一个扫描多种Microsoft产品的不安全配置的工具,包括SQL Server和Microsoft SQL Server 2000 Desktop

  • SQL SERVER损坏文件的修复工具 2012-01-12

    SQL SERVER损坏文件的修复工具 超级SQL修复可以修复下面类型损坏的MDF文件: 1.断电,造成系统表损坏的。 2.硬盘或者存储物理故障,造成的数据库损坏。 3.置疑后,无法利用常规手段导出数据的。 4.其它故障的,但MDF文件结构还是正常的,都可以100%导出数据 软件截图: (打开损坏文件进行修复截图) (已经可以浏览到表数据) (选择导出参数,进行数据库恢复)

  • 清理SQL Server 2008日志文件 2012-01-14

      SQL 2008日志文件占了23G硬盘空间,而事务日志已经截断(Truncate),实际日志内容很小,1G都不到,想要释放日志文件霸占的多余空间。   但是,无论怎么收缩(Shrink)日志文件,空间就是不能释放,总是出现错误:   Cannot shrink log file 2 (CNBlogsText_log) because of minimum log space required.   之前解决过类似的问题,也写过一篇博客-SQL Server 2008事务日志清理,当时采用的最

  • 数据库错误[DBNETLIB][ConnectionOpen(Connect()).]SQL Server不存在或拒绝访问解决 2012-01-16

    数据库错误[DBNETLIB][ConnectionOpen(Connect()).]SQL Server不存在或拒绝访问解决 数据库网狐游戏 【 2012-12-0310:44:06 】ADO 错误:0x80004005,[DBNETLIB][ConnectionOpen(Connect()).]SQL Server 不存在或拒绝访问。 【 2012-12-0310:44:06 】游戏列表加载失败 【 2012-12-0310:44:06 】调度引擎外挂服务启动失败 【 2012-12-031

Copyright (C) quwantang.com, All Rights Reserved.

趣玩堂 版权所有 京ICP备15002868号

processed in 0.097 (s). 10 q(s)