我的广告服务器罢工了?

来源:互联网 发布:淘宝个人店铺假货 编辑:程序博客网 时间:2024/05/16 09:03

   刚要下班,运维部门的同事打电话来说,一个广告服务器(UDP服务器)不接收数据了。我跑到他们部门一看,果然。界面上显示接收数据包数量和速度都没有变化了。据他们介绍,以前一直不出这个问题,但现在特别频繁。一般运行10多分钟可能就出问题了。
   好事啊,出现故障的频率这么高,找到问题就很easy了。
   我申请好权限,登录到服务器上去观察。
   是什么原因使服务器不接收数据包了呢?
 
 1.服务器收到的包太多,把底层网络堵塞了?
    这种情况在流量上表现应该是下载流量一路上升,到最高点后,突然直线下降,甚至没下载流量了。
 可是观看流量监控后,没这种症状。而且运维部的同事说,广告服务器上的流量并不大。
 那就不是这个问题了。至少可以先放一边。
 
 2.死锁?
   如果接收和处理消息的线程死锁,会接收不到数据的。
 但是界面还能动,最主要的是点击界面上的“停止服务”按钮,再开启服务时,它又可以接收数据了。
 肯定不是死锁了

 3.那就是接收消息的线程不工作了
   怎么证明呢?
   还好,这个广告服务器是一个UDP服务器,只有一个端口来接收和发送数据
 上传一个PE,用它观察了服务器进程的网络信息,发现已经没有UDP服务了,就是 UDP socket被closesocket了。
   当我停止服务,再开启服务(进程没退出)时,又看到UDP服务在运行了。
   肯定是接收消息的线程循环里处理错误不当,退出了线程。
 
   看了代码后,发现广告服务器是用以前同事写的一个简单UDP框架来处理数据包的。而且发生错误后,只处理了10054这个错误,其他的错误发生时,就退出了消息循环。那要是如果有人破坏或客户端代码的bug,发送了一个比较大的udp数据包,就会发生错误,得到WSAEMSGSIZE错误代码。。。
 这样服务器就罢工了。。。
 
   为了验证我的猜想。我在接收和处理消息循环的工作线程中,可能退出的地方都写上了日志。然后放到服务器上去。
   可是郁闷的是不接收数据包的症状不发生了,都过了几个小时了。。。
   没法,就放着运行吧。。。没事就上去看看。。。。 

原创粉丝点击