网卡中的Ring buffer -- 解决 rx_resource_errors 丢包
1、软硬件环境
硬件: 飞腾E2000Q 平台
软件: linux 4.19.246
2、问题现象
网卡在高速收包的过程中,出现 rx error , 细查是 rx_resource_errors 如下:
root@E2000-Ubuntu:~# ifconfig eth1
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 10.100.1.2 netmask 255.255.255.0 broadcast 10.100.1.255inet6 fe80::5ed2:bff:fe13:817d prefixlen 64 scopeid 0x20<link>ether 5c:d2:0b:13:81:7d txqueuelen 1000 (Ethernet)RX packets 28043321 bytes 41384388153 (41.3 GB)RX errors 17434 dropped 0 overruns 1305 frame 16129TX packets 26633002 bytes 39782515051 (39.7 GB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0device interrupt 93 root@E2000-Ubuntu:~#
root@E2000-Ubuntu:~# ethtool -S eth1 | grep errortx_carrier_sense_errors: 0rx_frame_check_sequence_errors: 0rx_length_field_frame_errors: 0rx_symbol_errors: 0rx_alignment_errors: 0rx_resource_errors: 16129rx_ip_header_checksum_errors: 0rx_tcp_checksum_errors: 0rx_udp_checksum_errors: 0
问题复现过程如下:
Server端 (问题设备):
ifconfig eth3 192.168.1.11 netmask 255.255.255.0
iperf3 -s -B 192.168.1.11 -p 10002Client 端 (正常设备):
ifconfig eth3 192.168.1.10 netmask 255.255.255.0
iperf3 -c 192.168.1.11 -p 10002 -t500 -u -b 0
3、问题分析
rx error 有很多种类,具体ethtool 就列出了这几类,有些是硬件原因,有些是软件可调整的。
rx_frame_check_sequence_errors
rx_length_field_frame_errors
rx_symbol_errors
rx_alignment_errors
rx_resource_errors
rx_ip_header_checksum_errors
rx_tcp_checksum_errors
rx_udp_checksum_errors
MAC在收发包的同时,如果出现有CRC的错包,或者来不及缓存被溢出包,都会被统计到相应的寄存器中,这些数值一般都可以在MAC 的寄存器中读出的,以E2000Q为例
drivers/net/ethernet/phytium/macb.h
/* GEM register offsets. */
.......
#define GEM_RXUNDRCNT 0x0184 /* Undersize Frames Received Counter */
#define GEM_RXOVRCNT 0x0188 /* Oversize Frames Received Counter */
#define GEM_RXJABCNT 0x018c /* Jabbers Received Counter */
#define GEM_RXFCSCNT 0x0190 /* Frame Check Sequence Error Counter */
#define GEM_RXLENGTHCNT 0x0194 /* Length Field Error Counter */
#define GEM_RXSYMBCNT 0x0198 /* Symbol Error Counter */
#define GEM_RXALIGNCNT 0x019c /* Alignment Error Counter */
#define GEM_RXRESERRCNT 0x01a0 /* Receive Resource Error Counter */
#define GEM_RXORCNT 0x01a4 /* Receive Overrun Counter */
#define GEM_RXIPCCNT 0x01a8 /* IP header Checksum Error Counter */
#define GEM_RXTCPCCNT 0x01ac /* TCP Checksum Error Counter */
#define GEM_RXUDPCCNT 0x01b0 /* UDP Checksum Error Counter */.......
我们通过 ethtools -S eth1 查到我们具体错误的类型 Receive Resource Error,查了一下该寄存器的说明如下:
GEM: Receive Resource Error Counter
the register counting the number of frames that were successfully received by the MAC (correct address matched frame and adequate slot time) but could not be copied to memory because no receive buffer was available. This occurs when the GEM reads a buffer descriptor with its ownership (or used) bit set.
refer: rx_resource_errorshttps://docs.xilinx.com/r/en-US/ug1087-zynq-ultrascale-registers/rx_resource_errors-GEM-Register
看来是收包的时候 receive buffer不足造成的。那该如何调整接收buffer 呢?
看了 iperf3 的有个参数选项 可以调整
-l, --length #[KMG] length of buffer to read or write(default 128 KB for TCP, dynamic or 1460 for UDP)
加上参数 iperf3 -c 192.168.1.11 -p 10002 -t500 -u -b 0 -l 65500 同样存在问题, 看来不是应用层receive buffer的问题。
因为网卡在收包的时候,会涉及到多个buffer, 驱动层,应用层的,我们先来研究一下。
Receive ring buffers are shared between the device driver and network interface controller (NIC). The card assigns a transmit (TX) and receive (RX) ring buffer. As the name implies, the ring buffer is a circular buffer where an overflow overwrites existing data. There are two ways to move data from the NIC to the kernel, hardware interrupts and software interrupts, also called SoftIRQs.
The kernel uses the RX ring buffer to store incoming packets until they can be processed by the device driver. The device driver drains the RX ring, typically using SoftIRQs, which puts the incoming packets into a kernel data structure called an
sk_buff
orskb
to begin its journey through the kernel and up to the application which owns the relevant socket.The kernel uses the TX ring buffer to hold outgoing packets which are destined for the wire. These ring buffers reside at the bottom of the stack and are a crucial point at which packet drop can occur, which in turn will adversely affect network performance.
Increase the size of an Ethernet device’s ring buffers if the packet drop rate causes applications to report a loss of data, timeouts, or other issues.
refer: Chapter 32. Increasing the ring buffers to reduce a high packet drop rate Red Hat Enterprise Linux 9 | Red Hat Customer Portal
上述文章描述的意思大概就是内核会创建两个环形的缓冲区,RX/TX ring buffer , RX ring buffer的存在 就是当硬件中断来的时候,内核会先将数据放到一个叫 RX ring buffer的环形缓冲区,然后触发一个软中断,等待网卡驱动去消费 RX ring buffer的数据,因为是环形缓冲区,如果缓冲区太小,而收包的速度很快,就很容易溢出,导致丢包。
那问题可能就会在这里了。
4 完美解决
那应该如何设置 RX/TX ring buffer的大小呢?其实有两种方法,其中一种是通过ethtool ,一种是通过setsockopt(PACKET_RX_RING/PACKET_TX_RING)设置环形buffer参数。这里选择用ethtool , 首先我们看下我们的网卡支持的最大缓冲区是多少
root@E2000-Ubuntu:~# ethtool -g eth1
Ring parameters for eth1:
Pre-set maximums:
RX: 8192
RX Mini: 0
RX Jumbo: 0
TX: 4096
Current hardware settings:
RX: 512
RX Mini: 0
RX Jumbo: 0
TX: 512
Pre-set maximums 中的 RX/TX 值为该网卡的 Buffer size 最大值;
Current hardware settings 中 RX/TX 值代表该网卡当前的 Buffer size 大小。
所以,设置的 Current hardware settings 的 RX/TX 值必须在 Pre-set maximums 的限制之内
ethtool -G eth1 rx 4096 tx 512
设置之后,重新测试,问题完美解决!
5 拓展
注意:我们之前调整的 rmem_max 与 wmem_max 也是接收缓存区大小,当然这个缓冲区与Ring buffer 无关, rmem_max 与 wmem_max 只针对 TCP , 我们一般的查看或者调整方式如下:
root@E2000-Ubuntu:~# sysctl -a | grep rmem
net.core.rmem_default = 212992
net.core.rmem_max = 212992
net.ipv4.tcp_rmem = 4096 131072 6291456
net.ipv4.udp_rmem_min = 4096root@E2000-Ubuntu:~# sysctl -a | grep wmem
net.core.wmem_default = 212992
net.core.wmem_max = 212992
net.ipv4.tcp_wmem = 4096 16384 4194304
net.ipv4.udp_wmem_min = 4096root@E2000-Ubuntu:~# cat /proc/sys/net/core/wmem_max
212992
root@E2000-Ubuntu:~# cat /proc/sys/net/core/rmem_max
212992
root@E2000-Ubuntu:~# cat /proc/sys/net/core/rmem_default
212992setsockopt( sock, SOL_SOCKET, SO_RCVBUF,.....)
setsockopt( sock, SOL_SOCKET, SO_SNDBUF,.....)
上面主要针对 TCP 的接收和发送缓冲区,在收包时,都发生在网卡驱动从rx ring buffer
拿到数据之后,在发包时,发生在 tx ring buffer之前。
那具体 SO_RCVBUF 与 tcp_rmem 有什么关系呢?
tcp连接建立时,SO_RCVBUF初始化为tcp_rmem。随着tcp握手及通信,SO_RCVBUF是会动态调整的,调整的范围不受rmem_max限制,只受tcp_rmem的限制。但是如果手动通过setsockopt设置接收缓冲区大小,则自动调整接收缓冲区大小的机制失效,而且setsockopt是否成功会受到rmem_max的限制。
参考链接:https://www.jianshu.com/p/c93727fa8c2e
相关文章:
网卡中的Ring buffer -- 解决 rx_resource_errors 丢包
1、软硬件环境 硬件: 飞腾E2000Q 平台 软件: linux 4.19.246 2、问题现象 网卡在高速收包的过程中,出现 rx error , 细查是 rx_resource_errors 如下: rootE2000-Ubuntu:~# ifconfig eth1 eth1: flags4163<UP,BROADCAST,RU…...
六月九号补题日记:Codeforces Round 877 (Div. 2)
专注是不够的,很重要的一方面在于细节,关注细节:精细和专注才是成功的重点!!! A 题意:给你一堆数字,说这一堆数字是由最初的两个数字相减得到的,让你求出两个数字其中一…...
python基础选择题,高中适用
1. 下面哪个是 Python 的注释符号? A. // B. # C. /* D. ; 答案:B 2. 下面哪个是 Python 的赋值运算符? A. B. C. ! D. > 答案:A 3. 下面哪个是 Python 的逻辑运算符? A. && B. || C. ! D. & 答…...
Linux 面试题-(腾讯,百度,美团,滴滴)
Linux 面试题-(腾讯,百度,美团,滴滴) 分析日志t.log(访问量),将各个ip 地址截取,并统计出现次数,并按从大到小排序(腾讯) http://192.168.200.10/index1.html http://192.168.200.10/index2.html http://192.168.200.20/index1.html http://192.168.20…...
DDD--战略设计步骤
在领域驱动设计(Domain-Driven Design,DDD)中,战略设计是指在系统的整体层面上考虑领域模型的组织和架构。下面是一些战略设计的详细步骤: 确定限界上下文(Bounded Context):首先&a…...
Web Scoket简述
Web Socket 简介 初次接触 Web Socket 的人,我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处? 因为 HTTP 协议有一个缺陷:通信只能由客户端发起。http基于请求响应实现。 (准确来说HTTP…...
“Docker 技术在企业中的应用及挑战解决方案“
Docker 技术是一种基于容器化的应用部署和管理技术。随着云计算的普及和应用的不断增多,Docker 技术在企业中的应用越来越广泛。本文将介绍 Docker 技术的基本概念、优势和应用场景,并讨论如何在企业中应用 Docker 技术。 一、Docker 技术概述 Docker …...
vue中开发包、生产包、全局包的区别以及安装语法
目录 开发包 (devDependencies) 安装方法 生产包 (dependencies) 安装方法 全局包 (Global build) 安装方法 vue中有三种不同类型的包:开发包 (Development build),生产包 (Production build) 和全局包 (Global build)。下面我们分别解释它们的区别…...
list的模拟实现
前言 list是STL中重要的容器,了解它的原理对于我们掌握它是有很多的帮助的,一般list和vector都是一起来使用的,因为它们的优缺点不同,刚好可以互补。list的优点是任意位置的插入和删除都很快,它的缺点是不支持随机访问…...
ChatGLM简介和SSE聊天接口测试效果
开发公司 智谱AI是由清华大学计算机系技术成果转化而来的公司,致力于打造新一代认知智能通用模型。公司合作研发了双语千亿级超大规模预训练模型GLM-130B,并构建了高精度通用知识图谱,形成数据与知识双轮驱动的认知引擎,基于此模型…...
darknet yolo标注、训练详细说明
文章目录 1、标注数据1.1、标注1.2、生成训练列表文件train.txt1.3、转换数据标注格式 2、训练数据整理2.1、修改train.txt路径2.2、修改yolov3.cfg2.3、obj.name和obj.data2.4、训练脚本文件trian.sh2.5、测试脚本文件test.sh 3、训练 本文对应的脚本文件和程序下载链接 darke…...
chatgpt赋能python:Python如何产生随机整数?
Python如何产生随机整数? Python是一种高级编程语言。它允许程序员轻松地创建各种类型的应用程序,包括生成随机整数。本文将介绍如何在Python中使用内置的随机数函数来生成随机整数。 random模块 Python中的random模块提供了生成随机数的函数。这些函…...
大话Stable-Diffusion-Webui-客制化主题(四)
文章目录 目标效果开始重要说明单选框以及复选框图标样式更改gradio主题构建器上传主题方式代码上传主题方式目标 在DIY的主题中更改gradio单选框组件以及复选框组件的勾选后图标样式 效果 开始 笔者在使用gradio的主题构建器的过程中发现,gradio的复选框以及单选框组件勾选…...
Excel函数VLOOKUP常用方法
一、基础用法 1、精确匹配 公式:VLOOKUP(待匹配值,查找范围,范围列数,查找方式) 定义好要输出表的表头和第一列,第一列即为要查找和匹配的父内容,在第二列输入公式,被查找表中一定也要将待查…...
systemV的工作原理+原理代码
概念 我们知道进程间的通信有管道的方式进程通信管道制作_云的小站的博客-CSDN博客 但是我们的管道通信其实属于一种取巧的方式,利用了打开的文件可读写的特性上,两个进程对此分别进行读写操作就会产生所谓的通信现象,但是外面的管道依旧得…...
Kubeflow--TFJob实现机制学习
2023暑期学习 TF Job实际场景应用Vertex AI TF Job 链接 https://www.kubeflow.org/docs/components/training/tftraining/ https://developer.aliyun.com/article/601779 TFJob实际上遵循Kubernetes标准的API定义. TFJob 对象 apiVersion --> string --> api版本&…...
百度出品,Nature重磅 -- 优化的mRNA设计算法可改善mRNA的稳定性和免疫原性
摘要 尽管mRNA疫苗已用于COVID-19的预防,但仍然面临不稳定和易降解的风险,这是mRNA疫苗存储、配送、效价等面临的重要障碍。先前的研究已表明,增加二级结构可延长mRNA的半衰期,再加上选择优化的密码子,可改善蛋白表达。…...
CKA 01_docker部署Kubernetes 部署docker 使用kubeadm引导集群 安装Pod网络
文章目录 1. 虚拟机步骤2. Docker 部署 Kubernetes2.1 部署 docker2.1.1 环境要求2.1.2 安装 docker 引擎2.1.3 worker 节点对 master 节点免密2.1.4 设定 docker 开机自启2.1.5 打开桥接,查看桥接流量2.1.6 设定 systemd 方式管理 cgroup2.1.7 docker部署完成2.1.8…...
Redis的使用规范小建议
Redis 核心技术与实战 笔记 作者: 蒋德钧 毕竟,高性能和节省内存,是我们的两个目标,只有规范地使用Redis,才能真正实现这两个目标。如果说之前的内容教会了你怎么用,那么今天的内容,就是帮助你用…...
操作受限的线性表——栈
本文主要内容:本文主要讲解栈的基本概念、基本操作和栈的顺序、链式实现。 目录 栈一、栈的基本概念1、基本概念2、基本操作 二、栈的顺序存储结构1、顺序栈的实现2、顺序栈的基本运算1)初始化2)判栈空3)进栈4)出栈5&a…...
C++基类指针或引用指向或引用派生类对象(实现动态多态四种手段)父类指针访问子类成员变量(需要dynamic_cast)
文章目录 背景多态示例:父类指针指向子类对象父类指针指向子类对象,如何通过父类指针访问到子类特定的成员变量实现动态多态的四种手段:基类的指针或引用指向或引用一个派生类对象(new或不new) 背景 比如有父类Animal…...
WTM框架运行报错0308010C:digital envelope routines::unsupported
WTM框架运行报错0308010C:digital envelope routines::unsupported 错误描述报错原因解决方式 错误描述 我所使用WTM搭建的程序是选择的.net5.0Vue前后端分离的方式,项目结构选择的是“各层分离的多个项目”;本人并非初次使用WTM平台框架搭建项目&#…...
(二)CSharp-索引器
1、索引器定义 什么是索引器 索引器(indexer)是这样一种成员:它使对象能够用与数组相同的方式(即使用下标)进行索引 索引器的声明参见 C# 语言定义文档注意:没有静态索引器 索引器是一组 get 和 set 访问…...
配合AI刷leetcode 实现1170
题目如下: 1170. 比较字符串最小字母出现频次 难度中等 75 定义一个函数 f(s),统计 s 中(按字典序比较)最小字母的出现频次 ,其中 s 是一个非空字符串。 例如,若 s "dcce",那么…...
English Learning - L3 作业打卡 Lesson5 Day36 2023.6.9 周五
English Learning - L3 作业打卡 Lesson5 Day36 2023.6.9 周五 引言🍉句1: So next time you are on a train, look around and see what other people are reading, but dont jump to any conclusions.成分划分弱读连读爆破语调 🍉句2: You will probab…...
前端框架笔记
Vue.js的安装 安装Vue.js有两种方法: (1)类似于Bootstrap或jQuery,直接通过HTML文件中的标签引用。为了方便开发者使用,Vue.js提供了相关的CDN,通过如下代码可以引用最新版本的Vue.js: <sc…...
详细设计文档
1. 引言 1.1 目的 1.2 范围 1.3 定义、缩略语和缩写 1.4 参考文献 1.5 概述 2. 系统架构设计 2.1 总体架构 2.2 模块划分 2.3 数据流程设计 2.4 接口设计 3. 模块详细设计 3.1 登录模块详细设计 3.1.1 类设计 3.1.2 方法设计 3.1.3 数据库表设计 3.1.4 界面设计 3.2 文章管理模…...
Java011——Java数据类型转换(基本数据类型)
回顾:Java八大基本数据类型 大类 类型名称 关键字 占用内存 取值范围 --------------------------------------------------------------------------------------------|字节型 byte 1 字节 -128~127 整型 |短整型 short 2 字节 -32768~32…...
mybatis-plus用法(二)
(5条消息) mybatis-plus用法(一)_渣娃工程师的博客-CSDN博客 AR模式 ActiveRecord模式,通过操作实体对象,直接操作数据库表。与ORM有点类似。 示例如下 让实体类User继承自Model package com.example.mp.po; import com.bao…...
SQL笔记-存储过程+循环
存储过程循环使用方法 Oracle Oracle中存储过程的循环使用方法如下: DECLAREi NUMBER; BEGINi : 1;WHILE i < 10 LOOPDBMS_OUTPUT.PUT_LINE(i || i);i : i 1;END LOOP; END;其中,DECLARE用于声明变量,BEGIN和END用于标识存储过程的开始…...
合肥网站建设司图/seo推广培训班
Zabbix使用外部命令fping处理ICMP ping的请求,fping不包含在zabbix的发行版本中,需要额外去下载安装fping程序,安装完毕之后需要zabinx_server.conf中的参数FpingLocation配置fping安装的路径。 由于fping默认是root权限工作,而za…...
海口中小企业网站制作/公司网站如何建设
数据去重复,一直都是表亲们痛点、难点,甚至是痛不欲生。在以前的教程中,小编讲过用数据透视表、函数、sql、、pq、技巧法。传统的函数解决办法是:indexsmallrow,简称裹脚布函数,很多表亲都望而生畏。今天小…...
wordpress 餐饮 主题/搜索引擎广告案例
php保存二进制原始数据为图片的程序代码得到post过来的二进制原始数据,选择一个生成路径及图片的名字,之后写入,思路很显而易见//生成图片$imgDir uploadImg/;$filename"nissangcj".$mobile.".jpg";///要生成的图片名字…...
手机网站和微信网站的区别/河南推广网站
pandas的DataFrame与python的dict字典之间的相互转换 一、dict生成DataFrame 1、如果只有一个dict,即一行dataframe数据 复制代码 注:dict的形式必须是如下2种,不然会报错 1、dict外面加一层list【】 dict_a [{‘a’: 0, ‘b’: 1, ‘c’…...
铜煤建设网站/seo优化排名易下拉软件
虽然,SQL Server中的DTS也能将数据倒入Excel,但不如使用程序灵活, 本程序主要代码在按钮函数内。可适应于报表开发的读取数据部分:) 我删除了原程序的很多垃圾代码,只留主要起作用的代码 //加入名称空间 using System.Data; using System.Data.SqlClie…...
精简新闻网站开发/体育新闻最新消息
准备技术: WCF服务契约、数据契约等基础知识 Donet基本开发 内容概要: 三种实例激活类型 单调服务 会话服务 单例服务 实例类型 WCF支持三种实例类型:PerCall、PerSession、Single。PerCall就是单调服务会为每次客户端的请求去分配一个新的服…...