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

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 内存占用过高解决办法_第1张图片
购买ECS花费我近1700大洋,各位看官估计都认为我人傻钱多,据后来事实验证,我确实是人傻,但钱不多。
sql server windows nt 64bit 内存占用过高解决办法_第2张图片
数据库方面,考虑自己对microsoft sqlserver最熟,另一个是出于对版权的考虑,再一个是轻量,所以采用express版本,至于与standard版本,是否有效率上的差异,我也拿不太准,有待进一步测试。

内存占用居高不下

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

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

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

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

内存高占用竟然降下去了

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

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

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

降内存的办法

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

SQL Server提供数据库脚本查徇内存占用情况
sql script: DBCC MemoryStatus
sql server windows nt 64bit 内存占用过高解决办法_第6张图片
这些内存一般都是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 内存占用过高解决办法_第7张图片
sql server windows nt 64bit 内存占用过高解决办法_第8张图片
按以上步骤,设置sql占用内存的上限,就会让sqlserver在内存上限范围内,主动清除脏数据替换成热数据,不至少向吸血鬼一样,无休止占用内在。

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

你可能感兴趣的:(数据库,sqlserver,内存占用过高,memory,hight,数据库)