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

案例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繁忙或内存压力引起网络掉包的浅析与总结的更多相关文章

  1. 查看Linux服务器CPU使用率、内存使用率、磁盘空间占用率、负载情况

    [root@server script]# vi monitor.py #!/usr/bin/env python # -*- coding:utf-8 -*- #Author: nulige imp ...

  2. Linux服务器CPU、内存、磁盘空间、负载情况查看python脚本

    [本文出自天外归云的博客园] 网上搜,东拼西凑,组装了一个可以查Linux服务器CPU使用率.内存使用率.磁盘空间占用率.负载情况的python脚本. 脚本内容如下: # -*- coding:utf ...

  3. [转]检测SQLSERVER数据库CPU瓶颈及内存瓶颈

    在任务管理器中看到sql server 2000进程的内存占用,而在sql server 2005中,不能在任务管理器中查看sql server 2005进程的内存占用,要用 以下语句查看sql se ...

  4. [故障公告] 13:52-14:03,访问量突增,博客web服务器CPU 100%

    13:52-14:03,由于访问量突增,博客web服务器全线CPU 100%,造成博客站点不正常访问,由此给您带来麻烦,请您谅解. 为了迎接访问量的增长给web服务器CPU带来的巨大压力,上周我们已经 ...

  5. [No0000112]ComputerInfo,C#获取计算机信息(cpu使用率,内存占用率,硬盘,网络信息)

    github地址:https://github.com/charygao/SmsComputerMonitor 软件用于实时监控当前系统资源等情况,并调用接口,当资源被超额占用时,发送警报到个人手机: ...

  6. Python获取CPU、内存使用率以及网络使用状态代码

    Python获取CPU.内存使用率以及网络使用状态代码_python_脚本之家 http://www.jb51.net/article/134714.htm

  7. 阿里云ECS服务器,修改实例密码,查看CPU核数,内存,阿里云服务器关机了怎么办?

    新买的ECS服务器是没有密码的,需要重置密码(root,P@ssw0rd),并重启: 查看CPU核数和内存: 阿里云服务器关机了,不用怕,登录阿里云,可以启动和关闭

  8. linux下实现CPU使用率和内存使用率获取方法

    想获取一下目标机运行时linux系统的硬件占用情况,写了这几个小程序,以后直接用了. 方法就是读取proc下的文件来获取了. cpu使用率:    /proc/stat ,内存使用情况:     /p ...

  9. Sql Server 内存相关计数器以及内存压力诊断

    在数据库服务器中,内存是数据库对外提供服务最重要的资源之一, 不仅仅是Sql Server,包括其他数据库,比如Oracle,MySQL等,都是一类非常喜欢内存的应用. 在Sql Server服务器中 ...

随机推荐

  1. Apache Pulsar简介

    Apache Pulsar What is Pulsar "Pulsar is a distributed pub-sub messaging platform with a very fl ...

  2. Java-jsoup-解析HTML

    /**  * jsoup 是一款 Java 的HTML 解析器,可直接解析某个URL地址.HTML文本内容.它提供了一套非常省力的API,可通过DOM,CSS以及类似于JQuery的操作方法来取出和操 ...

  3. Java实现敏感词过滤 - IKAnalyzer中文分词工具

    IKAnalyzer 是一个开源的,基于java语言开发的轻量级的中文分词工具包. 官网: https://code.google.com/archive/p/ik-analyzer/ 本用例借助 I ...

  4. 使用docker部署flask遇到的问题

    容器内能访问,但是外网映射了端口怎么也访问不了 解决方法: app.run() 添加参数host='0.0.0.0'

  5. More Effective C# 【前戏】

    买了很多很多书,想到就买,觉得有需要就买.买书的情况是不一样的:有时候,买的时候还是比较空,买来之后工作开始忙起来了,就没怎么看:有时候,买的时候比较忙,忙的乱了方寸,觉得有必要找本书来静心一下.不过 ...

  6. 从a文件判断是否删除b文件中的行(sed示例)

    bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html test.xml文件很大,内容结构如下: <?xml v ...

  7. sharding:谁都能读懂的分库、分表、分区

    本文通过大量图片来分析和描述分库.分表以及数据库分区是怎样进行的. 1.sharding前的初始数据分布 在本文中,我打算用高考考生相关信息作为实验数据.请无视表的字段是否符合现实,也请无视表的设计是 ...

  8. mybatis-generator插件执行报错:Cannot resolve classpath entry

    记录一个小问题 使用了mybatis-generator插件自动生成实体类,DAO,Mapper,在执行时报错.报错信息如下 Failed to execute goal org.mybatis.ge ...

  9. npm install 失败

    总结列表: 1. There is already an open DataReader associated with this Connection which must be closed fi ...

  10. C# Parallel用法

    1.Parallel.Invoke 主要用于任务的并行 这个函数的功能和Task有些相似,就是并发执行一系列任务,然后等待所有完成.和Task比起来,省略了Task.WaitAll这一步,自然也缺少了 ...