2

Windows服务器高物理内存占用问题排察【伴随黑客攻击】 - 不及格的程序员-八神

 1 year ago
source link: https://www.cnblogs.com/ioriwellings/p/17272752.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Windows服务器高物理内存占用问题排察【伴随黑客攻击】 - 不及格的程序员-八神 - 博客园

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

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

服务器是云服务器:8G内存,发生问题时,大约5GB内存消失了,但合计所有进程的内存工作集也不到3G,消失的内存何在?

好吧,进入远程登录看看实际情况吧

在任务管理器与Process Explorer中将所有进程工作集排序并汇总后,得到的结果就是我们没有任何程序使用这么大的内存

47234-20230330151347124-466304584.png

 不及格的程序员-八神

47234-20230330151417220-1490382544.png

 不及格的程序员-八神

 发生这种奇怪诡异的事情在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,恭喜。

47234-20230330155120597-616557838.png

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

47234-20230330153335758-621236282.png

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

需要注意:

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

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

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

补充内容:

问题来自另一台服务器, 是某客户独占的,只有一个IIS站点,一个SqlServer实例,该客户每日上传的数据百万左右,数据库时常报错如下:

资源池‘ default’ 没有足够的系统内存来运行此查询

运维同事之后将数据库的最大服务器内存调整到一个小的值,SqlServer默认会消耗到它所能找到的所有系统内存,所以每台装有SQLServer的服务器在安装后会应设定一个合适的数值,来配合系统的运行。但是在设置之后却不知道这些内存占用并不在【任务管理器】中显示,所以引来了它的疑惑,并找到了我。

好吧,我承认,这不是第一次找我了,就在前些日子这个服务器的数据库经常崩溃,经常出现如下错误

47234-20230330160630327-1158791814.png

 

47234-20230330161303243-76515858.png

这种错误大家也许经常会在网络上看到,引起这个故障的原因可能是多样的,在我这里也不例外,2个星期内我们一直围绕在数据文件格式问题打转,可问题一直在持续,客户经常打电话到客服那报怨,花了的钱并不值当,称我们服务质量简直垃圾一样,天天烦到它们了。
直到我冥思苦想后终于找到罪魁祸首,直指Windows Remote DeskTop漏洞。

终其原因是系统受到多次攻击,导致系统BOSD死亡蓝屏,由于是云服务器,系统自动重启,SQLSever数据库不能正常启动。

为什么会有这样的攻击呢,因为黑客通过此手段可以得到计算机的控制权,达到做任何事情,无利不起早。你们(黑客们)都给我低调点儿

上面的错误提示让我受到启发:Sqlserver的日志和系统日志中的其它信息可能提供了更详细信息。。。。

系统日志中提到 重启证据,当时开始怀疑机房最近供电有些不足,哈哈,怎么人不都是这样的吗?

47234-20230330161404630-1227188763.png

 后来又看到这个报错,也许能洗清我对机房电力系统的污蔑 

 

47234-20230330161437847-2073399505.png

 系统蓝屏后给出Windows系统内核转储文件,真是太棒了,拿到转储用WinDBG简单看一下就知道是受到BlueKeep攻击了,下面是Dump的 栈回溯

不及格的程序员-八神

47234-20230330162036247-297306809.png

 红框之处正是远程桌面的驱动程序调用所在最后死在了蓝屏里,升级最新Windows系统补丁,故障消失,至此故事完结!

然而工作并未结束,这里仅仅说明了一种服务器内存被占用的情况说明,上面我还列举了其它情况并没有说明,不是什么情况都能马上遇到

但是我已经在你的心中种下了一颗种子,当你遇到狂风暴雨时耳边可能会响起 他说风雨中这点痛算什么...

问题终究会被发现的,否则就是你的方法不对,记住方法与工具同样重要,再见!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK