代码改变世界

服务器CPU繁忙或内存压力引起网络掉包的浅析与总结

2018-06-17 11:19  潇湘隐者  阅读(5070)  评论(0编辑  收藏  举报

 

最近一段时间遇到了两起有意思的故障,现象都是网络掉包或网络断开,不过这些只是表面现象,引起现象出现的本质才是我们需要关注的重点:

 

案例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