异常情况:

 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.服务端程序一定要进行,压力测试。