一直以来对Linux网络这块都感觉比较乱

遇到一个UDP丢包的问题:在测试中,一台VM虚拟机,CPU利用率55%左右,内存利用率7%左右,网卡流量也远没到限制的时候出现了丢包情况

使用netstat -su|grep "packet receive errors"|awk '{print $1}'  ,每30s查看一次,计算这次和上次之间的数值差值发现存在UDP丢包现象。

首先要看问题出现在哪儿,网络流量的路径是怎样的?

1、网络流量通过有线/无线发送到网卡

2、网卡驱动读取报文放到ring buffer(此时调用DMA,不经过CPU)

3、内核从ring buffer中读取报文进行处理,执行IP层,TCP/UDP层逻辑

4、把报文发到用户态的socket buffer中,应用程序读取socket buffer并进行处理

可能出现问题的阶段:1、网卡处理时丢包   2、内核处理时丢包   3、应用程序处理时

1、网卡阶段:

两种方法:1.  ifconfig 查看RX errors dropped

                  2.  ethtool -S eth0 |egrep "err|drop"

如果存在丢包,可以查看网卡的ring buffer size是否设置太小达到瓶颈,使用ethtool -g eth0查看最大值和当前值,使用ethtool -G eth0 rx 1024  进行修改

如果网卡方面没问题,那么尝试内核方面查看

2、内核阶段

linux 系统在接收报文之后,会把报文保存到缓存区中。因为缓存区的大小是有限的,如果出现 UDP 报文过大(超过缓存区大小或者 MTU 大小)、接收到报文的速率太快,都可能导致 linux 因为缓存满而直接丢包的情况。

使用sysctl -a |grep net.core  查看相关参数设置

重点看这几个参数:

/proc/sys/net/core/rmem_max:允许设置的 receive buffer 最大值

/proc/sys/net/core/rmem_default:默认使用的 receive buffer 值

/proc/sys/net/core/wmem_max:允许设置的 send buffer 最大值

/proc/sys/net/core/wmem_dafault:默认使用的 send buffer 最大值

但是这些初始值并不是为了应对大流量的 UDP 报文,如果应用程序接收和发送 UDP 报文非常多,把这个值调大。

如果发现某些参数设置不合理需要修改的话:

方法一:使用 sysctl 命令让它立即生效

接收最大值设置 sysctl -w net.core.rmem_max=56214400 # 设置为 50M

接收默认值设置 sysctl -w net.core.rmem_default=26214400 # 设置为 25M

发送最大值 sysctl -w net.core.wmem_max=26214400 # 设置为 25M

发送默认值 sysctl -w net.core.wmem_default=26214400 # 设置为 25M

方法二:修改对应路径文件的参数或者修改 /etc/sysctl.conf 中对应的参数在下次启动时让参数保持生效(sysctl -p  生效)

3、应用阶段

系统的 UDP buffer size,调节的 sysctl 参数只是系统允许的最大值,每个应用程序在创建 socket 时需要设置自己 socket buffer size 的值。linux 系统会把接受到的报文放到 socket 的 buffer 中,应用程序从 buffer 中不断地读取报文。

另外一个因素是应用读取 buffer 中报文的速度,对于应用程序来说,处理报文应该采取异步的方式。

其他可能原因:

防火墙systemctl status firewalld,或者依赖iptables阻断了部分流量?

要处理的实际业务中,每一个连接会占用一个句柄,测试有反馈有"Too many open files"的错误。这可能导致数据丢失而没有正确执行实际业务。

陆续学习和更新

参考链接(如有侵权请联系删除):https://blog.csdn.net/weixin_40754332/article/details/106924810

此外补充下小工具的使用

netstat   主要是用于列出系统上所有的网络套接字连接情况,包括 tcp, udp 以及 unix 套接字,另外它还能列出处于监听状态(即等待接入请求)的套接字。

-a      显示所有连接

-t      TCP连接

-u      UDP连接

-l       列出所有处于监听状态的 Sockets

-s      显示所有端口的统计信息,可配合-u/-t使用

Recv-Q表示收到的数据已经在本地接收缓冲,但是还有多少没有被进程取走

send-Q表示本地待发送的数据

这两个值通常应该为0,如果不为0可能是有问题的。packets在两个队列里都不应该有堆积状态。可接受短暂的非0情况。

参考链接:https://blog.csdn.net/wangquan1992/article/details/109508822

ethtool

ethtool eth0       显示网卡状态等信息

Linux网络流量相关的更多相关文章

  1. linux网络流量实时监控工具之iptraf

    这个工具还是很强大 linux网络流量实时监控工具之iptraf [我的Linux,让Linux更易用]IPTraf是一个网络监控工具,功能比nload更强大,可以监控所有的流量,IP流量,按协议分的 ...

  2. Linux 网络流量实时监控工具之ntopng详解

    大纲一.前言二.ntopng 简介三.ntopng 功能说明 四.ntopng 安装详解五.ntopng 配置详解 六.ntopng 使用详解注,操作系统 CentOS 5.5 X86_64,软件版本 ...

  3. linux网络流量实时监控工具之iptraf 【个人比较喜欢用的流量监控软件】

    linux网络流量实时监控工具之iptraf IPTraf是一个网络监控工具,功能比nload更强大,可以监控所有的流量,IP流量,按协议分的流量,还可以设置过滤器等,如下图 对监控网络来说,这个更适 ...

  4. linux网络配置相关文件

    网络接口(interface)是网络硬件设备在操作系统中的表示方法,比如网卡在Linux操作系统中用ethX,是由0开始的正整数,比如eth0.eth1...... ethX.而普通猫和ADSL的接口 ...

  5. Linux网络流量实时监控ifstat iftop命令详解

    ifstat 介绍 ifstat工具是个网络接口监测工具,比较简单看网络流量 实例 默认使用 #ifstat        eth0                eth1       KB /s i ...

  6. linux网络配置相关命令、虚拟网络接口eth0:0

    网络接口(interface)是网络硬件设备在操作系统中的表示方法,比如网卡在Linux操作系统中用ethX,是由0开始的正整数,比如eth0.eth1...... ethX.而普通猫和ADSL的接口 ...

  7. Linux网络流量实时监控ifstat iftop命令详解(转载)

    转自:http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858923.html ifstat 介绍 ifstat工具是个网络接口监测工具,比较简 ...

  8. Linux网络配置相关

    路由相关 #添加到主机的路由 route add -host 192.168.1.2 dev eth0 route add -host 192.168.1.2 gw 192.168.1.1 注1:添加 ...

  9. Linux网络流量监控与分析工具Ntopng

    Ntopng工具 Ntopng是一个功能强大的流量监控.端口监控.服务监控管理系统 能够实现高效地监控多台服务器网络 Ntopng功能介绍 Ntop提供了命令行界面和web界面两种工作方式,通过web ...

随机推荐

  1. 关于web以及浏览器处理预加载有哪些思考?

    图片等静态资源在使用之前就提前请求资源使用到的时候能从缓存中加载, 提升用户体验页面展示的依赖关系维护

  2. 什么是springcloud?springcloud断路器的作用是什么?springcloud的核心组件有什么?

    一.什么是springcloud 1.springcloud概述 Spring Cloud是一个微服务框架,相比Dubbo等RPC框架, Spring Cloud提供的全套的分布式系统解决方案. Sp ...

  3. 数组有没有length()方法?String有没有length()方法?

    数组没有length()方法,有length 的属性.String 有length()方法.JavaScript中,获得字符串的长度是通过length属性得到的,这一点容易和Java混淆.

  4. Semaphore 有什么作用 ?

    Semaphore 就是一个信号量,它的作用是限制某段代码块的并发数.Semaphore 有一个构造函数,可以传入一个 int 型整数 n,表示某段代码最多只有 n 个线程可 以访问,如果超出了 n, ...

  5. Formatter和IStandardConversionService的使用方式

    Thymeleaf 1.Formatter接口是当进行请求参数的封装时,会根据Formatter的泛型进行调用Parse方法进行格式化类型 2.IStandardConversionService是T ...

  6. centos 7环境下安装部署zookeeper

    近一直在看zookeeper的知识,有所收获,打算写些一些关于zookeeper的博客,也当做是自己的复习和笔记. 在上一篇 博客中简单地介绍了centos 7 下如何安装jdk,这一篇将介绍如何在c ...

  7. yum下载安装mysql服务

    1.下载mysql源码 wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm 2.安装mysql源 yum ...

  8. 错误问题之“Apache Log4j 漏洞,在版本为包含2.14以内!”

    漏洞概述 Apache Log4j是一个用于Java的日志记录库,其支持启动远程日志服务器. Log4j 1.2 中包含一个 SocketServer 类,该类容易受到不可信数据反序列化的影响,当侦听 ...

  9. 【静态页面架构】CSS之链接和图像

    CSS架构 一.链接: 链接元素:通过使用a元素的href属性设置跳转到指定页面地址 <style> a{ color: blue; text-decoration: none; } a: ...

  10. JavaScript 工作原理之七-Web Workers 分类及 5 个使用场景

    Web Workers 分类及 5 个使用场景 原文请查阅这里,略有删减,本文采用知识共享署名 4.0 国际许可协议共享,BY Troland. 这是 JavaScript 工作原理的第七章. 本系列 ...