Windows服务器高物理内存占用问题排察

发布时间 2023-03-30 15:58:57作者: 不及格的程序员-八神

我经常在手中拿着一个内存条手链,以彰显我是计算机深入挖掘专家,它就是一个象征,类似摸金符,有它代表你有资格可以探墓了。

同事找到我说:“我们有一台服务器,内存资源持续高位运行,经常浮动在80%左右,系统重启后会好一些,不过持续不了太久。”

服务器是云服务器:8G内存,发生问题时,大约5GB内存消失了,但合计所有进程的内存工作集也不到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,恭喜。

 

 

进入数据库的内存设定页面,将最大内存调整到较小的数值,系统内存的压力立杆见影,马上就下降了,由此断定此问题正是SQLServer触发的。

如何设置这个最大服务器内存是个技术活,因为系统上还有许多程序需要大量内存,除非你这台服务器就SqlServer独占资源,你可以将90%的内存给它用。

需要注意:

  设置最大服务器内存,不代表SqlServer申请内存资源不会超过这个数值,它只是缓存数据池的内存大小,SqlServer还有许多占用内存的组件是不包含在内的
有时你会怀疑我明明设置了最大服务器内存,为什么在资源管理下看到SQLServer申请的内存已经超过此值,你没看错,SqlServer是内存大户,内存池只是它需要用的一部分,多数数据库都有一个成名秘技就是减少磁盘IO,代价就是更多的内存。

经过上面分析,告之同事要么升级内存购买更多,要么忍着,并将最大服务内存适当调低些。

找几个倒霉的客户程序,在代码里多加几个Sleep,当它们觉得慢的受不了时,你告之需要升级系统数据库了,原因你们的数据大到服务器快装不下了。。。