我的廣告服務器罷工了?

   剛要下班,運維部門的同事打電話來說,一個廣告服務器(UDP服務器)不接收數據了。我跑到他們部門一看,果然。界面上顯示接收數據包數量和速度都沒有變化了。據他們介紹,以前一直不出這個問題,但現在特別頻繁。一般運行10多分鐘可能就出問題了。
   好事啊,出現故障的頻率這麼高,找到問題就很easy了。
   我申請好權限,登錄到服務器上去觀察。
   是什麼原因使服務器不接收數據包了呢?
 
 1.服務器收到的包太多,把底層網絡堵塞了?
    這種情況在流量上表現應該是下載流量一路上升,到最高點後,突然直線下降,甚至沒下載流量了。
 可是觀看流量監控後,沒這種症狀。而且運維部的同事說,廣告服務器上的流量並不大。
 那就不是這個問題了。至少可以先放一邊。
 
 2.死鎖?
   如果接收和處理消息的線程死鎖,會接收不到數據的。
 但是界面還能動,最主要的是點擊界面上的“停止服務”按鈕,再開啓服務時,它又可以接收數據了。
 肯定不是死鎖了

 3.那就是接收消息的線程不工作了
   怎麼證明呢?
   還好,這個廣告服務器是一個UDP服務器,只有一個端口來接收和發送數據
 上傳一個PE,用它觀察了服務器進程的網絡信息,發現已經沒有UDP服務了,就是 UDP socket被closesocket了。
   當我停止服務,再開啓服務(進程沒退出)時,又看到UDP服務在運行了。
   肯定是接收消息的線程循環裏處理錯誤不當,退出了線程。
 
   看了代碼後,發現廣告服務器是用以前同事寫的一個簡單UDP框架來處理數據包的。而且發生錯誤後,只處理了10054這個錯誤,其他的錯誤發生時,就退出了消息循環。那要是如果有人破壞或客戶端代碼的bug,發送了一個比較大的udp數據包,就會發生錯誤,得到WSAEMSGSIZE錯誤代碼。。。
 這樣服務器就罷工了。。。
 
   爲了驗證我的猜想。我在接收和處理消息循環的工作線程中,可能退出的地方都寫上了日誌。然後放到服務器上去。
   可是鬱悶的是不接收數據包的症狀不發生了,都過了幾個小時了。。。
   沒法,就放着運行吧。。。沒事就上去看看。。。。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章