问题描述
问题说明本人做了一个项目,是对网络日志接收封装上传的一个脚本程序,原来一直运行稳定,近日为了提高网络安全,将系统由win2003平台切换到win2008上。原先一切正常,在win2003接收网络日志时,平均每秒3万条网络日志进行处理,均无任何问题,网络日志的传输方式是udp方式。现已排除,程序无问题,网线无问题,硬件配置无问题,只是在原有的win2003转换为win2008,就出现了,每秒2千条数据都接收不到,直接内存溢出,瘫痪了,整个系统都会很卡。针对win2008的相关设置,也调整了很多,现在情况已经锁定只要实例化udp就直接系统内存溢出,不用进行任何读写操作。(client=newUdpClient(port);)我用的是vs2010.netframework4.0的运行环境。日志内容大致样式<188>2015-08-1211:31:48CCFW01BHW%%01SECLOG/4/SESSION_TEARDOWN(l):IPVer=4,Protocol=udp,SourceIP=10.191.171.73,DestinationIP=112.11.68.40,SourcePort=5041,DestinationPort=8586,SourceNatIP=111.26.30.38,SourceNatPort=9286,BeginTime=1439378976,EndTime=1439379109,SendPkts=12,SendBytes=1728,RcvPkts=8,RcvBytes=841,SourceVpnID=0,DestinationVpnID=0.求遇到过类似问题的朋友帮忙看一下,十分感谢
解决方案
解决方案二:
怎么看出来内存溢出的?
解决方案三:
服务器整体都会无响应了,但等个十秒还是秒操作还会有响应,内存已经顶都95以上了,32核服务器的,之前读三万条也就在40左右的内存消耗
解决方案四:
准确说是任务管理器中,udp实例化后,几秒后,CPU性能监控就封顶了,然后任务管理器也会无响应,因为我是线程编写的,所以程序还会正常运行,但是每秒也就读取一千多条了。
解决方案五:
防火墙关了吗
解决方案六:
防火墙分入站规则和出站规则如果你没有把端口添加进出站规则,那么你用udp打开某个端口之后,就会被禁止,然后几秒中之后才进入catch而你每秒有30000多条数据要处理,每条数据动态开个线程用udp发送的话,那么相当于内存里阻塞了几万个udp对象,当然就溢出了
解决方案七:
是这样,程序原先都是正常使用的,我只实例化了一次udp,在线程中就是一直读网络日志,没有重复实例化的,现在是我进行调试,只要实例化了udp,我断点就不动了,但是等几秒服务器就硬了,说明是我实例化udp后,内存空间就堆死了
解决方案八:
防火墙关了,要不是接不到数据的
解决方案九:
usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Net;usingSystem.Net.Sockets;usingSystem.Threading;usingSystem.IO;usingSystem.Text.RegularExpressions;//程序中使用到线程namespaceZBRSA{publicpartialclassForm1:Form{publicForm1(){InitializeComponent();this.UINotifaction+=newEventHandleUINotifaction(Main_UINotifaction);}privateUdpClientclient;//创建UDP网络服务privateintport;//端口号privateIPEndPointreceivePoint;privatestringip;privatedelegatevoidEventHandleUINotifaction(stringnum,stringneirong);privateeventEventHandleUINotifactionUINotifaction;privatevoidMain_UINotifaction(stringnum,stringneirong){textBox1.Text=num;}intxianchengshuliang;stringxitongshezhi;stringdatmingcheng;privatevoidForm1_Load(objectsender,EventArgse){FileStreamfs;StreamReadersr;fs=newFileStream(Application.StartupPath+"\Systemsettings.txt",FileMode.Open,FileAccess.Read);sr=newStreamReader(fs,Encoding.GetEncoding("UTF-8"));xitongshezhi=sr.ReadToEnd();xianchengshuliang=Convert.ToInt32(xitongshezhi.Split(';')[0].Split(':')[1]);textBox2.Text=xitongshezhi.Split(';')[3].Split(':')[1];ip=xitongshezhi.Split(';')[1].Split(':')[1];port=Convert.ToInt32(xitongshezhi.Split(';')[2].Split(':')[1]);datmingcheng=xitongshezhi.Split(';')[4].Split(':')[1];sr.Close();sr.Dispose();fs.Dispose();button1_Click(sender,e);}privatevoidbutton1_Click(objectsender,EventArgse){if(checkBox1.Checked==false&&checkBox2.Checked==false){MessageBox.Show("Sorry,youmustselectareceptionformat");return;}shifoucsv=checkBox1.Checked?true:false;shifoudat=checkBox2.Checked?true:false;//stringa=listBox1.Items[1].ToString();timer1.Interval=Convert.ToInt32(textBox2.Text)*1000;timer1.Start();label4.Text="Go";receivePoint=newIPEndPoint(IPAddress.Parse(ip),port);thread=newThread(newThreadStart(threadProc));thread.Priority=ThreadPriority.Highest;thread.Start();}boolshifoucsv=false;boolshifoudat=false;Threadthread;intshuliang=0;boolcontinueLoop=true;boolxianshi=false;FileStreamMuBan_FW;StreamWriterMuBan_SW;FileStreamMuBan_FW2;StreamWriterMuBan_SW2;intshuliangnum=0;privatevoidthreadProc(){continueLoop=true;client=newUdpClient(port);//IPAddressHostIP;byte[]recData;//byte[]sendData;shuliang=0;//stringsendString="";stringa="";System.Text.ASCIIEncodingencode=newSystem.Text.ASCIIEncoding();string[]num;object[]obj={shuliang.ToString(),""};this.Invoke(this.UINotifaction,obj);MuBan_FW2=newFileStream(Application.StartupPath+"\Thread"+(shuliangnum%xianchengshuliang).ToString()+"\FWLOG_"+datmingcheng+"_"+DateTime.Now.AddHours(8).ToString("yyyyMMddHHmmss")+"_0000.csv",FileMode.Create);MuBan_SW2=newStreamWriter(MuBan_FW2,Encoding.GetEncoding("UTF-8"));shuliangnum++;while(continueLoop){a="";try{recData=client.Receive(refreceivePoint);a=encode.GetString(recData);if(a!=""){shuliang++;MuBan_SW2.WriteLine(a);num=a.Split(',');if(xianshi){shuliang++;obj=newstring[]{shuliang.ToString(),a};this.Invoke(this.UINotifaction,obj);xianshi=false;shuliang=0;MuBan_SW2.Close();MuBan_FW2.Close();MuBan_FW2=newFileStream(Application.StartupPath+"\Thread"+(shuliangnum%xianchengshuliang).ToString()+"\FWLOG_"+datmingcheng+"_"+DateTime.Now.AddHours(8).ToString("yyyyMMddHHmmss")+"_0000.csv",FileMode.Create);//指定抒写格式MuBan_SW2=newStreamWriter(MuBan_FW2,Encoding.GetEncoding("UTF-8"));shuliangnum++;}}}catch{}}obj=newstring[]{shuliang.ToString(),a};this.Invoke(this.UINotifaction,obj);MuBan_SW2.Close();MuBan_FW2.Close();client.Close();thread.Abort();}privatevoidbutton2_Click(objectsender,EventArgse){label4.Text="Stop";continueLoop=false;}privatevoidtimer1_Tick(objectsender,EventArgse){//continueLoop=false;xianshi=true;}privatevoidForm1_FormClosing(objectsender,FormClosingEventArgse){thread.Abort();Application.Exit();}}}
解决方案十:
WInForm??你改用控制台运行试试
解决方案十一:
引用6楼oZiBing的回复:
是这样,程序原先都是正常使用的,我只实例化了一次udp,在线程中就是一直读网络日志,没有重复实例化的,现在是我进行调试,只要实例化了udp,我断点就不动了,但是等几秒服务器就硬了,说明是我实例化udp后,内存空间就堆死了
个人建议1.先把streamwriter的相关操作屏蔽,也就是只接收,不存储,运行看看服务器是不是会死掉;2.程序中的try。。。catch,为何catch中是空的?也可能就是因为循环中的异常导致的问题在catch中加上文件日志3.调试高频通讯类的软件,不要使用断点,而多用文件日志
解决方案十二:
是的,我在实际调试时候已经把文件写入都注视了,catch是因为报错就读取下一条网络日志,这个脚本是需要二十四小时运行的,现在没有报错,现在是只要代码启用后,udp实例化后,直接cpu就堆死了,直接cpu就顶到了百分百,我哪怕不在做任何操作,只要udp的实例化不关闭,服务器的CPU就会一直堆死的,很卡
解决方案十三:
是winform,我改控制台?然后我注意看什么,麻烦说细一点,谢谢了
解决方案十四:
引用11楼oZiBing的回复:
是的,我在实际调试时候已经把文件写入都注视了,catch是因为报错就读取下一条网络日志,这个脚本是需要二十四小时运行的,现在没有报错,现在是只要代码启用后,udp实例化后,直接cpu就堆死了,直接cpu就顶到了百分百,我哪怕不在做任何操作,只要udp的实例化不关闭,服务器的CPU就会一直堆死的,很卡
在catch中添加日志信息才能判定有没有异常吧既然是调试,可以先把try。。。catch去掉,让异常暴露出来个人建议不要轻易怀疑udpclient,重点放在其他处理流程上
解决方案十五:
是这样,你说的这种调试过程,我肯定都处理过了,出现异常就是直接跳转到catch中的,哪怕我不捕捉,我现在就是把异常处理拿掉,程序也是正常跑,现在程序不是不好使,是性能上不去,我用win2003接收网络日志,每秒是三万,现在每秒2000都接不到,而且CPU还会堆死,就是这样所以我在针对代码,一句一等,看CPU状况,这样才试出来,是在udp初始化后,服务器的CPU就堆死了,程序没变,在win2003上,脚本都跑一年多了,换2008性能就上不去了
解决方案:
不知是否有帮助:UDP负载很重的基于WindowsServer2008R2服务器时发生CPU使用率过高https://support.microsoft.com/zh-cn/kb/2685007
解决方案:
引用15楼akuma8848的回复:
不知是否有帮助:UDP负载很重的基于WindowsServer2008R2服务器时发生CPU使用率过高https://support.microsoft.com/zh-cn/kb/2685007
谢谢你的方法,我看和我的症状是一样的,但是我一直下载不下来这个补丁包。。麻烦朋友您,告诉我一下,我进行下测试,谢谢了。
解决方案:
填写邮件地址后,发送到邮箱有个链接http://hotfixv4.microsoft.com/Windows%207/Windows%20Server2008%20R2%20SP1/sp2/Fix401711/7600/free/447595_intl_x64_zip.exe