问题:
本人仓库管理系统厂家,项目上反应生产线箱码不能上传到我们系统,我们的WMS软件退出后重新登录也一直登录失败,并且服务器上数据库占用内存过高,SSMS数据库连接不上。
好家伙SQL Server占用了34个G内存。
接口日志中连接数据库报错:System.Data.SqlClient.SqlException: 当前命令发生了严重错误。应放弃任何可能产生的结果。
临时处理
趁着问题还在,然后查问题,查了半天没找到问题原因,最后重启服务器,让现场先用。
后面发现只需要在任务管理器中右键关闭,然后在服务中重启SQL Server服务,不用重启服务器。
网上查资料
然后开始查资料,发现SQL server存在这个问题,我们给他分配多少内存,他就会不停的占用,中间不会释放,直到分配内存快要占满的时候才会释放一点点内存。大部分给的解决方案就是吧内存分配到合理范围就行。
实际情况
我按照网上资料把数据库内存调整到7个G(大致),观察了一会儿,发现确实快达到7个G的时候,会清理一些。
但是,存在问题,我分配7个G,正常不会超过7个G内存,按理来说,快到7个G它会自动释放一些(网上说是不足4M时候).但是不知道什么情况下突然占用就超过了7个G导致SQL Server 无内存可用,然后拒绝所有新的连接(目前根据情况推测是这样导致的连接不上数据库)。
推测超过分配内存的原因可能是,数据库的表太大了,客户那边有人查询的时候会瞬间占用几十M的内存,瞬间超过了最多可用内存(分配7个G)。然后SQL Server就不管了,也不清理,直接摆烂???
目前处理办法
无意中发现电脑管家的小火箭能够清理内存,SQL Server 占用很多内存,一下清空了。
但是总不能每天上来点一下腾讯电脑管家的小火箭吧。
然后一直找腾讯电脑管家自动发射火箭,结果没有找到,最多有一个自动清理垃圾。
在设置中发现了一个双击Alt按键就可以发射火箭清理内存。
然后想了一个“曲线救国”的办法。
服务器上有一个接口软件有定时任务,在定时任务中加了一段键盘双击Alt的代码。让定时任务触发双击Alt,然后发射火箭,清理内存。目前还在测试阶段。。。
//内存,可用空间
PerformanceCounter ramCounter = new PerformanceCounter("Memory", "Available MBytes");
//16208是我电脑的全部内存(MB)
Console.WriteLine($"清理前,内存占用:{(16208 - ramCounter.NextValue()) / 162}%");
SendKeys.Send("%");//发送Alt就是用%。
Thread.Sleep(100);
SendKeys.Send("%");
Thread.Sleep(5000);//等待5s,小火箭发射完成
Console.WriteLine($"清理后,内存占用:{((16208-ramCounter.NextValue())/162)}%");
也许需要清理一下数据库中的某些表,删除一些历史数据才能好一些。
目前我这边处理是这样,不知道有没有其他处理办法。。