我经常在手中拿着一个内存条手链,以彰显我是计算机深入挖掘专家,它就是一个象征,类似摸金符,有它代表你有资格可以探墓了。
同事找到我说:“我们有一台服务器,内存资源持续高位运行,经常浮动在80%左右,系统重启后会好一些,不过持续不了太久。”
服务器是云服务器:16G内存,发生问题时,大约14GB内存消失了,但合计所有进程的内存工作集也不到3G,消失的内存何在?
好吧,进入远程登录看看实际情况吧
在任务管理器与Process Explorer中将所有进程工作集排序并汇总后,得到的结果就是我们没有任何程序使用这么大的内存。
发生这种奇怪诡异的事情在Windows已经见怪不怪了,因为【任务管理器】不是理想的内存探察器,有些系统内存资源它是感知不到的。
你不能指望它来计算系统正在使用的内存,除非你想掉入无止尽的黑洞时间,到头来一场空,浪沸大量人生。
有经验的Windows运维专家到这里就会知道,如果上面没有你想要的结果,那么这背后可能有不可告人的秘密在发生,来自下面几个原因之一:
- 1 Sql Server 内存缓冲池,SqlServer如果客户请求量巨大,它会吞掉你所有可用物理内存,直到系统到崩溃的边缘。
- 2 Hyper-V虚似机 Dynamic Memory 占用内存
- 3 某些系统驱动程序内存泄漏(如:某个版本的Ati catalyst control center,或是某个品牌的网卡驱动程序,网络连接多了后内存狂飙)
- 4 第三方大型服务器程序:Logitech Media Server(不需要启动主程序,可能是后台服务或是驱动有漏洞)
我们使用正确的工具软件是探察这些问题的先决条件,要有好的罗盘,口决,驴踢子
到微软网站下载RAMMap, VMMap ,借用这两个软件我发现Sql Server偷偷占用大量的内存,下图只是例子:如果你看到了满屏黄色条状private Data,恭喜。
上图服务器的16G内存,SqlServer Workset 14G ,资源管理器中物理内存显示98%已占用。
进入数据库的内存设定页面,将最大内存调整到较小的数值,系统内存的压力立杆见影,马上就下降了,由此断定此问题正是SQLServer触发的。
如何设置这个最大服务器内存是个技术活,因为系统上还有许多程序需要大量内存,除非你这台服务器就SqlServer独占资源,你可以将90%的内存给它用。
需要注意:
设置最大服务器内存,不代表SqlServer申请内存资源不会超过这个数值,它只是缓存数据池的内存大小,SqlServer还有许多占用内存的组件是不包含在内的
有时你会怀疑我明明设置了最大服务器内存,为什么在资源管理下看到SQLServer申请的内存已经超过此值,你没看错,SqlServer是内存大户,内存池只是它需要用的一部分,多数数据库都有一个成名秘技就是减少磁盘IO,代价就是更多的内存。
经过上面分析,告之同事要么升级内存购买更多,要么忍着,并将最大服务内存适当调低些。
找几个倒霉的客户程序,在代码里多加几个Sleep,当它们觉得慢的受不了时,你告之需要升级系统数据库了,原因你们的数据大到服务器快装不下了。。。
补充内容:
问题来自另一台服务器, 是某客户独占的,只有一个IIS站点,一个SqlServer实例,该客户每日上传的数据百万左右,数据库时常报错如下:
资源池‘ default’ 没有足够的系统内存来运行此查询
运维同事之后将数据库的最大服务器内存调整到一个小的值,SqlServer默认会消耗到它所能找到的所有系统内存,所以每台装有SQLServer的服务器在安装后会应设定一个合适的数值,来配合系统的运行。但是在设置之后却不知道这些内存占用并不在【任务管理器】中显示,所以引来了它的疑惑,并找到了我。
好吧,我承认,这不是第一次找我了,就在前些日子这个服务器的数据库经常崩溃,经常出现如下错误
这种错误大家也许经常会在网络上看到,引起这个故障的原因可能是多样的,在我这里也不例外,2个星期内我们一直围绕在数据文件格式问题打转。
问题一直在持续,客户经常打电话到客服那报怨,花了的钱并不值当,称我们服务质量简直垃圾一样,天天烦到它们了。
直到我冥思苦想后终于找到罪魁祸首,直指Windows Remote DeskTop漏洞。
终其原因是系统受到多次攻击,导致系统BOSD死亡蓝屏,由于是云服务器,系统自动重启,SQLSever数据库不能正常启动。
为什么会有这样的攻击呢,因为黑客通过此手段可以得到计算机的控制权,达到做任何事情,无利不起早。你们(黑客们)都给我低调点儿
上面的错误提示让我受到启发:Sqlserver的日志和系统日志中的其它信息可能提供了更详细信息。。。。
系统日志中提到 重启证据,当时开始怀疑机房最近供电有些不足,哈哈,怎么人不都是这样的吗?
后来又看到这个报错,也许能洗清我对机房电力系统的污蔑
系统蓝屏后给出Windows系统内核转储文件,真是太棒了,拿到转储用WinDBG简单看一下就知道是受到BlueKeep攻击了,下面是Dump的 栈回溯
红框之处正是远程桌面的驱动程序调用所在最后死在了蓝屏里,升级最新Windows系统补丁,故障消失,至此故事完结!
然而工作并未结束,这里仅仅说明了一种服务器内存被占用的情况说明,上面我还列举了其它情况并没有说明,不是什么情况都能马上遇到
但是我已经在你的心中种下了一颗种子,问题终究会被发现的,否则就是你的方法不对,方法与工具同样重要.
南来地,北往的,上班的,下岗的,走过路过不要错过!
======================个性签名=====================
之前认为Apple 的iOS 设计的要比 Android 稳定,我错了吗?
下载的许多客户端程序/游戏程序,经常会Crash,是程序写的不好(内存泄漏?刚启动也会吗?)还是iOS本身的不稳定!!!
如果在Android手机中可以简单联接到ddms,就可以查看系统log,很容易看到程序为什么出错,在iPhone中如何得知呢?试试Organizer吧,分析一下Device logs,也许有用.