sql server windows nt 64bit 内存占用过高解决办法

内存居高背景

本人业余从事淘宝客研究,是一个误入技术领域的非专业技术人员,业余时间用:asp.net+sql server express 搭建一个网站,网 址:爱尚偶乐分享,技术比较low,各位看官就请多见谅。

网站大约在2019年3月份上线,运行了半年之久,发现内存占用比例飙升,一度达到80-90%,网站只存储了淘宝联盟、多多客的推广链接,数据大约50-70M左右,以非专业人员评估,应该用不到那么大的内存空间,一直不明所以。

软件运行环境参数

在2018年12月12日,当晚做了冲动的决定,头脑一发热,按耐不出内心的想法,赶紧上阿里云买下ECS,系统配置如下:
sql server windows nt 64bit 内存占用过高解决办法
购买ECS花费我近1700大洋,各位看官估计都认为我人傻钱多,据后来事实验证,我确实是人傻,但钱不多。
sql server windows nt 64bit 内存占用过高解决办法
数据库方面,考虑自己对microsoft sqlserver最熟,另一个是出于对版权的考虑,再一个是轻量,所以采用express版本,至于与standard版本,是否有效率上的差异,我也拿不太准,有待进一步测试。

内存占用居高不下

ECS买了之后,不能一直闲置啊,么有办法,临时找了几本书asp.net的书,初入职场时干过一年的net.asp开发,多少心里还有点数,临时临为就编写自己的个人网站。前后大概用了三个月时间,一边看书,一边写代码,中间的过程,省略一万字,也算是历经千辛万苦,好歹是给搞出来的,哈哈,我还是有点小佩服自己,至少有8年我没有系统的写过代码了。

代码差不多码完了,直接部署到ECS上的IIS中,过程比较顺利,能正常仿问,后续的时间里,也不断迭带了一功能,也开发了mobile版,但一直没有关注系统性能问题,直到临近今年双十一,我上ECS看系统监控性能图表,吓到我了。
sql server windows nt 64bit 内存占用过高解决办法
我上来看性能报表主要原因,是因为上线半年以来,并没有带来理想收益,一直处于亏损状态,淘宝客并没有我想像的那么好做,流量是个大问题,给我的感觉是,大家现在不是谈虎色变,而是谈“加微信”色变,谈微商色变,大家有么有这样的感觉。

为了让自己的钱包不至于太干瘪,目前流量也不太,就想着将服务器降配,降到2核4G上,我的钱袋子还能留点,但一看内存都飙到6-7G了,顿时给我浇了一盆冷水,毕竟做了大半年,现在放弃又很可惜,我该怎么办呢。

当时为了网站仿问效率比较高,采用memorycatch缓存技术,将首面内容、频道信息、分类信息、菜单信息以及页面主要参数进行了缓存,所对对内存要求比较高,但高到多少我心里也没有低,当时还沾沾自喜,用上了缓存技术。没办法,我只能泡到各大asp.net群里,问有没有办法降低内存的消耗,可能是我没有说清楚,搞了一周也没有问到好办法,问题就一直拖着。

内存高占用竟然降下去了

不知道什么原因,一下刺激我的脑回路,我服务器从买至今,都没有重启动过,试试万能启起行不行(之前帮朋友看过网吧,网管万技术,重启试试),哈哈,重启竟然生效。

事实告诉我,肯定是什么东东,偷偷的吃掉什么内存了,我就连续多天观察阿里云性能监控图表,哈哈,偷吃的贼被的逮到了。
sql server windows nt 64bit 内存占用过高解决办法
服务启重启后,随时间的推移,内存占用又起来了。这到底是什么情况呢,还要不要人活了,活还是要活着,毕竟好死不如癞活着。

好吧,咱们再去找罪魁祸首,通过服务器任务管理器观察,发现进程sql server windows nt 64bit 占用内存达到1G左右,元凶终到找到了。
sql server windows nt 64bit 内存占用过高解决办法

降内存的办法

解决的原理就是控制sqlserver消耗内存与释放内存的原因,经查文献和试验可知,SQL Server对服务器内存的使用策略是用多少内存就占用多少内存,只用在服务器内存不足时,才会释放一点占用的内存,至少释放多少,完全由sql server控制,所以SQL Server 服务器内存往往会占用很高。

SQL Server提供数据库脚本查徇内存占用情况
sql script: DBCC MemoryStatus
sql server windows nt 64bit 内存占用过高解决办法
这些内存一般都是Sql Server运行时候用作缓存的:

  1. 数据缓存:执行查询语句,Sql Server会将相关的数据内容(Sql Server操作的数据都是以页为单位的)加载到内存中进行缓存,以便于再次请求此页的数据的时候,直接从内存返回,大大提高了提取效率。
  2. 执行命令缓存:在执行存储过程,自定函数时,Sql Server需要先二进制编译再运行,编译后的结果也会缓存起来, 再次调用时就无需再次编译。

其它DBCC管理命令
DBCC FREEPROCCACHE 清除存储过程相关的缓存
DBCC FREESESSIONCACHE 会话缓存
DBCC FREESYSTEMCACHE(‘All’) 系统缓存
DBCC DROPCLEANBUFFERS 所有缓存

以上命令虽然会清除掉现有缓存,为新的缓存腾出空间,但是Sql server并不会因此释放掉已经占用的内存。Sql Server并没有提供任何命令允许我们释放不用到的内存。因此我们只能通过动态调整Sql Server可用的物理内存设置来强迫它释放内存。

限制Sql Server可用的物理内存设置步骤sql server windows nt 64bit 内存占用过高解决办法
sql server windows nt 64bit 内存占用过高解决办法
按以上步骤,设置sql占用内存的上限,就会让sqlserver在内存上限范围内,主动清除脏数据替换成热数据,不至少向吸血鬼一样,无休止占用内在。

这样我双十一就能顺利,将我的服务器下调一个档次,我也不担心用户的体验,如果有帮到各位,也请点一个赞,全是个人的真实经历。