服务器CPU繁忙或内存压力引起网络掉包的浅析与总结
最近一段时间遇到了两起有意思的故障,现象都是网络掉包或网络断开,不过这些只是表面现象,引起现象出现的本质才是我们需要关注的重点:
案例1:
平台 :VMware平台
操作系统 :Windows Server 2008 R2
现象描述 :Zabbix监控和开发人员反馈数据库服务器出现偶尔掉包的现象。仅仅从掉包现象来分析,无法发现任何规律。
分析过程 :系统管理员在排除网络设备故障后,在分析过程中,发现服务器的内存使用率非常高,而系统可用内存非常低;进一步分析,发现服务器内存32G,SQL Server设置的最大服务器内存为28G,但是在任务管理器中发现SQL Server消耗的内存大于28G,接近了30G。 这个是一个非常可疑的现象,于是我检查了一下告警日志,还真的发现了一些蛛丝马迹,如下截图所示:

那些额外内存消耗是因为这台数据库服务器部署了一些.NET 程序集造成的。数据库由于内存压力,将CLR代码编写的一些.NET 程序集(.NET assemblies)unload以便释放一些内存资源。因为个人拖拉缘故,当时对程序集做做了一些分析和截图,但是拖到现在才总结这篇博客,很多资料和截图都找不到了。分析过后,我将SQL Server的max server memory (MB)调整为27648MB,监控分析发现,掉包现象消失了。这个是一个让我比较在意的现象。也就是说内存压力会造成网络掉包现象。以前觉得只有CPU有压力的时候,引起掉包现象,原来内存压力也会导致这些现象出现!
案例2:上周五,一个数据库服务器突然出现短暂几分钟的网络中断情况。
平台 :VMware平台
操作系统 :Windows Server 2012
现象描述 :服务器出现短暂几分钟的网络中断,应用程序和监控工具都无法访问服务器
分析过程 :如下所示,Zabix监控发现出现几分钟网络中断的情况,在那个时间点, 服务器CPU出现了100%的情况,最终发现是一个复杂的用户SQL导致服务器CPU彪增!


后面分析分析引起CPU彪增的原因是一个SQL语句,这个SQL的复杂度也确实震惊了我一下。实在太长、太复杂了。这里也不方便展示。

那么有意思的问题来了,如果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
服务器CPU繁忙或内存压力引起网络掉包的浅析与总结的更多相关文章
- 查看Linux服务器CPU使用率、内存使用率、磁盘空间占用率、负载情况
[root@server script]# vi monitor.py #!/usr/bin/env python # -*- coding:utf-8 -*- #Author: nulige imp ...
- Linux服务器CPU、内存、磁盘空间、负载情况查看python脚本
[本文出自天外归云的博客园] 网上搜,东拼西凑,组装了一个可以查Linux服务器CPU使用率.内存使用率.磁盘空间占用率.负载情况的python脚本. 脚本内容如下: # -*- coding:utf ...
- [转]检测SQLSERVER数据库CPU瓶颈及内存瓶颈
在任务管理器中看到sql server 2000进程的内存占用,而在sql server 2005中,不能在任务管理器中查看sql server 2005进程的内存占用,要用 以下语句查看sql se ...
- [故障公告] 13:52-14:03,访问量突增,博客web服务器CPU 100%
13:52-14:03,由于访问量突增,博客web服务器全线CPU 100%,造成博客站点不正常访问,由此给您带来麻烦,请您谅解. 为了迎接访问量的增长给web服务器CPU带来的巨大压力,上周我们已经 ...
- [No0000112]ComputerInfo,C#获取计算机信息(cpu使用率,内存占用率,硬盘,网络信息)
github地址:https://github.com/charygao/SmsComputerMonitor 软件用于实时监控当前系统资源等情况,并调用接口,当资源被超额占用时,发送警报到个人手机: ...
- Python获取CPU、内存使用率以及网络使用状态代码
Python获取CPU.内存使用率以及网络使用状态代码_python_脚本之家 http://www.jb51.net/article/134714.htm
- 阿里云ECS服务器,修改实例密码,查看CPU核数,内存,阿里云服务器关机了怎么办?
新买的ECS服务器是没有密码的,需要重置密码(root,P@ssw0rd),并重启: 查看CPU核数和内存: 阿里云服务器关机了,不用怕,登录阿里云,可以启动和关闭
- linux下实现CPU使用率和内存使用率获取方法
想获取一下目标机运行时linux系统的硬件占用情况,写了这几个小程序,以后直接用了. 方法就是读取proc下的文件来获取了. cpu使用率: /proc/stat ,内存使用情况: /p ...
- Sql Server 内存相关计数器以及内存压力诊断
在数据库服务器中,内存是数据库对外提供服务最重要的资源之一, 不仅仅是Sql Server,包括其他数据库,比如Oracle,MySQL等,都是一类非常喜欢内存的应用. 在Sql Server服务器中 ...
随机推荐
- Android--解析XML之DOM
前言 前面已经介绍了Android平台下两种解析XML的方法,SAX和PULL,这两个均为事件驱动,以流的形式解析XML文档.现在介绍一种新的方式DOM方式解析XML. DOM是一种用于XML文档对象 ...
- [NewLife.XCode]增删改查入门
NewLife.XCode是一个有10多年历史的开源数据中间件,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和运行日志来进行深入分析,蕴含 ...
- Linux软件包管理之源码包、脚本安装包
目录 1.源码包和RPM包的区别 RPM包和源码包默认安装位置: 由于安装位置不同带来的影响 2.源码包安装 ①.安装准备 ②.安装注意事项 ③.安装源码包 3.源码包卸载 4.脚本安装包 5.总结 ...
- mysql常用字符串操作函数大全,以及实例
今天在论坛中看到一个关于mysql的问题,问题如下 good_id cat_id12654 665,56912655 601,4722 goods_id是商品i ...
- 微软改名部又出动啦!微软宣布VSTS改名为Azure DevOps
本篇为翻译,原文地址:https://azure.microsoft.com/en-us/blog/introducing-azure-devops/ 作者:Jamie Cool,Azure DevO ...
- java 8 双冒号运算符
前言 java8增加了双冒号运算符.lambda本质上都是语法糖,学习过C#委托.匿名委托再理解java8中的双冒号运算符就容易多了.双冒号就是把方法当作参数传递给需要的方法,或者说是传递到strea ...
- NLP入门(五)用深度学习实现命名实体识别(NER)
前言 在文章:NLP入门(四)命名实体识别(NER)中,笔者介绍了两个实现命名实体识别的工具--NLTK和Stanford NLP.在本文中,我们将会学习到如何使用深度学习工具来自己一步步地实现N ...
- c# 判断3个数是否连续最优式子
Math.Abs((own - two) * (two - there) * + ) ==
- MyBatis:Pagehelper分页
对于分页插件这里选择查询所有用户的信息,以列表返回 前端只需输入分页数的数据既可 service实现类也很方便,甚至我都开始有点喜欢上这种Example的SQL形式了. 最后页面调用url的json信 ...
- Netty 系列二(传输).
一.前言 上一篇文章我们提到 Netty 的核心组件是 Channel.回调.Future.ChannelHandler.EventLoop,这篇文章主要是对 Channel (Netty传入和传出数 ...