Hi3536网络应用调优
目录
1. 为什么UDP接收或发送会丢包?
2. 使用 socket 接口时,如何正确工作在非阻塞模式下?
3. TOE 使能及使用注意事项
4. TOE 模式下使用 socket 接口时的注意事项
1. 为什么UDP接收或发送会丢包?
- 用户态应用程序在接收 UDP 数据时(单播或组播报文),同时进行其它有延时的操作(如写码流数据到 USB 存储设备),应该程序将延迟接收 UDP 数据包,而 socket 默认接收缓存只有108544Byte,这样可能会使 socket 接收缓存满,无法接收新的 UDP 数据包,出现丢包现象。可在内核下通过执行下面命令进行确认:
cat /proc/net/snmp | grep Udp
如果 RcvbufErrors 字段增加较多,说明确实是 socket 接收缓存满导致的丢包。以下命令可以增加接收缓冲区大小(设置为 20,000,000 字节 (即 20 MB)),解决以上问题。
echo 20000000 > /proc/sys/net/core/rmem_max echo 20000000 > /proc/sys/net/core/rmem_default echo 20000000 > /proc/sys/net/core/netdev_max_backlog
这样做的目的是提高网络传输性能,特别是在处理大量数据流时。这种改动,需要根据实际码流发送速度和接收程序的延时进行参数调优。
- UDP 发送可能会丢包,一种原因是 CPU 发送 UDP 报文的速率超过了网卡 MAC 的发包速率,导致网卡MAC的发送缓冲队列满,引起了丢包。可以在内核下通过执行下面命令进行确认:
ifconfig eth0
如果打印的信息中 TX dropped 和 overruns 值基本相等,都增加较多,说明是网络MAC的发送缓冲队列满导致的丢包。以下命令可以减小发送缓冲区,让CPU发包速率慢一点,解决以上问题。
echo 20000 > /proc/sys/net/core/wmem_max echo 20000 > /proc/sys/net/core/wmem_default
这种改动,需要根据码流发送速率和丢包率的要求进行参数调优。
2. 使用 socket 接口时,如何正确工作在非阻塞模式下?
在网络编程中对于一个网络句柄会遇到阻塞IO 和非阻塞IO 的概念, 这里对于这两种 socket 先做一下说明:
阻塞IO:socket 的阻塞模式意味着必须要做完IO 操作(包括错误)才会返回。
非阻塞IO:非阻塞模式下无论操作是否完成都会立刻返回,需要通过其他方式来判断具体操作是否成功。
对于一个 socket 是阻塞模式还是非阻塞模式有两种方式来处理:
- 方法1:fcntl 设置;用 F_GETFL 获取 flags,用 F_SETFL 设置 flags | O_NONBLOCK; fcntl 函数可以将一个 socket 句柄设置成非阻塞模式:
flags = fcntl(sockfd, F_GETFL, 0); //获取文件的flags值 fcntl(sockfd, F_SETFL, flags | O_NONBLOCK); //设置成非阻塞模式
设置之后每次对于 sockfd 的操作都是非阻塞的。
flags = fcntl(sockfd, F_GETFL, 0); //获取文件的flags值 fcntl(sockfd, F_SETFL, flags & ~O_NONBLOCK); //设置成阻塞模式
设置之后每次对于sockfd 的操作都是阻塞的。
- 方法2:recv、send 系列的参数 (读取、发送时,临时将 sockfd 或 filefd 设置为非阻塞)。 recv、send 函数的最后有一个 flag 参数可以设置成 MSG_DONTWAIT,临时将 sockfd 设置为非阻塞模式,而无论原有是阻塞还是非阻塞。
recv(sockfd, buff, buff_size, MSG_DONTWAIT); //非阻塞模式的消息发送 send(scokfd, buff, buff_size, MSG_DONTWAIT); //非阻塞模式的消息接受
3. TOE 使能及使用注意事项
TOE 模块(TCP Offload Engine,TCP 卸载引擎) 同时实现两个网络接口数据的接收和发送,可以工作在 10/100/1000Mbit/s 模式下,支持半双工和全双工工作模式,提供 MII、RMII 和 RGMII 接口。TOE 模块能够通过硬件部分实现 TCP/IP 加速处理的功能,不但能够提升网络接口的吞吐量,还可以显著的降低 CPU 占用率。
- Hi3536 网口默认使用的是 bypass 功能,使能 TOE 功能只需要如下操作即可:
修改文件系统的 /etc/init.d/S81toe 启动脚本:
将 insmod /hitoe/stmmac.ko 注释掉;
再将下列三句话使能,打开 TOE 功能:
echo 8192 > /proc/sys/vm/min_free_kbytes echo 200 > /proc/sys/vm/vfs_cache_pressure insmod /hitoe/stmmac.ko hitoe=1
由于这里保留空间增大了,相应的 bootargs 中 MEM 的配置也要相应的增大,否则会出现内存不够用的情况。
- Hi3536 GMAC 每次使用 TOE 发送数据时,需要大块连续的物理内存,但是内核中大块连续内存的数量非常少。因此在使用前需要做如下处理,确保能够分配到足够多的物理内存。下述处理只是简单的举例,具体的数值需要根据业务场景使用的连接数来决定。
echo 8192 > /proc/sys/vm/min_free_kbytes echo 200 > /proc/sys/vm/vfs_cache_pressure
min_free_kbytes 表示最小保留内存的大小,缺省值为 8192,vfs_cache_pressure 表示设置了虚拟内存回收 directory 和 i-node 缓冲的倾向,缺省值为 100,推荐设置为 200,因为该参数的值越大,回收的倾向越严重。这样 TOE 就会有更多的物理内存使用。Hi3536 ETH 使用时如果网口出现内存分配不足的情况下可以在 shell 下进行如下设置(增大最小保留内存):
echo 16384 > /proc/sys/vm/min_free_kbyte
- TOE 不支持选择性重传功能,而内核默认打开了网络模块的选择性重传,为了 Hi3536 在 TOE 模式下能与对端设备协商一致,需要关闭选择性重传:
echo 0 > /proc/sys/net/ipv4/tcp_sack
- TOE 接收描述子个数可以配置,默认 4096,消耗 8MB 内存(每个描述子 2K)。补充说明:个数可以根据内存大小或应用场景配置。CPU 压力越大,网络压力越大,则配置描述子大可以提高性能,其他情况下可以减少配置,一般简单场景 256 即可,可以节省内存,配置范围 256~8192。配置方法举例:
insmod stmmac.ko hitoe=1 tnk_rx_fifo=4096
- 增加 socket 选项,可以通过 setsocketopt 来实现某个 socket 是否使用 TOE 功能,目前默认每个 socket 都使能 TOE。实现方法:在具体的业务 socket 层代码中定义如下宏:
#define SO_TOE_ENABLE 76
在创建 socket 连接的代码实现中添加 TOE 使能开关:
int val = 0; /* DISABLE TOE : val = 0 ENABLE TOE: val = 1*/ int len = sizeof(int); setsockopt(sockfd, SOL_SOCKET, SO_TOE_ENABLE, &val, len);
-
增加 socket 选项,可以通过 getsockopt 来获取某个 socket 是否处于 tcp 连接加速状态。实现方法:在具体的业务 socket 层代码中定义如下宏:
#define SO_TOE_STATE 77
当用户创建并使用 socket 后,用户可以通过如下代码在任意时刻获取 tcp 连接的加速状态:
int val; int len = sizeof(int); getsockopt(sockfd, SOL_SOCKET, SO_TOE_STATE, &val, &len);
如果返回的 val 值为 1,说明 tcp 连接处于加速状态,如果返回的 val 值为 0,说明 tcp 连接处于非加速状态。
- 增加对所有连接默认是否开启 TOE 加速的支持。如果用户希望默认所有连接不开启 TOE 加速,仅当主动通过 setsockopt 设置某条连接开启 TOE 时,这条连接才开启 TOE 加速特性,那么用户可通过内核文件系统 /proc 下的参数来进行设置。其中,/proc/sys/tnk/tnk_tcp_gmac0_enable 是网口 0 口的 TOE 使能开关,/proc/sys/tnk/tnk_tcp_gmac1_enable 是网口 1 口的 TOE 使能开关,向该 proc 节点写 1 表示所有连接默认开启 TOE 加速,写 0 表示所有连接默认不开启 TOE 加速。如果用户希望网口 0 默认所有连接不开启 TOE 加速,使用命令如下:
echo 0 >/proc/sys/tnk/tnk_tcp_gmac0_enable
这样,网口 0 所有连接默认都不会开启 TOE 加速,客户可以通过 setsockopt 来使能某条 socket 进入 TOE 加速。
4. TOE 模式下使用 socket 接口时的注意事项
- 在 TOE 模式下,不管是阻塞模式还是非阻塞模式,协议处理是由硬件完成的,当出现内核 buffer满时,都会给上层应用返回 EAGAIN,而在 Bypass 模式下,如果是阻塞模式,则出现内核 buffer 满时,不会返回 EAGAIN,而阻塞继续发送!
- 另外经过查询得知 send 的返回值是这样处理的:阻塞模式与非阻塞模式下,send 返回值 < 0 && (errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN) 表示暂时发送失败,需要重试,如果 send 返回值 <= 0, && errno != EINTR && errno != EWOULDBLOCK && errno != EAGAIN 时,连接异常,才需要关闭。
- 因此,建议应用程序在调用 send 时,若返回值 < 0 && (errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN) 应该延时等待一段时间再重新尝试发送,而不要直接调用 close 断开连接,则不会出现此问题。
相关文章:

Hi3536网络应用调优
目录 1. 为什么UDP接收或发送会丢包? 2. 使用 socket 接口时,如何正确工作在非阻塞模式下? 3. TOE 使能及使用注意事项 4. TOE 模式下使用 socket 接口时的注意事项 1. 为什么UDP接收或发送会丢包? 用户态应用程序在接收 UDP 数据时࿰…...

spring拦截器 与统一格式
目录 前言模拟拦截器拦截器的实现原理什么是动态代理? 什么是静态代理静态代理与动态代理的区别两种常用的动态代理方式基于接口的动态代理基于类的动态代理 JDK Proxy 与 CGlib的区别 其他 统⼀访问前缀添加统⼀异常处理统⼀数据返回格式 前言 之前博客讲述了 , 关于SpringA…...

leetcode 122. 买卖股票的最佳时机 II
2023.7.29 把整体利润拆分成每天的利润,将股票值想象成一个折线图,将所有上升的值相加即可。 代码: class Solution { public:int maxProfit(vector<int>& prices) {int ans 0;for(int i1; i<prices.size(); i){if(prices[i]-…...
代理模式:控制访问的设计模式
代理模式:控制访问的设计模式 什么是代理模式? 代理模式是一种常见的设计模式,它允许通过代理对象来控制对真实对象的访问。代理模式的主要目的是在不改变原始对象的情况下,提供额外的功能或控制访问。 为什么要使用代理模式&a…...
2020/7/30
Educational Codeforces Round 143 (Rated for Div. 2)\C_Tea_Tasting.cpp //题意:有n种茶,n个人,第i种茶有 a[i]的量,第i个人一次能喝 b[i], 第i个人从第i种茶开始往前喝,求每个人最多能喝多少茶。 //思路ÿ…...

图形编辑器开发:是否要像 Figma 一样上 wasm
大家好,我是前端西瓜哥。 wasm 拿来做 Web 端的图形编辑器貌似是不错的选择。 因为图形处理会有相当多无法利用到 WebGL GPU 加速的 CPU 密集的计算。比如对一条复杂贝塞尔曲线进行三角化,对多个图形进行复杂图形的布尔运算。 图形编辑器性能天花板 F…...

Linux学成之路(基础篇0(二十三)MySQL服务(主从MySQL服务和读写分离——补充)
目录 一、MySQL Replication概述 优点 异步复制(Asynchronous repication) 全同步复制(Fully synchronous replication) 半同步复制(Semisynchronous replication) 三、MySQL支持的复制 四、部署主从…...

spring启动流程 (6完结) springmvc启动流程
SpringMVC的启动入口在SpringServletContainerInitializer类,它是ServletContainerInitializer实现类(Servlet3.0新特性)。在实现方法中使用WebApplicationInitializer创建ApplicationContext、创建注册DispatcherServlet、初始化ApplicationContext等。 SpringMVC…...

设计模式-中介者模式在Java中使用示例-客户信息管理
场景 欲开发客户信息管理窗口界面,界面组件之间存在较为复杂的交互关系:如果删除一个客户, 要在客户列表(List)中删掉对应的项,客户选择组合框(ComboBox)中客户名称也将减少一个; 如果增加一个客户信息,…...
14443-1-doc
介绍 ISO/IEC 14443 是描述 ISO/IEC 7810 中定义的身份证参数以及此类卡在国际交换中的使用的一系列国际标准之一。 ISO/IEC 14443 的这一部分描述了感应卡的物理特性。 ISO/IEC 14443 的这一部分并不排除在卡上纳入其他标准技术,例如资料性附录 A 中引用的技术。非…...

SpringBoot的三层架构以及IOCDI
目录 一、IOC&DI入门 二、三层架构 数据库访问层 业务逻辑层 控制层 一、IOC&DI入门 在软件开发中,IOC(Inversion of Control)和DI(Dependency Injection)是密切相关的概念。 IOC(控制反转&a…...

RabbitMQ部署指南
RabbitMQ部署指南 1.单机部署 我们在Centos7虚拟机中使用Docker来安装。 1.1.下载镜像 方式一:在线拉取 docker pull rabbitmq:3-management方式二:从本地加载 已经提供了镜像包: 上传到虚拟机中后,使用命令加载镜像即可&…...

【Golang】Golang进阶系列教程--Go 语言切片是如何扩容的?
文章目录 前言声明和初始化扩容时机源码分析go1.17go1.18内存对齐 总结 前言 在 Go 语言中,有一个很常用的数据结构,那就是切片(Slice)。 切片是一个拥有相同类型元素的可变长度的序列,它是基于数组类型做的一层封装…...

【数据结构】顺序表(SeqList)(增、删、查、改)详解
一、顺序表的概念和结构 1、顺序表的概念: 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。 2、顺序表的结构: (1)静态顺序表:使…...

[golang gin框架] 42.Gin商城项目-微服务实战之后台Rbac微服务角色增删改查微服务
一.重构后台Rbac用户登录微服务功能 上一节讲解了后台Rbac微服务用户登录功能以及Gorm数据库配置单独抽离,Consul配置单独抽离,这一节讲解后台Rbac微服务角色增删改查微服务功能,Rbac微服务角色增删改查微服务和后台Rbac用户登录微服务是属于…...

项目篇:Echo论坛系统项目
一、登录注册模块 1、注册功能 1.1、注册流程图 1.2、注册代码 /*** 用户注册* param user* return Map<String, Object> 返回错误提示消息,如果返回的 map 为空,则说明注册成功*/public Map<String, Object> register(User user) {Map&l…...

数据可视化(2)
1.柱状图 #柱状图 #bar(x,height,width,*,aligncenter,**kwargs) #height柱子的高度,即y轴上的数据 #width数组的宽度,默认值0.8 #*表示后面的参数为匿名关键字,必须传入参数 #kwargs关键字参数x[1,2,3,4,5] height[random.randint(10,100)f…...

MD-MTSP:斑马优化算法ZOA求解多仓库多旅行商问题MATLAB(可更改数据集,旅行商的数量和起点)
一、斑马优化算法ZOA 斑马优化算法(Zebra Optimization Algorithm,ZOA)Eva Trojovsk等人于2022年提出,其模拟斑马的觅食和对捕食者攻击的防御行为。斑马优化算法(Zebra Optimization Algorithm,ZOA&#x…...

【笔试强训选择题】Day32.习题(错题)解析
作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:笔试强训选择题 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!! 文章目录 前言 一、Da…...

抖音seo账号矩阵系统源码如何开发布局?
目录 一、 抖音SEO账号矩阵系统源码的开发布局步骤如下: 二。 开发部署源码 三、 开发部署功能设计 1. 短视频AI智能创作 2. 托管式账号管理: 3. 数据分析 4. 智能营销获客 四。 抖音seo源码开发部署交付技术文档包含 五。 开发代码展示: 一、 抖…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...

优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...