一直以来对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. cookies、sessionStorage和localStorage的区别

    cookies.sessionStorage和localStorage的区别 对比 特性 Cookie LocalStorage SessionStorage 数据的生命周期              ...

  2. redis之 主从复制和哨兵(一)

    一.Redis主从复制 主从复制:主节点负责写数据,从节点负责读数据,主节点定期把数据同步到从节点保证数据的一致性 1. 主从复制的相关操作 a,配置主从复制方式一.新增redis6380.conf, ...

  3. 分库分表之后分布式如何保证ID全局唯一性

    分库分表之后分布式如何保证ID全局唯一性 韩师学子--小倪 2018-07-21 23:35:38 8139 收藏 3分类专栏: Mysql版权                         分库分 ...

  4. B+树叶子节点数据如何存储,以及如何查找某一条数据

    MySQL索引背后的数据结构及算法原理 https://www.kancloud.cn/kancloud/theory-of-mysql-index  非常好 根据一条sql  如何查看索引结构等信息 ...

  5. zookeeper的通知机制

    一.znode Zookeeper维护一个类似文件系统的数据结构.简单来说,有点类似windows中注册表的结构,有名称,有树节点,有Key(键)/Value(值)对的关系,可以看做一个树形结构的数据 ...

  6. Java并发机制(3)--volatile关键字与内存模型

    Java并发编程:volatile关键字解析及内存模型 个人整理自:博客园-海子-http://www.cnblogs.com/dolphin0520/p/3920373.html 1.线程内存模型: ...

  7. 使用 rabbitmq 的场景?

    (1)服务间异步通信 (2)顺序消费 (3)定时任务 (4)请求削峰

  8. SpringBoot项目单元测试不经过过滤器问题

    SpringBoot使用MockMvc:https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-featu ...

  9. ssl免密登录(centos6)

    1.首先执行ll -a查看是否有隐藏文件.ssh,如果没有,需要执行ssh localhost登录以下即可 cd ~/.ssh 2.生成秘钥: 可查看https://hadoop.apache.org ...

  10. Thymeleaf+Spring使用自己的工具类

    第一种.提供思路,继承SpringStandardDialect,重写getExpressionObjectFactory方法,设置expressionObjectFactory的实际对象,并在Tem ...