网络问题导致的性能问题是十分难以诊断的,特别是因为网络丢包而导致的性能问题,因为甚至你都看不到有任何错误产生。在这种案例下,通过netstat -s看到的统计数据中,TCP/UDP均没有报错。只是在一些地方看到了网卡存在包丢弃现象,比如:网络包DRP的问题在NIC物理网卡和网卡驱动层之间发生的,存在dropped包的时候有可能你的网卡并没有出现任何error,就像上面的那个例子一样。为什么会这样呢?借用一张美团的同行画的图来说明一下:

DRP最容易发生的位置就在这张图上,当网络包到达的时候,首先会在内存中分配sk_buffer(SKB),然后把SKB的句柄写入RX ring buffer中(RX ring是一个环状缓冲),然后告知NIC已经准备完毕,NIC可以向驱动发送网络包了。第四步,NIC通过DMA FETCH描述信息到RX RING,然后接收新包,并把包通过DMA写入SKB。在这个过程中如果出现RX RING写不下,就会丢弃一些包,这种情况fifo的计数就会增加。这一点可以从/proc/net/dev文件中看到:如果确实存在这种情况,那么就说明网络中断处理网络包的速度太慢,导致环状缓冲溢出丢弃部分来不及处理的网络包。这样的情况我们就需要分析CPU资源是否足够处理超大流量的网络包,或者是不是存在网络中断调度不合理,无法充分使用服务器CPU资源(在部分网卡驱动与OS版本兼容性不足,或者OS存在这方面的BUG的时候可能会出现这种情况,如果遇到这种情况,那么打补丁,更新网卡驱动或者调整中断相关参数等都可以解决问题)。不过我们并不是每次都能在这个文件中存在fifo计数器的数据,这种情况就更令人费解了。老白以前也遇到过类似问题,似乎问题在网络上,也发现了网络上大量的DRP包的计数,但是ERROR总是0,应用也没报错。直到有一次阅读了Peer Wisdom的文章《Large Send Offload and Network Performance》,才恍然大悟。这篇文章对这种情况中给出了很好的答案。LSO是Large Segment Offload的简称,中文名称叫大段卸载。当一个系统需要通过网络发送一大段数据时,计算机需要将这段数据拆分为多个长度较短的数据,以便这些数据能够通过网络中所有的网络设备(例如路由器、交换机),这个过程被称作分段。通常,这个过程由计算机系统中的协议栈完成,而大段卸载技术将这一过程交给网卡处理,从而减少了CPU使用率。在CPU资源不足的时代,LSO能够很好的缓解服务器CPU的网络开销过大问题,不过在现实的环境中,经常会出现由于LSO而导致的网络性能下降问题。以下文字翻译自Peer Wisdon的文章:要了解LSO为什么这会如此严重地影响网络性能,让我们遵循一条典型的大型TCP消息,它在两个主机之间穿越网络。

  • 启用LSO后,服务器上的TCP / IP网络堆栈将生成一条大型TCP消息;

  • 服务器将大型TCP消息发送到以太网适配器,并由其LSO引擎对网络进行分段。因为LSO引擎无法发现交换机支持的MTU,所以它使用标准的默认值;

  • LSO引擎将组成大型TCP消息的每个帧段发送到交换机;

  • 交换机接收帧段,但是因为LSO发送的帧大于MTU,所以它们被默认为DRP;

  • 在等待接收TCP消息的服务器上,如果没有收到数据,将会超时,并且它将发回重新发送数据的请求;

  • 发送服务器接收重传请求并重建TCP消息。因为这是重传请求,所以服务器不会将TCP消息发送到要分段的以太网适配器。相反,它会自行处理细分过程。这似乎是为了克服适配器上卸载硬件引起的故障而设计的;

  • 交换机从服务器接收适当大小的重传帧,因为服务器能够发现MTU,然后将其转发到路由器;

  • 另一个服务器最终完整接收TCP消息。

基本上,这可以总结为卸载数据,分段传输数据,丢弃数据,等待超时,请求重传,段重传数据,重发数据。下次发送大型TCP消息时,将重复整个过程。因此,这是否会引起严重的网络性能问题也就不足为奇了。从上面的论述可以看出LSO导致的DRP在应用层并不会出现错误,也不会体现为网络真正的包错误,但是LSO导致的DRP还是有害的,被DRP的网络包要等到对端超时重发,这样会引起相关的网络性能问题,特别是在高负载的网络中,问题可能被放大。在一个复杂的网络环境中,网络设备数量众多,MTU的设置也可能存在不同,网卡开启LSO的缺点有两种,一是在网络负载较高的时候处理能力不足,从而导致网络性能下降;第二种就是类似今天的案例,因为LSO导致DRP引起性能问题。因此我们需要根据实际情况来确定是否启用LSO功能。我们可以通过tcpdump来验证是否系统中存在一些大包:tcpdump -v -c 10 -ni enp26s0f0 -ttt greater 1532

从上面那个例子看,系统中也确实是存在一些大包的,于是我们可以尝试用ethtool -K关闭LSO:

奇迹发生了,关闭LSO后,DRP的数字不再增加了。应用的性能也似乎好了不少。随着云时代的到来,网络问题可能会是运维人员遇到的比数据库问题更为常见,并且更为棘手的问题。DBA们是不是也该学两招网络诊断的技巧了呢?

cv::imread导致段错误_网络诊断举例LSO导致的网络性能问题相关推荐

  1. java 主动抛出 段错误_段错误产生的原因~

    原文:https://blog.csdn.net/qq_29350001/article/details/53780697 一.什么是段错误? 一旦一个程序发生了越界访问,cpu 就会产生相应的保护, ...

  2. 未分配内存的指针导致段错误

    一个最简单的队列初始化操作案例: 编译可以通过:但是运行程序时,会出现段错误:Segmentation fault 分析:主函数中声明了队列的一个指针(只是声明,并未实际分配地址空间),调用初始化函数 ...

  3. c printf 段错误_错误:预期声明在C中的printf之前指定

    c printf 段错误 The main cause of this error is - missing opening curly brace ({), before the printf() ...

  4. 网络诊断dns服务器未响应,网络诊断提示DNS服务器未响应解决方法

    DNS服务器未响应是什么意思 DNS服务器是计算机域名系统(DomainNameService)的缩写,它是由域名解析器和域名服务器组成的.域名服务器是指保存有该网络中所有主机的域名和对应IP地址,并 ...

  5. 网络诊断“您可能需要与该网络的Internet服务提供商ISP签署协议才能获得访问Internet的权限

    问题描述: 当打开电脑,发现无法连接网络,使用windows的网络诊断,显示"您可能需要与该网络的Internet服务提供商ISP签署协议才能获得访问Internet的权限" 解决 ...

  6. java 主动抛出 段错误_分段错误的原因?

    我在C中为扫描程序编写了一些代码,但我一直收到分段错误 . 奇怪的是,分段错误发生在代码完成时 . 我认为它与我的扫描功能和 file.get() 的使用有关,但这不会导致代码的那一行出现分段错误吗? ...

  7. mysql_fetch_row ()出现段错误_段段天刀手游古董鉴定大全上线~最全古董鉴定攻略...

    段段天刀手游古董鉴定大全上线~最全古董鉴定攻略 目前共收录 49 个古董,全部712 条鉴宝信息.可以通过查询古董名称定位到该古董的全部鉴宝信息.每个古董存在三个鉴定位置,如果出现哪一条是在赝品描述列 ...

  8. mysql_fetch_row ()出现段错误_高能:燕郊出现虚假地铁站公示牌,很多人信以为真...

    今天早晨被微信消息吵醒,定睛一看,22号线地铁燕郊镇站公示牌赫然立起.随后朋友前往勘察,马路边围了不少人看热闹,位置在迎宾路二街村村口附近. 虚假公示牌中,有6个明显错误,用红色圈出来了,假到不能再假 ...

  9. python 段错误_在Python中导入模块时出现分段错误

    我有一个Python脚本,它使用自然语言日期解析器Natty.Natty本身是用Java编写的,但在Python中使用Jpype进行了包装.脚本在我的开发机器上运行得非常好,但是在生产机器上抛出了一个 ...

最新文章

  1. Caffe源码中syncedmem文件分析
  2. NBT-新年4篇35分文章聚焦宏基因组研究
  3. git cmd 命令在已有的仓库重新添加新的文件夹
  4. 【HTML】处理<br>换行符追加到前端换行无效的问题 --- html中渲染的字符串中包含HTML标签无效的处理方法,字符串中包含HTML标签被转义的问题 解决
  5. OpenEjb使用笔记--让Tomcat可以部署EJB
  6. 每个施加在HTML元素上的Angular Directive,运行时都会生成一个新的实例
  7. 【转】[技术回顾系列]--WebService事务处理
  8. DolphinPHP
  9. [BZOJ1877][SDOI2009]SuperGCD
  10. OpenSSL生成RSA公私钥(java)
  11. 蓝桥杯2017年第八届C/C++省赛B组第四题-方格分割
  12. creo怎么返回上一步_creo拔模怎么用?creo拔模操作技巧图文详解
  13. puzzle(102)数独
  14. 搭建vue脚手架(vue-cli)--基于vue2.0版本
  15. 第十次ccf 分蛋糕
  16. 微信PC端不显示头像和表情怎么解决
  17. 眼界、激情、感恩——一个GIS专业学生大学四年总结,软件大赛、考研感想
  18. 小程序后台数据交互-个人中心
  19. React+SSM+阿里云部署(JDK, MySQL8, Tomcat)
  20. 先验后验与贝叶斯定理

热门文章

  1. python数组加入新元素_Python之list添加新元素、删除元素、替换元素
  2. Linux给用户设置全局变量
  3. 化工原理少学时答案解析_化工原理 少学时 思考题答案
  4. 网站运维技术与实践之服务器监测常用命令
  5. PHP递归复制文件夹的类
  6. stm8s003程序跑飞_微信小程序只玩跳一跳?OUT啦!带你玩更好玩的微信小游戏!...
  7. 计算机动漫设计VR主要学什么,动漫设计专业学什么 要学什么软件
  8. python自动化框架2019_《一头扎进》系列之Python+Selenium自动化测试框架实战篇6 - 价值好几K的框架,呦!这个框架还真牛叉哦!!!...
  9. 如何在树莓派上进行python编程_《树莓派Python编程指南》怎么样_目录_pdf在线阅读 - 课课家教育...
  10. 【uni-app】自定义导航栏/标题栏