服务器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服务器中 ...
随机推荐
- linux 命令 — tr
tr 对stdin字符进行替换.删除和压缩,基本形式 tr [options] set1 set2 将输入的字符串中的set1字符转换为set2中对应位置的字符 set1.set2表示字符集,如果se ...
- RabbitMQ系列(六)你不知道的RabbitMQ集群架构全解
前言 本文将系统的介绍一下RabbitMQ集群架构的特点.异常处理.搭建和使用中要注意的一些细节. 知识点 一.为什么使用集群? 二.集群的特点 三.集群异常处理 四.集群节点类型 五.集群搭建方法 ...
- spring学习(三) ———— spring事务操作
前面一篇博文讲解了什么是AOP.学会了写AOP的实现,但是并没有实际运用起来,这一篇博文就算是对AOP技术应用的进阶把,重点是事务的处理. --wh 一.jdbcTemplate 什么是JdbcTem ...
- Mybatis的原理相关
今天看了一篇有关Mybatis非常好的文章,顺便写了一下学习心得. 原文地址:https://blog.csdn.net/u010349169/article/details/40422941 一.M ...
- Perl一行式:处理行号和单词数
perl一行式程序系列文章:Perl一行式 所有行的行号 $ perl -pe '$_ = "$. $_"' file.log $ perl -ne 'print "$. ...
- Go基础系列:常量和变量
常量(Constants)和iota 常量包含不会发生更改的数据.常量的数据类型只能是boolean.number(int/float/complex)或string. 定义方式: const NAM ...
- 完美实现 Windows 下网络通信
编译环境:DEV C++ 配置编译器 Windows 下 实现 Socket 编译需要 ws2_32.lib 这个库的支撑,所以我们编译前应该配置下编译器,具体配置步骤如下: Tools -> ...
- 二叉树的Python实现
树的定义与基本术语 树型结构是一类重要的非线性数据结构,其中以树和二叉树最为常用,是以分支关系定义的层次结构.树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构:在计算机领域中也有广泛 ...
- [转]bitcoin: 通过 rpc 请求节点数据
本文转自:https://laravel-china.org/index.php/articles/8919/bitcoin-requests-node-data-through-rpc 文章来自本人 ...
- 使用PoolingHttpClientConnectionManager解决友盟(umeng)推送在多线程环境推送失败的问题
在友盟(umeng)提供的服务端推送的sdk中,使用的是apache提供的httpclient.在单线程化境下,httpclient工作没有问题.但是由于umeng的sdk中并未考虑并发的情况,因此很 ...