udp 接收网络日志,导致服务器内存溢出,求解决!!!!!

紫o冰 2015-08-12 11:31:48
问题说明
本人做了一个项目,是对网络日志接收封装上传的一个脚本程序,原来一直运行稳定,近日为了提高网络安全,将系统由win2003平台切换到win2008上。
原先一切正常,在win2003接收网络日志时,平均每秒3万条网络日志进行处理,均无任何问题,网络日志的传输方式是udp方式。
现已排除,程序无问题,网线无问题,硬件配置无问题,只是在原有的win2003转换为win2008,就出现了,每秒2千条数据都接收不到,直接内存溢出,瘫痪了,整个系统都会很卡。针对win2008的相关设置,也调整了很多,现在情况已经锁定只要实例化udp就直接系统内存溢出,不用进行任何读写操作。(client = new UdpClient(port);)
我用的是vs2010 .net framework 4.0的运行环境。
日志内容大致样式
<188>2015-08-12 11:31:48 CCFW01BHW %%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.

求遇到过类似问题的朋友帮忙看一下,十分感谢
...全文
573 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
Anymore 2015-08-16
  • 打赏
  • 举报
回复
填写邮件地址后,发送到邮箱有个链接 http://hotfixv4.microsoft.com/Windows%207/Windows%20Server2008%20R2%20SP1/sp2/Fix401711/7600/free/447595_intl_x64_zip.exe
於黾 2015-08-12
  • 打赏
  • 举报
回复
防火墙分入站规则和出站规则 如果你没有把端口添加进出站规则,那么你用udp打开某个端口之后,就会被禁止,然后几秒中之后才进入catch 而你每秒有30000多条数据要处理,每条数据动态开个线程用udp发送的话,那么相当于内存里阻塞了几万个udp对象,当然就溢出了
於黾 2015-08-12
  • 打赏
  • 举报
回复
防火墙关了吗
紫o冰 2015-08-12
  • 打赏
  • 举报
回复
准确说是任务管理器中,udp实例化后,几秒后,CPU性能监控就封顶了,然后任务管理器也会无响应,因为我是线程编写的,所以程序还会正常运行,但是每秒也就读取一千多条了。
紫o冰 2015-08-12
  • 打赏
  • 举报
回复
服务器整体都会无响应了,但等个十秒还是秒操作还会有响应,内存已经顶都95以上了,32核服务器的,之前读三万条也就在40左右的内存消耗
Poopaye 2015-08-12
  • 打赏
  • 举报
回复
怎么看出来内存溢出的?
紫o冰 2015-08-12
  • 打赏
  • 举报
回复
引用 15 楼 akuma8848 的回复:
不知是否有帮助:UDP 负载很重的基于 Windows Server 2008 R2 服务器时发生 CPU 使用率过高 https://support.microsoft.com/zh-cn/kb/2685007
谢谢你的方法,我看和我的症状是一样的,但是我一直下载不下来这个补丁包。。麻烦朋友您,告诉我一下,我进行下测试,谢谢了。
Anymore 2015-08-12
  • 打赏
  • 举报
回复
不知是否有帮助:UDP 负载很重的基于 Windows Server 2008 R2 服务器时发生 CPU 使用率过高 https://support.microsoft.com/zh-cn/kb/2685007
紫o冰 2015-08-12
  • 打赏
  • 举报
回复
是这样,你说的这种调试过程,我肯定都处理过了,出现异常就是直接跳转到catch中的,哪怕我不捕捉,我现在就是把异常处理拿掉,程序也是正常跑,现在程序不是不好使,是性能上不去,我用win2003接收网络日志,每秒是三万,现在每秒2000都接不到,而且CPU还会堆死,就是这样所以我在针对代码,一句一等,看CPU状况,这样才试出来,是在udp初始化后,服务器的CPU就堆死了,程序没变,在win2003上,脚本都跑一年多了,换2008性能就上不去了
xian_wwq 2015-08-12
  • 打赏
  • 举报
回复
引用 11 楼 oZiBing 的回复:
是的,我在实际调试时候已经把文件写入都注视了,catch是因为报错就读取下一条网络日志,这个脚本是需要二十四小时运行的,现在没有报错,现在是只要代码启用后,udp实例化后,直接cpu就堆死了,直接cpu就顶到了百分百,我哪怕不在做任何操作,只要udp的实例化不关闭,服务器的CPU就会一直堆死的,很卡
在catch中添加日志信息才能判定有没有异常吧 既然是调试,可以先把try。。。catch去掉,让异常暴露出来 个人建议不要轻易怀疑udpclient,重点放在其他处理流程上
紫o冰 2015-08-12
  • 打赏
  • 举报
回复
是winform,我改控制台?然后我注意看什么,麻烦说细一点,谢谢了
紫o冰 2015-08-12
  • 打赏
  • 举报
回复
是的,我在实际调试时候已经把文件写入都注视了,catch是因为报错就读取下一条网络日志,这个脚本是需要二十四小时运行的,现在没有报错,现在是只要代码启用后,udp实例化后,直接cpu就堆死了,直接cpu就顶到了百分百,我哪怕不在做任何操作,只要udp的实例化不关闭,服务器的CPU就会一直堆死的,很卡
xian_wwq 2015-08-12
  • 打赏
  • 举报
回复
引用 6 楼 oZiBing 的回复:
是这样,程序原先都是正常使用的,我只实例化了一次udp,在线程中就是一直读网络日志,没有重复实例化的,现在是我进行调试,只要实例化了udp,我断点就不动了,但是等几秒服务器就硬了,说明是我实例化udp后,内存空间就堆死了
个人建议 1.先把streamwriter的相关操作屏蔽,也就是只接收,不存储, 运行看看服务器是不是会死掉; 2.程序中的try。。。catch,为何catch中是空的? 也可能就是因为循环中的异常导致的问题 在catch中加上文件日志 3.调试高频通讯类的软件,不要使用断点,而多用文件日志
本拉灯 2015-08-12
  • 打赏
  • 举报
回复
WInForm?? 你改用控制台运行试试
紫o冰 2015-08-12
  • 打赏
  • 举报
回复
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net; using System.Net.Sockets; using System.Threading; using System.IO; using System.Text.RegularExpressions; //程序中使用到线程 namespace ZBRSA { public partial class Form1 : Form { public Form1() { InitializeComponent(); this.UINotifaction += new EventHandleUINotifaction(Main_UINotifaction); } private UdpClient client; //创建UDP网络服务 private int port ; //端口号 private IPEndPoint receivePoint; private string ip ; private delegate void EventHandleUINotifaction(string num, string neirong); private event EventHandleUINotifaction UINotifaction; private void Main_UINotifaction(string num, string neirong) { textBox1.Text = num; } int xianchengshuliang; string xitongshezhi; string datmingcheng; private void Form1_Load(object sender, EventArgs e) { FileStream fs; StreamReader sr; fs = new FileStream(Application.StartupPath + "\\System settings.txt", FileMode.Open, FileAccess.Read); sr = new StreamReader(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); } private void button1_Click(object sender, EventArgs e) { if (checkBox1.Checked == false && checkBox2.Checked == false) { MessageBox.Show("Sorry, you must select a reception format"); return; } shifoucsv = checkBox1.Checked ? true : false; shifoudat = checkBox2.Checked ? true : false; //string a=listBox1.Items[1].ToString(); timer1.Interval = Convert.ToInt32(textBox2.Text) * 1000; timer1.Start(); label4.Text = "Go"; receivePoint = new IPEndPoint(IPAddress.Parse(ip), port); thread = new Thread(new ThreadStart(threadProc)); thread.Priority = ThreadPriority.Highest; thread.Start(); } bool shifoucsv = false; bool shifoudat = false; Thread thread; int shuliang = 0; bool continueLoop = true; bool xianshi = false; FileStream MuBan_FW; StreamWriter MuBan_SW; FileStream MuBan_FW2; StreamWriter MuBan_SW2; int shuliangnum = 0; private void threadProc() { continueLoop = true; client = new UdpClient(port); //IPAddress HostIP; byte[] recData; //byte[] sendData; shuliang = 0; //string sendString = ""; string a = ""; System.Text.ASCIIEncoding encode = new System.Text.ASCIIEncoding(); string[] num; object[] obj = { shuliang.ToString(), "" }; this.Invoke(this.UINotifaction, obj); MuBan_FW2 = new FileStream(Application.StartupPath + "\\Thread" + (shuliangnum % xianchengshuliang).ToString() + "\\FWLOG_" + datmingcheng + "_" + DateTime.Now.AddHours(8).ToString("yyyyMMddHHmmss") + "_0000.csv", FileMode.Create); MuBan_SW2 = new StreamWriter(MuBan_FW2, Encoding.GetEncoding("UTF-8")); shuliangnum++; while (continueLoop) { a = ""; try { recData = client.Receive(ref receivePoint); a = encode.GetString(recData); if (a != "") { shuliang++; MuBan_SW2.WriteLine(a); num = a.Split(','); if (xianshi) { shuliang++; obj = new string[] { shuliang.ToString(), a }; this.Invoke(this.UINotifaction, obj); xianshi = false; shuliang = 0; MuBan_SW2.Close(); MuBan_FW2.Close(); MuBan_FW2 = new FileStream(Application.StartupPath + "\\Thread" + (shuliangnum % xianchengshuliang).ToString() + "\\FWLOG_" + datmingcheng + "_" + DateTime.Now.AddHours(8).ToString("yyyyMMddHHmmss") + "_0000.csv", FileMode.Create); //指定抒写格式 MuBan_SW2 = new StreamWriter(MuBan_FW2, Encoding.GetEncoding("UTF-8")); shuliangnum++; } } } catch { } } obj = new string[] { shuliang.ToString(), a }; this.Invoke(this.UINotifaction, obj); MuBan_SW2.Close(); MuBan_FW2.Close(); client.Close(); thread.Abort(); } private void button2_Click(object sender, EventArgs e) { label4.Text = "Stop"; continueLoop = false; } private void timer1_Tick(object sender, EventArgs e) { //continueLoop = false; xianshi = true; } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { thread.Abort(); Application.Exit(); } } }
紫o冰 2015-08-12
  • 打赏
  • 举报
回复
防火墙关了,要不是接不到数据的
紫o冰 2015-08-12
  • 打赏
  • 举报
回复
是这样,程序原先都是正常使用的,我只实例化了一次udp,在线程中就是一直读网络日志,没有重复实例化的,现在是我进行调试,只要实例化了udp,我断点就不动了,但是等几秒服务器就硬了,说明是我实例化udp后,内存空间就堆死了

111,125

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧