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发包速率慢一点,解决以上问题。 如果打印的信息中 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_pressuremin_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源码开发部署交付技术文档包含 五。 开发代码展示: 一、 抖…...
 
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
 
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
 
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
 
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
 
淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...
 
HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...
