服務器CPU繁忙或內存壓力引起網絡掉包的淺析與總結


 

最近一段時間遇到了兩起有意思的故障,現象都是網絡掉包或網絡斷開,不過這些只是表面現象,引起現象出現的本質才是我們需要關注的重點:

 

案例1:

 

平台   :VMware平台

操作系統 :Windows Server 2008 R2

現象描述 :Zabbix監控和開發人員反饋數據庫服務器出現偶爾掉包的現象。僅僅從掉包現象來分析,無法發現任何規律。

分析過程 :系統管理員在排除網絡設備故障后,在分析過程中,發現服務器的內存使用率非常高,而系統可用內存非常低;進一步分析,發現服務器內存32G,SQL Server設置的最大服務器內存為28G,但是在任務管理器中發現SQL Server消耗的內存大於28G,接近了30G。 這個是一個非常可疑的現象,於是我檢查了一下告警日志,還真的發現了一些蛛絲馬跡,如下截圖所示:

 

clip_image001

 

那些額外內存消耗是因為這台數據庫服務器部署了一些.NET 程序集造成的。數據庫由於內存壓力,將CLR代碼編寫的一些.NET 程序集(.NET assemblies)unload以便釋放一些內存資源。因為個人拖拉緣故,當時對程序集做做了一些分析和截圖,但是拖到現在才總結這篇博客,很多資料和截圖都找不到了。分析過后,我將SQL Server的max server memory (MB)調整為27648MB,監控分析發現,掉包現象消失了。這個是一個讓我比較在意的現象。也就是說內存壓力會造成網絡掉包現象。以前覺得只有CPU有壓力的時候,引起掉包現象,原來內存壓力也會導致這些現象出現!

 

 

 

案例2:上周五,一個數據庫服務器突然出現短暫幾分鍾的網絡中斷情況。

 

 

平台   :VMware平台

操作系統 :Windows Server 2012

 

現象描述 :服務器出現短暫幾分鍾的網絡中斷,應用程序和監控工具都無法訪問服務器

 

分析過程 :如下所示,Zabix監控發現出現幾分鍾網絡中斷的情況,在那個時間點, 服務器CPU出現了100%的情況,最終發現是一個復雜的用戶SQL導致服務器CPU彪增!

 

clip_image002

 

clip_image003

 

 

后面分析分析引起CPU彪增的原因是一個SQL語句,這個SQL的復雜度也確實震驚了我一下。實在太長、太復雜了。這里也不方便展示。

 

clip_image004

 

 

那么有意思的問題來了,如果CPU繁忙或內存壓力到會導致網絡掉包,那么正確、合理的解釋是? 本人在網絡這塊的知識實在欠缺,只能求助搜索引擎。

 

這篇文章淺談UDP(數據包長度,收包能力,丟包及進程結構選擇)有一些解釋(當然,文章主要介紹UDP掉包,而且是Linux平台,個人覺得完全可以忽略這些,借鑒其分析),摘抄如下:

 

 

2、服務器負載過高,占用了大量cpu資源,無法及時處理linux內核socket緩沖區中的udp數據包,導致丟包。

一般來說,服務器負載過高有兩個原因:收到的udp包過多;服務器進程存在性能瓶頸。如果收到的udp包過多,就要考慮擴容了。服務器進程存在性能瓶頸屬於性能優化的范疇,這里不作過多討論。

3、磁盤IO忙

服務器有大量IO操作,會導致進程阻塞,cpu都在等待磁盤IO,不能及時處理內核socket緩沖區中的udp數據包。如果業務本身就是IO密集型的,要考慮在架構上進行優化,合理使用緩存降低磁盤IO。

這里有一個容易忽視的問題:很多服務器都有在本地磁盤記錄日志的功能,由於運維誤操作導致日志記錄的級別過高,或者某些錯誤突然大量出現,使得往磁盤寫日志的IO請求量很大,磁盤IO忙,導致udp丟包。

對於運維誤操作,可以加強運營環境的管理,防止出錯。如果業務確實需要記錄大量的日志,可以使用內存log或者遠程log。

4、物理內存不夠用,出現swap交換

swap交換本質上也是一種磁盤IO忙,因為比較特殊,容易被忽視,所以單列出來。

只要規划好物理內存的使用,並且合理設置系統參數,可以避免這個問題。

 

 

另外Causes of Packet Loss and How to Fix Them這篇文章中,有個介紹,就是通信設備由於峰值緣故,導致設備的CPU或內存無法處理額外的通訊量,從而導致掉包。那么服務器由於CPU或內存資源被耗盡,導致其無法及時處理通信包,由於內部機制緣故,導致這些包被丟棄。這樣解釋也能解釋得通。當然深層次的解釋肯定有,可惜網上沒有看到這方面的分析文章,個人網絡這方面知識欠缺,積累不足,只能作罷!

 

 

2. Device (Router/Switch/Firewall/etc.) Performance

If your bandwidth is adequate, you can still face an issue if your router/switch/firewall is not able to keep up with the traffic.

Let’s take a scenario where you recently upgraded a link from 1Gb to 10Gb because traffic reports show that you were at full capacity during peak hours of the day. After the upgrade, your charts show the bandwidth going up to 1.5Gb, but you are still experiencing network performance issues. The issue could be that the device is not able to keep up with the traffic, and you have hit the maximum throughput your hardware can provide.

The traffic is reaching the device, but the device’s CPU or memory is maxed out and not able to handle extra traffic.

This results in packet loss for all traffic that is beyond the capacity of the box.

Remediation

You must replace the hardware with a new appliance that can handle your maximum throughput, or potentially cluster additional hardware to increase your throughput.

 

 

 

 

參考資料:

 

https://hexnet.jimdo.com/2013/12/16/%E7%BD%91%E7%BB%9C%E5%81%A5%E5%BA%B7%E6%A3%80%E6%9F%A5%E7%9A%84%E4%BA%94%E5%A4%A7%E5%85%B3%E6%B3%A8%E7%82%B9/

https://cloud.tencent.com/developer/article/1021196

https://www.annese.com/blog/what-causes-packet-loss


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM