异常情况:
1. 引发类型为“System.OutOfMemoryException”的异常。
2. 存储空间不足,无法处理此命令。 (异常来自 HRESULT:0x80070008)
3. Out of memory
服务端启动后,开始监听客户端的请求信息,但是服务端运行一段时间(目前约在1周左右),服务端Socket监听失效,记录下错误日志,含以上3个异常类型。服务端Soket监听客户端服务已经失效了,重启后正常运行。
异常排查步骤:
1.运行环境的内存以及存储空间都是很足的,问题原因只能是出在服务端程序上面。
2.最开始怀疑是我们使用的SQLite数据库不稳定导致,经过代码排查,以及查询资料信息,唯一可信的是加上线程池 Pooling=true ,加上后观察运行后,异常依然存在。
3.没办法只能进行模拟重现问题,编写一个自动连接服务端的程序(开启多个测试程序),并随机发送访问服务端各个命令。捕捉异常信息,定位到异常抛出的问题行代码。
(1)
在 EasyFramework.LocalMachine.GetWmiObject(String className, WmiObjectMatch macth) 位置 F:\WorkSpace\Easy Framework\Source Code\Easy Framework\EasyFramework.Core\LocalMachine.cs:行号 102
在 EasyFramework.LocalMachine.GetNetworkInfo(String& ipv4, String& ipv6, String& macAddress) 位置 F:\WorkSpace\Easy Framework\Source Code\Easy Framework\EasyFramework.Core\LocalMachine.cs:行号 72
在 EasyFramework.LocalMachine.get_IPv4() 位置 F:\WorkSpace\Easy Framework\Source Code\Easy Framework\EasyFramework.Core\LocalMachine.cs:行号 179(2)在 LandTop.DbSync.Helper.Common.Log.StartThread() 位置 F:\WorkSpace\ATOM Server\Branch\20171211_镜像服务\LandTop.DbSync.Helper\Common\Log.cs:行号 57
在 LandTop.DbSync.Helper.Common.Log..ctor() 位置 F:\WorkSpace\ATOM Server\Branch\20171211_镜像服务\LandTop.DbSync.Helper\Common\Log.cs:行号 50
好家伙,经过8个小时的模拟,终于逮到了。
原因:1,在客户端获取服务端IP命令时,用Win32_NetworkAdapterConfiguration 去读取系统IP,抛出了内存溢出异常。
2.记录异常日志时,实例化Log对象太多了,系统垃圾回收并未来得及回收。
解决:1.利用Sqlite数据库,存储系统的IP地址,不用每次客户端请求就用Win32_NetworkAdapterConfiguration去读取;
2.私有化公用Log类,进行统一的日志记录,千万不能多次实例化Log,以及类似的对象。
代码改造后,进行压力测试,目前已安全稳定运行。
总结:
1.服务端程序一定要进行,压力测试。
2.服务端程序一定要进行,压力测试。
3.服务端程序一定要进行,压力测试。